aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--advtrains/atc.lua44
-rw-r--r--advtrains/copytool.lua25
-rw-r--r--advtrains/couple.lua15
-rw-r--r--advtrains/craft_items.lua11
-rw-r--r--advtrains/formspec.lua5
-rw-r--r--advtrains/init.lua37
-rw-r--r--advtrains/misc_nodes.lua11
-rw-r--r--advtrains/po/advtrains.pot662
-rw-r--r--advtrains/po/de.po972
-rw-r--r--advtrains/po/fr.po886
-rwxr-xr-xadvtrains/po/update-translations.sh17
-rw-r--r--advtrains/po/zh_CN.po802
-rw-r--r--advtrains/po/zh_TW.po802
-rw-r--r--advtrains/protection.lua16
-rw-r--r--advtrains/signals.lua17
-rw-r--r--advtrains/track_reg_helper.lua19
-rw-r--r--advtrains/trackplacer.lua13
-rw-r--r--advtrains/tracks.lua10
-rw-r--r--advtrains/trainhud.lua5
-rw-r--r--advtrains/trainlogic.lua3
-rw-r--r--advtrains/wagonprop_tool.lua12
-rw-r--r--advtrains/wagons.lua24
-rw-r--r--advtrains_interlocking/autonaming.lua8
-rw-r--r--advtrains_interlocking/database.lua18
-rw-r--r--advtrains_interlocking/init.lua10
-rw-r--r--advtrains_interlocking/locale/advtrains_interlocking.de.tr191
-rw-r--r--advtrains_interlocking/locale/advtrains_interlocking.fr.tr191
-rw-r--r--advtrains_interlocking/locale/advtrains_interlocking.zh_CN.tr191
-rw-r--r--advtrains_interlocking/locale/advtrains_interlocking.zh_TW.tr191
-rw-r--r--advtrains_interlocking/po/README.md70
-rw-r--r--advtrains_interlocking/po/advtrains_interlocking.pot807
-rw-r--r--advtrains_interlocking/po/de.po1378
-rw-r--r--advtrains_interlocking/po/fr.po1629
-rw-r--r--advtrains_interlocking/po/update-translations.sh28
-rw-r--r--advtrains_interlocking/po/zh_CN.po1278
-rw-r--r--advtrains_interlocking/po/zh_TW.po1278
-rw-r--r--advtrains_interlocking/route_prog.lua79
-rw-r--r--advtrains_interlocking/route_ui.lua55
-rw-r--r--advtrains_interlocking/routesetting.lua24
-rw-r--r--advtrains_interlocking/signal_api.lua2
-rw-r--r--advtrains_interlocking/signal_aspect_ui.lua41
-rw-r--r--advtrains_interlocking/smartroute.lua13
-rwxr-xr-xadvtrains_interlocking/tcb_ts_ui.lua216
-rw-r--r--advtrains_interlocking/tool.lua29
-rw-r--r--advtrains_interlocking/tsr_rail.lua3
-rw-r--r--advtrains_line_automation/init.lua8
-rw-r--r--advtrains_line_automation/locale/advtrains_line_automation.de.tr22
-rw-r--r--advtrains_line_automation/locale/advtrains_line_automation.fr.tr22
-rw-r--r--advtrains_line_automation/locale/advtrains_line_automation.zh_CN.tr22
-rw-r--r--advtrains_line_automation/locale/advtrains_line_automation.zh_TW.tr22
-rw-r--r--advtrains_line_automation/po/README.md70
-rw-r--r--advtrains_line_automation/po/advtrains_line_automation.pot102
-rw-r--r--advtrains_line_automation/po/de.po610
-rw-r--r--advtrains_line_automation/po/fr.po896
-rw-r--r--advtrains_line_automation/po/update-translations.sh28
-rw-r--r--advtrains_line_automation/po/zh_CN.po552
-rw-r--r--advtrains_line_automation/po/zh_TW.po552
-rw-r--r--advtrains_line_automation/scheduler.lua2
-rw-r--r--advtrains_line_automation/stoprail.lua4
-rw-r--r--advtrains_luaautomation/active_common.lua3
-rw-r--r--advtrains_luaautomation/atc_rail.lua5
-rw-r--r--advtrains_luaautomation/chatcmds.lua56
-rw-r--r--advtrains_luaautomation/init.lua14
-rw-r--r--advtrains_luaautomation/locale/advtrains_luaautomation.de.tr39
-rw-r--r--advtrains_luaautomation/locale/advtrains_luaautomation.fr.tr39
-rw-r--r--advtrains_luaautomation/locale/advtrains_luaautomation.zh_CN.tr39
-rw-r--r--advtrains_luaautomation/locale/advtrains_luaautomation.zh_TW.tr39
-rw-r--r--advtrains_luaautomation/mesecon_controller.lua3
-rw-r--r--advtrains_luaautomation/operation_panel.lua3
-rw-r--r--advtrains_luaautomation/pcnaming.lua5
-rw-r--r--advtrains_luaautomation/po/README.md70
-rw-r--r--advtrains_luaautomation/po/advtrains_luaautomation.pot185
-rw-r--r--advtrains_luaautomation/po/de.po708
-rw-r--r--advtrains_luaautomation/po/fr.po986
-rw-r--r--advtrains_luaautomation/po/update-translations.sh28
-rw-r--r--advtrains_luaautomation/po/zh_CN.po644
-rw-r--r--advtrains_luaautomation/po/zh_TW.po644
-rw-r--r--advtrains_signals_japan/init.lua5
-rw-r--r--advtrains_signals_ks/init.lua41
-rw-r--r--advtrains_signals_muc_ubahn/init.lua13
-rw-r--r--advtrains_train_track/init.lua29
81 files changed, 15706 insertions, 2942 deletions
diff --git a/advtrains/atc.lua b/advtrains/atc.lua
index 8e54b08..e14e5c1 100644
--- a/advtrains/atc.lua
+++ b/advtrains/atc.lua
@@ -1,6 +1,9 @@
--atc.lua
--registers and controls the ATC system
+-- Get current translator
+local S = advtrains.translate
+
local atc={}
local eval_conditional
@@ -107,7 +110,7 @@ local apn_func=function(pos)
-- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function!
local meta=minetest.get_meta(pos)
if meta then
- meta:set_string("infotext", attrans("Unconfigured ATC controller"))
+ meta:set_string("infotext", S("Unconfigured ATC controller"))
meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
end
end
@@ -129,27 +132,15 @@ advtrains.atc_function = function(def, preset, suffix, rotation)
local meta=minetest.get_meta(pos)
if meta then
if not fields.save then
- --[[--maybe only the dropdown changed
- if fields.mode then
- meta:set_string("mode", idxtrans[fields.mode])
- if fields.mode=="digiline" then
- meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", fields.mode, meta:get_string("command")) )
- else
- meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", fields.mode, meta:get_string("command")) )
- end
- meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
- end]]--
return
end
--meta:set_string("mode", idxtrans[fields.mode])
meta:set_string("command", fields.command)
--meta:set_string("command_on", fields.command_on)
meta:set_string("channel", fields.channel)
- --if fields.mode=="digiline" then
- -- meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", fields.mode, meta:get_string("command")) )
- --else
- meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", "-", meta:get_string("command")) )
- --end
+
+ meta:set_string("infotext", S("ATC controller, Command: @1", meta:get_string("command")) )
+
meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
local pts=minetest.pos_to_string(pos)
@@ -178,16 +169,11 @@ function atc.get_atc_controller_formspec(pos, meta)
if mode<3 then
formspec=formspec
.."style[command;font=mono]"
- .."field[0.8,1.5;7,1;command;"..attrans("Command")..";"..minetest.formspec_escape(command).."]"
- if tonumber(mode)==2 then
- formspec=formspec
- .."style[command_on;font=mono]"
- .."field[0.8,3;7,1;command_on;"..attrans("Command (on)")..";"..minetest.formspec_escape(command_on).."]"
- end
+ .."field[0.8,1.5;7,1;command;"..S("Command")..";"..minetest.formspec_escape(command).."]"
else
- formspec=formspec.."field[0.8,1.5;7,1;channel;"..attrans("Digiline channel")..";"..minetest.formspec_escape(channel).."]"
+ formspec=formspec.."field[0.8,1.5;7,1;channel;"..S("Digiline channel")..";"..minetest.formspec_escape(channel).."]"
end
- return formspec.."button_exit[0.5,4.5;7,1;save;"..attrans("Save").."]"
+ return formspec.."button_exit[0.5,4.5;7,1;save;"..S("Save").."]"
end
--from trainlogic.lua train step
@@ -234,7 +220,7 @@ local matchptn={
advtrains.train_ensure_init(id, train)
-- no one minds if this failed... this shouldn't even be called without train being initialized...
else
- atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving."))
+ atwarn(sid(id), S("ATC Reverse command warning: didn't reverse train, train moving."))
end
return 1
end,
@@ -246,11 +232,11 @@ local matchptn={
end,
["K"] = function(id, train)
if train.door_open == 0 then
- atwarn(sid(id), attrans("ATC Kick command warning: doors are closed."))
+ atwarn(sid(id), S("ATC Kick command warning: doors are closed."))
return 1
end
if train.velocity > 0 then
- atwarn(sid(id), attrans("ATC Kick command warning: train moving."))
+ atwarn(sid(id), S("ATC Kick command warning: train moving."))
return 1
end
local tp = train.trainparts
@@ -324,7 +310,7 @@ eval_conditional = function(command, arrow, speed)
local nest, pos, elsepos=0, 1
while nest>=0 do
if pos>#rest then
- atwarn(sid(id), attrans("ATC command syntax error: I statement not closed: @1",command))
+ atwarn(sid(id), S("ATC command syntax error: I statement not closed: @1",command))
return ""
end
local char=string.sub(rest, pos, pos)
@@ -388,7 +374,7 @@ function atc.execute_atc_command(id, train)
return
end
end
- atwarn(sid(id), attrans("ATC command parse error: Unknown command: @1", command))
+ atwarn(sid(id), S("ATC command parse error: Unknown command: @1", command))
atc.train_reset_command(train, true)
end
diff --git a/advtrains/copytool.lua b/advtrains/copytool.lua
index c63551e..cdfbd2e 100644
--- a/advtrains/copytool.lua
+++ b/advtrains/copytool.lua
@@ -4,8 +4,11 @@
-- 4.712389 = 1.5pi; sin(1.5pi) = -1
-- 7.853981 = 2.5pi; sin(2.5pi) = 1
+-- Get current translator
+local S = advtrains.translate
+
minetest.register_tool("advtrains:copytool", {
- description = attrans("Train copy/paste tool\n\nLeft-click: copy train\nRight-click: paste train"),
+ description = S("Train copy/paste tool\n\nLeft-click: copy train\nRight-click: paste train"),
inventory_image = "advtrains_copytool.png",
wield_image = "advtrains_copytool.png",
stack_max = 1,
@@ -38,23 +41,23 @@ minetest.register_tool("advtrains:copytool", {
local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true})
if not prevpos then
- minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough."))
+ minetest.chat_send_player(pname, S("The track you are trying to place the wagon on is not long enough."))
return
end
local meta = itemstack:get_meta()
if not meta then
- minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Paste failed."))
+ minetest.chat_send_player(pname, S("The clipboard couldn't access the metadata. Paste failed."))
return
end
local clipboard = meta:get_string("clipboard")
if (clipboard == "") then
- minetest.chat_send_player(pname, attrans("The clipboard is empty."));
+ minetest.chat_send_player(pname, S("The clipboard is empty."));
return
end
clipboard = minetest.deserialize(clipboard)
if (clipboard.wagons == nil) then
- minetest.chat_send_player(pname, attrans("The clipboard is empty."));
+ minetest.chat_send_player(pname, S("The clipboard is empty."));
return
end
@@ -71,7 +74,7 @@ minetest.register_tool("advtrains:copytool", {
local train = advtrains.trains[id]
train.off_track = train.end_index<train.path_trk_b
if (train.off_track) then
- minetest.chat_send_player(pname, attrans("Back of train would end up off track, cancelling."))
+ minetest.chat_send_player(pname, S("Back of train would end up off track, cancelling."))
advtrains.remove_train(id)
return
end
@@ -89,19 +92,19 @@ minetest.register_tool("advtrains:copytool", {
local le = pointed_thing.ref:get_luaentity()
if (le == nil) then
- minetest.chat_send_player(user:get_player_name(), attrans("No such lua entity."))
+ minetest.chat_send_player(user:get_player_name(), S("No such lua entity."))
return
end
local wagon = advtrains.wagons[le.id]
if (not (le.id and advtrains.wagons[le.id])) then
- minetest.chat_send_player(user:get_player_name(), attrans("No such wagon: @1.", le.id))
+ minetest.chat_send_player(user:get_player_name(), S("No such wagon: @1.", le.id))
return
end
local train = advtrains.trains[wagon.train_id]
if (not train) then
- minetest.chat_send_player(user:get_player_name(), attrans("No such train: @1.", wagon.train_id))
+ minetest.chat_send_player(user:get_player_name(), S("No such train: @1.", wagon.train_id))
return
end
@@ -173,11 +176,11 @@ minetest.register_tool("advtrains:copytool", {
local meta = itemstack:get_meta()
if not meta then
- minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Copy failed."))
+ minetest.chat_send_player(pname, S("The clipboard couldn't access the metadata. Copy failed."))
return
end
meta:set_string("clipboard", minetest.serialize(clipboard))
- minetest.chat_send_player(user:get_player_name(), attrans("Train copied."))
+ minetest.chat_send_player(user:get_player_name(), S("Train copied."))
return itemstack
end
})
diff --git a/advtrains/couple.lua b/advtrains/couple.lua
index 4933dd8..cb325a0 100644
--- a/advtrains/couple.lua
+++ b/advtrains/couple.lua
@@ -18,6 +18,9 @@
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
-- These objectRefs will delete themselves once the couples no longer match (see below)
+-- Get current translator
+local S = advtrains.translate
+
advtrains.coupler_types = {}
function advtrains.register_coupler_type(code, name)
@@ -25,8 +28,8 @@ function advtrains.register_coupler_type(code, name)
end
-- Register some default couplers
-advtrains.register_coupler_type("chain", attrans("Buffer and Chain Coupler"))
-advtrains.register_coupler_type("scharfenberg", attrans("Scharfenberg Coupler"))
+advtrains.register_coupler_type("chain", S("Buffer and Chain Coupler"))
+advtrains.register_coupler_type("scharfenberg", S("Scharfenberg Coupler"))
for _, name in pairs {"couple", "decouple"} do
local t = {}
@@ -245,7 +248,7 @@ function advtrains.couple_trains(init_train, invert_init_train, stat_train, stat
-- sanity check, prevent coupling if train would be longer than 20 after coupling
local tot_len = init_wagoncnt + stat_wagoncnt
if tot_len > advtrains.TRAIN_MAX_WAGONS then
- atwarn("Cannot couple",stat_train.id,"and",init_train.id,"- train would have length",tot_len,"which is above the limit of",advtrains.TRAIN_MAX_WAGONS)
+ atwarn(S("Cannot couple @1 and @2 - train would have length @3 which is above the limit of @4", stat_train.id, init_train.id, tot_len, advtrains.TRAIN_MAX_WAGONS))
return
end
@@ -351,12 +354,12 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front)
for typ,_ in pairs(t1_cplt) do
table.insert(t1_cplhr, advtrains.coupler_types[typ] or typ)
end
- if #t1_cplhr==0 then t1_cplhr[1]=attrans("<No coupler>") end
+ if #t1_cplhr==0 then t1_cplhr[1]=S("<No coupler>") end
for typ,_ in pairs(t2_cplt) do
table.insert(t2_cplhr, advtrains.coupler_types[typ] or typ)
end
- if #t2_cplhr==0 then t2_cplhr[1]=attrans("<No coupler>") end
- return false, attrans("Can not couple: The couplers of the trains do not match (@1 and @2).", table.concat(t1_cplhr, ","), table.concat(t2_cplhr, ","))
+ if #t2_cplhr==0 then t2_cplhr[1]=S("<No coupler>") end
+ return false, S("Can not couple: The couplers of the trains do not match (@1 and @2).", table.concat(t1_cplhr, ","), table.concat(t2_cplhr, ","))
end
-- DECOUPLING --
diff --git a/advtrains/craft_items.lua b/advtrains/craft_items.lua
index 1188b64..6b1dcef 100644
--- a/advtrains/craft_items.lua
+++ b/advtrains/craft_items.lua
@@ -1,23 +1,26 @@
+-- Get current translator
+local S = advtrains.translate
+
core.register_craftitem("advtrains:boiler", {
- description = attrans("Boiler"),
+ description = S("Boiler"),
inventory_image = "advtrains_boiler.png",
})
core.register_craftitem("advtrains:driver_cab", {
- description = attrans("Driver's cab"),
+ description = S("Driver's cab"),
inventory_image = "advtrains_driver_cab.png",
})
core.register_craftitem("advtrains:wheel", {
- description = attrans("Wheel"),
+ description = S("Wheel"),
inventory_image = "advtrains_wheel.png",
})
core.register_craftitem("advtrains:chimney", {
- description = attrans("Chimney"),
+ description = S("Chimney"),
inventory_image = "advtrains_chimney.png",
})
diff --git a/advtrains/formspec.lua b/advtrains/formspec.lua
index 8894354..86d8b27 100644
--- a/advtrains/formspec.lua
+++ b/advtrains/formspec.lua
@@ -1,6 +1,9 @@
local sformat = string.format
local fsescape = minetest.formspec_escape
+-- Get current translator
+local S = advtrains.translate
+
local function make_list(entries)
local t = {}
for k, v in ipairs(entries) do
@@ -12,7 +15,7 @@ end
local function S_wrapper(f, i0)
return function(...)
local args = {...}
- args[i0] = attrans(unpack(args,i0))
+ args[i0] = S(unpack(args,i0))
return f(unpack(args,1,i0))
end
end
diff --git a/advtrains/init.lua b/advtrains/init.lua
index 91b2b58..cd63104 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -22,12 +22,6 @@ Copyright (C) 2016-2020 Moritz Blei (orwell96) and contributors
local lot = os.clock()
minetest.log("action", "[advtrains] Loading...")
--- There is no need to support 0.4.x anymore given that the compatitability with it is already broken by 1bb1d825f46af3562554c12fba35a31b9f7973ff
-attrans = minetest.get_translator ("advtrains")
-function attrans_formspec(...)
- return minetest.formspec_escape(attrans(...))
-end
-
--advtrains
advtrains = {trains={}, player_to_train_mapping={}}
@@ -56,6 +50,17 @@ advtrains.TRAIN_MAX_WAGONS = 20
-- ==========================================================================
+advtrains.modpath = minetest.get_modpath("advtrains")
+
+-- Initialize internationalization (using ywang's poconvert)
+advtrains.poconvert = dofile(advtrains.modpath.."/poconvert.lua")
+advtrains.poconvert.from_flat("advtrains")
+-- ask engine for translator instance, this will load the translation files
+advtrains.translate = core.get_translator("advtrains")
+
+-- Get current translator
+local S = advtrains.translate
+
-- Use a global slowdown factor to slow down train movements. Now a setting
advtrains.DTIME_LIMIT = tonumber(minetest.settings:get("advtrains_dtime_limit")) or 0.2
advtrains.SAVE_INTERVAL = tonumber(minetest.settings:get("advtrains_save_interval")) or 60
@@ -89,8 +94,6 @@ local function reload_saves()
end)
end
-advtrains.modpath = minetest.get_modpath("advtrains")
-
--Advtrains dump (special treatment of pos and sigd)
function atdump(t, intend)
local str
@@ -204,10 +207,6 @@ advtrains.meseconrules =
advtrains.fpath=minetest.get_worldpath().."/advtrains"
-advtrains.poconvert = dofile(advtrains.modpath.."/poconvert.lua")
-advtrains.poconvert.from_flat("advtrains")
-attrans = minetest.get_translator("advtrains")
-
advtrains.speed = dofile(advtrains.modpath.."/speed.lua")
advtrains.formspec = dofile(advtrains.modpath.."/formspec.lua")
advtrains.texture = dofile(advtrains.modpath.."/texture.lua")
@@ -502,7 +501,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
--then save it
tmp_trains[id]=v
else
- atwarn(S("Train"),id,S("had no wagons left because of some bug. It is being deleted. Wave it goodbye!"))
+ atwarn(S("Train @1 had no wagons left because of some bug. It is being deleted. Wave it goodbye!", id))
advtrains.remove_train(id)
end
end
@@ -583,7 +582,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(S("Saving failed: ")..err)
+ atwarn(S("Saving failed: @1", err))
else
-- store version
advtrains.save_component(4, "version")
@@ -755,9 +754,9 @@ minetest.register_chatcommand("at_whereis",
func = function(name,param)
local train = advtrains.trains[param]
if not train or not train.last_pos then
- return false, S("Train ")..param..S(" does not exist or is invalid")
+ return false, S("Train @1 does not exist or is invalid", param)
else
- return true, S("Train ")..param..S(" is at ")..minetest.pos_to_string(train.last_pos)
+ return true, S("Train @1 is at @2", param, minetest.pos_to_string(train.last_pos))
end
end,
})
@@ -769,10 +768,10 @@ minetest.register_chatcommand("at_tp",
func = function(name,param)
local train = advtrains.trains[param]
if not train or not train.last_pos then
- return false, S("Train ")..param..S(" does not exist or is invalid")
+ return false, S("Train @1 does not exist or is invalid", param)
else
minetest.get_player_by_name(name):set_pos(train.last_pos)
- return true, S("Teleporting to train ")..param
+ return true, S("Teleporting to train @1", param)
end
end,
})
@@ -803,7 +802,7 @@ minetest.register_chatcommand("at_status",
description = S("Print advtrains status info"),
privs = {train_operator = true},
func = function(name, param)
- 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),")"})
+ return true, S("Advtrains Status: no_action @1 slowdown @2 (log @3)", no_action, advtrains.global_slowdown, math.log(advtrains.global_slowdown))
end,
})
diff --git a/advtrains/misc_nodes.lua b/advtrains/misc_nodes.lua
index bcf7329..8720272 100644
--- a/advtrains/misc_nodes.lua
+++ b/advtrains/misc_nodes.lua
@@ -1,5 +1,8 @@
--all nodes that do not fit in any other category
+-- Get current translator
+local S = advtrains.translate
+
function advtrains.register_platform(modprefix, preset)
local ndef=minetest.registered_nodes[preset]
if not ndef then
@@ -13,7 +16,7 @@ function advtrains.register_platform(modprefix, preset)
local desc=ndef.description or ""
local nodename=string.match(preset, ":(.+)$")
minetest.register_node(modprefix .. ":platform_low_"..nodename, {
- description = attrans("@1 Platform (low)", desc),
+ description = S("@1 Platform (low)", desc),
tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex},
groups = {cracky = 1, not_blocking_trains = 1, platform=1},
sounds = ndef.sounds,
@@ -30,7 +33,7 @@ function advtrains.register_platform(modprefix, preset)
sunlight_propagates = true,
})
minetest.register_node(modprefix .. ":platform_high_"..nodename, {
- description = attrans("@1 Platform (high)", desc),
+ description = S("@1 Platform (high)", desc),
tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex},
groups = {cracky = 1, not_blocking_trains = 1, platform=2},
sounds = ndef.sounds,
@@ -56,7 +59,7 @@ function advtrains.register_platform(modprefix, preset)
}
}
minetest.register_node(modprefix..":platform_45_"..nodename, {
- description = attrans("@1 Platform (45 degree)", desc),
+ description = S("@1 Platform (45 degree)", desc),
groups = {cracky = 1, not_blocking_trains = 1, platform=2},
sounds = ndef.sounds,
drawtype = "mesh",
@@ -78,7 +81,7 @@ function advtrains.register_platform(modprefix, preset)
}
}
minetest.register_node(modprefix..":platform_45_low_"..nodename, {
- description = attrans("@1 Platform (low, 45 degree)", desc),
+ description = S("@1 Platform (low, 45 degree)", desc),
groups = {cracky = 1, not_blocking_trains = 1, platform=2},
sounds = ndef.sounds,
drawtype = "mesh",
diff --git a/advtrains/po/advtrains.pot b/advtrains/po/advtrains.pot
index cd6ea75..db19fc9 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: 2025-03-25 15:40+0100\n"
+"POT-Creation-Date: 2025-06-10 21:40+0200\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,55 +17,47 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Unconfigured ATC controller"
msgstr ""
-#: advtrains/atc.lua
-msgid ""
-"ATC controller, mode @1\n"
-"Command: @2"
+#: atc.lua
+msgid "ATC controller, Command: @1"
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "Command"
msgstr ""
-#: advtrains/atc.lua
-msgid "Command (on)"
-msgstr ""
-
-#: advtrains/atc.lua
+#: atc.lua
msgid "Digiline channel"
msgstr ""
-#: advtrains/atc.lua advtrains/wagons.lua
-#: advtrains_line_automation/stoprail.lua
-#: advtrains_luaautomation/active_common.lua
+#: atc.lua wagons.lua
msgid "Save"
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Reverse command warning: didn't reverse train, train moving."
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: train moving."
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC command syntax error: I statement not closed: @1"
msgstr ""
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -73,315 +65,306 @@ msgid ""
"Right-click: paste train"
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "You do not have the @1 privilege."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The track you are trying to place the wagon on is not long enough."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard is empty."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such lua entity."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such wagon: @1."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such train: @1."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr ""
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Train copied."
msgstr ""
-#: advtrains/couple.lua
+#: couple.lua
msgid "Buffer and Chain Coupler"
msgstr ""
-#: advtrains/couple.lua
+#: couple.lua
msgid "Scharfenberg Coupler"
msgstr ""
-#: advtrains/couple.lua
+#: couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr ""
-#: advtrains/couple.lua
+#: couple.lua
+msgid ""
+"Cannot couple @1 and @2 - train would have length @3 which is above the "
+"limit of @4"
+msgstr ""
+
+#: couple.lua
msgid "<No coupler>"
msgstr ""
-#: advtrains/couple.lua
+#: couple.lua
msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
msgstr ""
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Boiler"
msgstr ""
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Driver's cab"
msgstr ""
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Wheel"
msgstr ""
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Chimney"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Reload successful!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Removing unused wagon"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "from wagon_save table."
msgstr ""
-#: advtrains/init.lua
-msgid "Train"
-msgstr ""
-
-#: advtrains/init.lua
+#: init.lua
msgid ""
-"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
+"Train @1 had no wagons left because of some bug. It is being deleted. Wave "
+"it goodbye!"
msgstr ""
-#: advtrains/init.lua
-msgid "Saving failed: "
+#: init.lua
+msgid "Saving failed: @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: 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
+#: init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Successfully invalidated train routes"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Returns the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
-msgid " does not exist or is invalid"
+#: init.lua
+msgid "Train @1 does not exist or is invalid"
msgstr ""
-#: advtrains/init.lua
-msgid "Train "
+#: init.lua
+msgid "Train @1 is at @2"
msgstr ""
-#: advtrains/init.lua
-msgid " is at "
-msgstr ""
-
-#: advtrains/init.lua
+#: init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
-msgid "Teleporting to train "
+#: init.lua
+msgid "Teleporting to train @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Disabled advtrains successfully"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Advtrains is already running normally!"
msgstr ""
-#: advtrains/init.lua
+#: 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"
+#: init.lua
+msgid "Advtrains Status: no_action @1 slowdown @2 (log @3)"
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low)"
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (high)"
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place and dig tracks in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build near tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr ""
-#: advtrains/signals.lua
-msgid "Lampless Signal"
+#: signals.lua
+msgid "Lampless Signal (deprecated!)"
msgstr ""
-#: advtrains/signals.lua
-msgid "Signal"
+#: signals.lua
+msgid "Signal (deprecated!)"
msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (left)"
+#: signals.lua
+msgid "Wallmounted Signal (left) (deprecated!)"
msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (right)"
+#: signals.lua
+msgid "Wallmounted Signal (right) (deprecated!)"
msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (top)"
+#: signals.lua
+msgid "Wallmounted Signal (top) (deprecated!)"
msgstr ""
-#: advtrains/signals.lua
+#: signals.lua
msgid "Andrew's Cross"
msgstr ""
-#: advtrains/track_reg_helper.lua advtrains/tracks.lua
+#: track_reg_helper.lua tracks.lua
msgid "This track can not be removed!"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "@1 Slope"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: not pointing at node"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: space occupied!"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: Not enough slope items left (@1 required)"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: There's no slope of length @1"
msgstr ""
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: no supporting node at upper end."
msgstr ""
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -389,569 +372,254 @@ msgid ""
"Right-click: rotate object"
msgstr ""
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid "This node can't be rotated using the trackworker!"
msgstr ""
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid "This track can not be rotated!"
msgstr ""
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid "This node can't be changed using the trackworker!"
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Signal Influence Point here."
msgstr ""
-#: advtrains/trainhud.lua
+#: trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid ""
"Wagon Properties Tool\n"
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Wagon Properties Tool"
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagons.lua
-msgid "Uninitialized init="
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Uninitialized, removing"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
-#: advtrains/wagons.lua
+#: 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
-msgid " wagon:destroy(): data is not set!"
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "!!! Train off track !!!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid " units"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: empty"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Show Inventory"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon properties"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off (forced)"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "(Doors closed)"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon has no seats."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is full."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You can't get on this wagon."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Select seat:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This Wagon ID"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon road number:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Freight Code:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Prev FC"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Current FC: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Next FC:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Save wagon properties"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train ID"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed outside on train"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed inside train"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Line"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Routingcode"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview /coupling control:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Remote Routesetting"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Missing train_operator privilege"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not allowed to do this."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You don't have the train_operator privilege."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
+msgid "Wagon placeholder"
+msgstr ""
+
+#: wagons.lua
msgid "Please specify a player name to transfer ownership to."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That player does not exist!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not a valid wagon id."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That wagon does not exist!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You have been given ownership of wagon @1"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon @1 ownership changed from @2 to @3"
msgstr ""
-
-#: 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
-msgid "Set point speed restriction:"
-msgstr ""
-
-#: advtrains_interlocking/tsr_rail.lua
-msgid "You are not allowed to configure this track without the @1 privilege."
-msgstr ""
-
-#: 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
-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 ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Name"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Delay"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Dep. Speed"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
-msgid "Track"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Stop Time"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Side"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Closed"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Left"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Right"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Reverse train"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Kick out passengers"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Wait for signal to clear"
-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 ""
-
-#: 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
-msgid "Unknown Station"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Next Stop:\n"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station/Stop Track"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Unconfigured LuaATC component"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Clear Local Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Code"
-msgstr ""
-
-#: 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
-msgid "LuaATC component assigned to environment '@1'"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component with error: @1"
-msgstr ""
-
-#: advtrains_luaautomation/init.lua
-msgid ""
-"Can place and configure LuaATC components, including execute potentially "
-"harmful Lua code"
-msgstr ""
-
-#: advtrains_luaautomation/mesecon_controller.lua
-msgid "LuaATC Mesecon Controller"
-msgstr ""
-
-#: advtrains_luaautomation/operation_panel.lua
-msgid "LuaATC Operation Panel"
-msgstr ""
-
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"Passive Component Naming Tool\n"
-"\n"
-"Right-click to name a passive component."
-msgstr ""
-
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"You are not allowed to name LuaATC passive components without the @1 "
-"privilege."
-msgstr ""
-
-#: advtrains_luaautomation/pcnaming.lua
-msgid "Set name of component (empty to clear)"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Japanese signal pole"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Clear (proceed)"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Reduced speed"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Caution"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Restricted speed"
-msgstr ""
-
-#: advtrains_signals_japan/init.lua
-msgid "Danger (halt)"
-msgstr ""
-
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Distant Signal ("
-msgstr ""
-
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Main Signal ("
-msgstr ""
-
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (right)"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (left)"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua advtrains_train_japan/init.lua
-#: advtrains_train_steam/init.lua advtrains_train_subway/init.lua
-msgid "Driver Stand"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua
-msgid "Industrial Train Engine"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua
-msgid "Big Industrial Train Engine"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua
-msgid "Industrial tank wagon"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua
-msgid "Industrial wood wagon"
-msgstr ""
-
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr ""
-
-#: advtrains_train_japan/init.lua advtrains_train_subway/init.lua
-msgid "Driver stand"
-msgstr ""
-
-#: advtrains_train_japan/init.lua advtrains_train_steam/init.lua
-#: advtrains_train_subway/init.lua
-msgid "Passenger area"
-msgstr ""
-
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Engine"
-msgstr ""
-
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Wagon"
-msgstr ""
-
-#: advtrains_train_steam/init.lua
-msgid "Steam Engine"
-msgstr ""
-
-#: advtrains_train_steam/init.lua
-msgid "Detailed Steam Engine"
-msgstr ""
-
-#: advtrains_train_steam/init.lua
-msgid "Passenger Wagon"
-msgstr ""
-
-#: advtrains_train_steam/init.lua
-msgid "Box Wagon"
-msgstr ""
-
-#: advtrains_train_subway/init.lua
-msgid "Subway Passenger Wagon"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Y-turnout"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "3-way turnout"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Perpendicular Diamond Crossing Track"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "90+Angle Diamond Crossing Track"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Diagonal Diamond Crossing Track"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Bumper"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "ATC controller"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Unloading Track"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Loading Track"
-msgstr ""
-
-#: advtrains_train_track/init.lua
-msgid "Detector Rail"
-msgstr ""
diff --git a/advtrains/po/de.po b/advtrains/po/de.po
index 458e701..f83b760 100644
--- a/advtrains/po/de.po
+++ b/advtrains/po/de.po
@@ -2,115 +2,105 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2025-03-25 15:40+0100\n"
-"PO-Revision-Date: 2023-10-09 11:18+0200\n"
+"POT-Creation-Date: 2025-06-10 21:40+0200\n"
+"PO-Revision-Date: 2025-06-11 22:55+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.3.2\n"
+"X-Generator: Poedit 3.2.2\n"
-#: advtrains/atc.lua
+#: 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
+#: 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
+#: 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
+#: atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
-#: advtrains/atc.lua
+#: 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"
-msgstr ""
-"Zugbeeinflussungsgleis in Betriebsart „@1“\n"
-"Befehl: @2"
+#: atc.lua
+msgid "ATC controller, Command: @1"
+msgstr "Zugbeeinflussungsgleis, Befehl: @1"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Command"
msgstr "Befehl"
-#: advtrains/atc.lua
-msgid "Command (on)"
-msgstr "Befehl (wenn aktiviert)"
-
-#: advtrains/atc.lua
+#: atc.lua
msgid "Digiline channel"
msgstr "Digiline-Kanal"
-#: advtrains/atc.lua advtrains/wagons.lua
-#: advtrains_line_automation/stoprail.lua
-#: advtrains_luaautomation/active_common.lua
+#: atc.lua wagons.lua
msgid "Save"
msgstr "Speichern"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Unconfigured ATC controller"
msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
-#: advtrains/copytool.lua
+#: 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
+#: copytool.lua
msgid "No such lua entity."
msgstr ""
"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
"kann."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such train: @1."
msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such wagon: @1."
msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
-#: advtrains/copytool.lua
+#: copytool.lua
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
+#: copytool.lua
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
+#: copytool.lua
msgid "The clipboard is empty."
msgstr "Das Clipboard ist leer."
-#: advtrains/copytool.lua
+#: 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
+#: copytool.lua
msgid "Train copied."
-msgstr "Der Zug wurde Kopiert."
+msgstr "Der Zug wurde kopiert."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -122,310 +112,315 @@ msgstr ""
"Linksklick: Zug ins Clipboard kopieren\n"
"Right-click: Kopierten Zug einfügen"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "You do not have the @1 privilege."
msgstr "Ihnen fehlt das „@1“-Privileg."
-#: advtrains/couple.lua
+#: couple.lua
msgid "<No coupler>"
msgstr "<Keine Kupplung vorhanden>"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Schraubenkupplung"
-#: advtrains/couple.lua
+#: 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
+#: couple.lua
+msgid ""
+"Cannot couple @1 and @2 - train would have length @3 which is above the "
+"limit of @4"
+msgstr ""
+"Züge @1 und @2 können nicht gekuppelt werden - die resultierende Zuglänge @3 "
+"wäre länger als das Maximum von @4"
+
+#: couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenbergkupplung"
-#: advtrains/couple.lua
+#: 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/craft_items.lua
+#: craft_items.lua
msgid "Boiler"
-msgstr ""
+msgstr "Kessel"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Chimney"
-msgstr ""
+msgstr "Schornstein"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Driver's cab"
msgstr "Führerstand"
-#: advtrains/craft_items.lua
+#: craft_items.lua
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 ""
+msgstr "Rad"
-#: advtrains/init.lua
-msgid "Advtrains Status: no_action"
+#: init.lua
+msgid "Advtrains Status: no_action @1 slowdown @2 (log @3)"
msgstr ""
+"Advtrains Status: keine Aktion: @1 Verlangsamungsfaktor: @2 (logarithmisch "
+"@3)"
-#: advtrains/init.lua
+#: init.lua
msgid "Advtrains is already running normally!"
-msgstr ""
+msgstr "Advtrains läuft bereits normal!"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""
+"Advtrains ist während der Ausführung des Main Step abgestürzt - Daten werden "
+"nicht gespeichert um Inkonsistenzen zu verhindern!"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""
+"Daten werden gespeichert. Beim Speichern werden alle Spieler aus Waggons "
+"entfernt. Anschließend werden die Speicherdateien neu geladen!"
-#: advtrains/init.lua
+#: init.lua
msgid "Delete all train routes, force them to recalculate"
-msgstr ""
+msgstr "Erzwingt die Neuberechnung der Bewegungspfade aller Züge"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""
+"Bewirkt, dass alle Spieler (insbesondere Offline-Spieler) aus Waggons "
+"entfernt werden. Nur benutzen, wenn niemand ernsthaft in einem Zug sitzt."
-#: advtrains/init.lua
+#: init.lua
msgid "Disable the advtrains globalstep temporarily"
-msgstr ""
+msgstr "Advtrains-Schrittverarbeitung temporär deaktivieren"
-#: advtrains/init.lua
+#: init.lua
msgid "Disabled advtrains successfully"
-msgstr ""
+msgstr "Advtrains erfolgreich deaktiviert"
-#: advtrains/init.lua
+#: init.lua
msgid "Instructed to save() but load() was never called!"
-msgstr ""
+msgstr "Speichern angefordert, aber Speicherdateien wurden nie geladen!"
-#: advtrains/init.lua
+#: init.lua
msgid "Print advtrains status info"
-msgstr ""
+msgstr "Advtrains-Statusinformationen ausgeben"
-#: advtrains/init.lua
+#: init.lua
msgid "Re-enabling advtrains globalstep..."
-msgstr ""
+msgstr "Advtrains-Schrittverarbeitung wird wieder aktiviert..."
-#: advtrains/init.lua
+#: init.lua
msgid "Reload successful!"
-msgstr ""
+msgstr "Neu Laden Erfolgreich!"
-#: advtrains/init.lua
+#: init.lua
msgid "Removing unused wagon"
-msgstr ""
+msgstr "Ungenutzer Waggon wird entfernt"
-#: advtrains/init.lua
+#: init.lua
msgid "Restoring saved state in 1 second..."
-msgstr ""
+msgstr "Speicherstand wird in 1 Sekunde wiederhergestellt..."
-#: advtrains/init.lua
+#: init.lua
msgid "Returns the position of the train with the given id"
-msgstr ""
+msgstr "Gibt die Position des Zugs mit der gegebenen ID aus"
-#: advtrains/init.lua
-msgid "Saving failed: "
-msgstr ""
+#: init.lua
+msgid "Saving failed: @1"
+msgstr "Speichern ist fehlgeschlagen: @1"
-#: advtrains/init.lua
+#: init.lua
msgid "Successfully invalidated train routes"
-msgstr ""
+msgstr "Bewegungspfade der Züge erfolgreich invalidiert"
-#: advtrains/init.lua
-msgid "Teleporting to train "
-msgstr ""
+#: init.lua
+msgid "Teleporting to train @1"
+msgstr "Teleportiere zu Zug @1"
-#: advtrains/init.lua
+#: init.lua
msgid "Teleports you to the position of the train with the given id"
-msgstr ""
+msgstr "Teleportiere dich zu dem Zug mit der gegebenen ID"
-#: advtrains/init.lua
+#: 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-Schrittverarbeitung ist deaktiviert. Züge bewegen sich nicht und "
+"Änderungen werden nicht gespeichert. Führe '/at_disable_step no' aus um sie "
+"wieder zu aktivieren!"
-#: 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 ""
+#: init.lua
+msgid "Train @1 does not exist or is invalid"
+msgstr "Zug @1 existiert nicht oder ist ungültig"
-#: advtrains/init.lua
+#: init.lua
msgid ""
-"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
+"Train @1 had no wagons left because of some bug. It is being deleted. Wave "
+"it goodbye!"
msgstr ""
+"Zug @1 hat keine Wagen mehr und sollte nicht mehr existieren. Er wird "
+"gelöscht. Auf Wiedersehen!"
-#: advtrains/init.lua
-msgid "slowdown"
-msgstr ""
+#: init.lua
+msgid "Train @1 is at @2"
+msgstr "Zug @1 ist bei @2"
+
+#: init.lua
+msgid "from wagon_save table."
+msgstr "aus der wagon_save table"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "Hoher @1-Bahnsteig (45°)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "Hoher @1-Bahnsteig"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low)"
msgstr "Niedriger @1-Bahnsteig"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Niedriger @1-Bahnsteig (45°)"
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+msgstr "Darf Weichen und Signale in ungeschütztem Gebiet stellen"
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place and dig tracks in unprotected areas"
-msgstr ""
+msgstr "Darf Gleise in ungeschütztem Gebiet verlegen und entfernen"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
-msgstr ""
+msgstr "Darf, unabhängig von Besitzer oder Schutz, sämtliche Züge steuern"
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place, remove and operate trains"
-msgstr ""
+msgstr "Darf Züge platzieren, entfernen und steuern"
-#: advtrains/protection.lua
+#: 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
+#: 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
+#: 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
+#: 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
+#: 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
+#: signals.lua
msgid "Andrew's Cross"
msgstr "Andreaskreuz"
-#: advtrains/signals.lua
-msgid "Lampless Signal"
-msgstr "Mechanisches Signal"
+#: signals.lua
+msgid "Lampless Signal (deprecated!)"
+msgstr "Mechanisches Signal (veraltet!)"
-#: advtrains/signals.lua
-msgid "Signal"
-msgstr "Lichtsignal"
+#: signals.lua
+msgid "Signal (deprecated!)"
+msgstr "Signal (veraltet!)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (left)"
-msgstr "An der linken Seite montiertes Signal"
+#: signals.lua
+msgid "Wallmounted Signal (left) (deprecated!)"
+msgstr "An der linken Seite montiertes Signal (veraltet!)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (right)"
-msgstr "An der rechten Seite montiertes Signal"
+#: signals.lua
+msgid "Wallmounted Signal (right) (deprecated!)"
+msgstr "An der rechten Seite montiertes Signal (veraltet!)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (top)"
-msgstr "An der Decke montiertes Signal"
+#: signals.lua
+msgid "Wallmounted Signal (top) (deprecated!)"
+msgstr "An der Decke montiertes Signal (veraltet!)"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "@1 Slope"
msgstr "@1 Steigung"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: Not enough slope items left (@1 required)"
msgstr ""
"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es "
"werden insgesamt @1 benötigt."
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: There's no slope of length @1"
msgstr ""
"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht "
"definiert."
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: no supporting node at upper end."
msgstr ""
"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende "
"der Steigung."
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: not pointing at node"
msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: space occupied!"
msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
-#: advtrains/track_reg_helper.lua advtrains/tracks.lua
+#: track_reg_helper.lua tracks.lua
#, fuzzy
msgid "This track can not be removed!"
msgstr "Dieses Gleis kann nicht entfernt werden."
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be changed using the trackworker!"
msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be rotated using the trackworker!"
msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This track can not be rotated!"
msgstr "Dieses Gleis kann nicht gedreht werden."
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -437,76 +432,78 @@ msgstr ""
"Linksklick: Gleistyp ändern\n"
"Rechtsklick: Objekt drehen"
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "Position is occupied by a train."
msgstr "Ein Zug steht an dieser Position."
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Signal Influence Point here."
msgstr "Hier ist ein Signal-Beeinflussungspunkt."
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Track Circuit Break here."
msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
-#: advtrains/trainhud.lua
+#: trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
+"ROTES SIGNAL ÜBERFAHREN! Situation überprüfen und Fahrtrichtung wechseln, um "
+"Bewegungssperre aufzuheben."
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Insufficient privileges to use this!"
-msgstr ""
+msgstr "Unzureichende Privilegien, um dies zu benutzen!"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
#, fuzzy
msgid "Wagon Properties Tool"
msgstr "Waggon-Einstellungen"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid ""
"Wagon Properties Tool\n"
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
+"Waggon-Einstellungstool\n"
+"Auf Waggon anwenden um Waggon-Einstellungen aufzurufen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid " units"
-msgstr ""
+msgstr " Einheiten"
-#: advtrains/wagons.lua
-msgid " wagon:destroy(): data is not set!"
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "!!! Train off track !!!"
-msgstr ""
+msgstr "!!! Abseits vom Gleis !!!"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "(Doors closed)"
msgstr "(Türen geschlossen)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Allow these players to access your wagon:"
-msgstr ""
+msgstr "Diese Spieler dürfen auf den Waggon zugreifen:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Clear 'Disable ARS' flag"
-msgstr ""
+msgstr "ARS-Sperre aufheben"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Current FC: "
-msgstr ""
+msgstr "Aktueller FC:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""
+"Waggon mit Inventar zerstört, aber Inventar nicht gefunden? Sollte nicht "
+"passieren!"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
-msgstr "Die Türen sind geschlossen."
+msgstr "Die Türen sind geschlossen! (Probiere Schleichen-Taste!)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
@@ -514,159 +511,156 @@ msgstr ""
"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz "
"geschlossener Türen auszusteigen."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Freight Code:"
-msgstr ""
+msgstr "Frachtcode:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off"
msgstr "Aussteigen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off (forced)"
msgstr "Ausstieg zwingen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Line"
msgstr "Linie"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: "
-msgstr ""
+msgstr "Flüssigkeit:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: empty"
-msgstr ""
+msgstr "Flüssigkeit: leer"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Missing train_operator privilege"
-msgstr ""
+msgstr "Fehlendes train_operator Privileg"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Next FC:"
-msgstr ""
+msgstr "Nächster FC:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not a valid wagon id."
-msgstr ""
+msgstr "Keine gültige Waggon-ID"
-#: advtrains/wagons.lua
-#, fuzzy
+#: wagons.lua
msgid "Not allowed to do this."
-msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+msgstr "Sie dürfen dies nicht tun."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Onboard Computer"
-msgstr ""
+msgstr "Bordcomputer"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Please specify a player name to transfer ownership to."
msgstr ""
+"Geben Sie einen Spielernamen an, an den der Besitz übertragen werden soll."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Prev FC"
-msgstr ""
+msgstr "Vorheriger FC"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Remote Routesetting"
-msgstr ""
+msgstr "Fahrstraße entfernt stellen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Routingcode"
-msgstr ""
+msgstr "Routingcode"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Save wagon properties"
msgstr "Waggon-Einstellungen speichern"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Select seat:"
msgstr "Wählen Sie einen Sitzplatz aus:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Show Inventory"
msgstr "Inventar Zeigen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed inside train"
msgstr "Innere Anzeige"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed outside on train"
msgstr "Äußere Anzeige"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That player does not exist!"
-msgstr ""
+msgstr "Dieser Spieler existiert nicht!"
-#: advtrains/wagons.lua
-#, fuzzy
+#: wagons.lua
msgid "That wagon does not exist!"
-msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+msgstr "Dieser Wagen existiert nicht!"
-#: advtrains/wagons.lua
-#, fuzzy
+#: wagons.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."
+msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz!"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "The wagon's inventory is not empty."
msgstr "Das Inventar dieses Waggons ist nicht leer."
-#: advtrains/wagons.lua
-#, fuzzy
+#: wagons.lua
msgid "This Wagon ID"
-msgstr "Der Waggon ist voll."
+msgstr "Dieser Wagen ID"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon has no seats."
msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is full."
msgstr "Der Waggon ist voll."
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "Train ID"
-msgstr ""
+msgstr "Zug-ID"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
-msgstr ""
+msgstr "Zugübersicht / Kupplungssteuerung nur im Stillstand verfügbar."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview /coupling control:"
-msgstr ""
+msgstr "Zugübersicht / Kupplungssteuerung:"
-#: advtrains/wagons.lua
-msgid "Uninitialized init="
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Uninitialized, removing"
-msgstr ""
+msgstr "Nicht initialisiert, entferne"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon @1 ownership changed from @2 to @3"
-msgstr ""
+msgstr "Besitzer von Waggon @1 geändert von @2 auf @3"
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
+msgid "Wagon placeholder"
+msgstr "Waggon-Platzhalter"
+
+#: wagons.lua
msgid "Wagon properties"
msgstr "Waggon-Einstellungen"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon road number:"
-msgstr ""
+msgstr "Wagennummer:"
-#: advtrains/wagons.lua
+#: 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."
@@ -674,378 +668,199 @@ 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
+#: wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr "Sie haben keinen Zugang zum Führerstand."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You can't get on this wagon."
msgstr "Sie können nicht in diesen Waggon einsteigen."
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "Ihnen fehlt das „@1“-Privileg."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You have been given ownership of wagon @1"
-msgstr ""
-
-#: 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
-msgid "Set point speed restriction:"
-msgstr ""
-
-#: 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 advtrains_line_automation/stoprail.lua
-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 "Closed"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Dep. Speed"
-msgstr "Zielgeschwindigkeit bei Abfahrt"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Delay"
-msgstr "Zeit für die Türschließung"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Side"
-msgstr "Türseite"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Kick out passengers"
-msgstr "Fahrgäste zum Ausstieg zwingen"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Left"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Next Stop:\n"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Reverse train"
-msgstr "Zug Umkehren"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Right"
-msgstr ""
-
-#: 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
-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
-msgid "Station/Stop Track"
-msgstr "Gleis zur Kennzeichnung einer Haltestelle"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Stop Time"
-msgstr "Wartezeit"
-
-#: 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."
+msgstr "Sie sind nun der Besitzer von Waggon @1"
-#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
-msgid "Track"
-msgstr "Gleis"
+#~ msgid "3-way turnout"
+#~ msgstr "Dreiwegweiche"
-#: advtrains_line_automation/stoprail.lua
-msgid "Trains stopping here (ARS rules)"
-msgstr ""
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Kreuzung mit einem achsenparallelen Gleis"
-#: advtrains_line_automation/stoprail.lua
-msgid "Unknown Station"
-msgstr ""
+#~ msgid "ATC controller"
+#~ msgstr "Zugbeeinflussungsgleis"
-#: advtrains_line_automation/stoprail.lua
-msgid "Wait for signal to clear"
-msgstr ""
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Kanal: @2"
-#: advtrains_luaautomation/active_common.lua
-msgid "Clear Local Environment"
-msgstr ""
+#~ msgid "Access to @1"
+#~ msgstr "Zugang zu @1"
-#: advtrains_luaautomation/active_common.lua
-msgid "Code"
-msgstr ""
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Große Industrielle Lokomotive"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC Environment"
-msgstr ""
+#~ msgid "Box Wagon"
+#~ msgstr "Güterwaggon"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
+#~ msgid "Bumper"
+#~ msgstr "Prellbock"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to environment '@1'"
-msgstr ""
+#~ msgid ""
+#~ "Can place and configure LuaATC components, including execute potentially "
+#~ "harmful Lua code"
+#~ msgstr ""
+#~ "Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
+#~ "Programme ausführen)"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component with error: @1"
-msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind "
+#~ "geschlossen."
-#: advtrains_luaautomation/active_common.lua
-msgid "Unconfigured LuaATC component"
-msgstr "Nicht konfiguierter LuaATC-Bauteil"
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt."
-#: 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."
+#~ msgid "Command (on)"
+#~ msgstr "Befehl (wenn aktiviert)"
-#: advtrains_luaautomation/init.lua
-msgid ""
-"Can place and configure LuaATC components, including execute potentially "
-"harmful Lua code"
-msgstr ""
-"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
-"Programme ausführen)"
+#~ msgid "Default Seat"
+#~ msgstr "Standardsitzplatz"
-#: advtrains_luaautomation/mesecon_controller.lua
-msgid "LuaATC Mesecon Controller"
-msgstr ""
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Standardsitzplatz (Führerstand)"
-#: advtrains_luaautomation/operation_panel.lua
-msgid "LuaATC Operation Panel"
-msgstr ""
+#~ msgid "Dep. Speed"
+#~ msgstr "Zielgeschwindigkeit bei Abfahrt"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"Passive Component Naming Tool\n"
-"\n"
-"Right-click to name a passive component."
-msgstr ""
-"PC-Benennungswerkzeug\n"
-"\n"
-"Rechtsklick zur Benennung der passiven Komponente."
+#~ msgid "Deprecated Track"
+#~ msgstr "ausrangiertes Gleis, nicht verwenden."
-#: advtrains_luaautomation/pcnaming.lua
-msgid "Set name of component (empty to clear)"
-msgstr ""
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Detaillierte Dampflokomotive"
-#: 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."
+#~ msgid "Detector Rail"
+#~ msgstr "Detektorgleis"
-#: advtrains_signals_japan/init.lua
-msgid "Caution"
-msgstr ""
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Diagonale Gleiskreuzung"
-#: advtrains_signals_japan/init.lua
-msgid "Clear (proceed)"
-msgstr ""
+#~ msgid "Door Delay"
+#~ msgstr "Zeit für die Türschließung"
-#: advtrains_signals_japan/init.lua
-msgid "Danger (halt)"
-msgstr ""
+#~ msgid "Door Side"
+#~ msgstr "Türseite"
-#: advtrains_signals_japan/init.lua
#, fuzzy
-msgid "Japanese signal pole"
-msgstr "Japanischer Personenzug-Passagierwaggon"
+#~ msgid "Driver Stand"
+#~ msgstr "Führerstand"
-#: advtrains_signals_japan/init.lua
-msgid "Reduced speed"
-msgstr ""
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Führerstand Links"
-#: advtrains_signals_japan/init.lua
-msgid "Restricted speed"
-msgstr ""
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Führerstand Rechts"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Distant Signal ("
-msgstr ""
+#~ msgid "Driver stand"
+#~ msgstr "Führerstand"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Main Signal ("
-msgstr ""
-
-#: advtrains_train_industrial/init.lua
-msgid "Big Industrial Train Engine"
-msgstr "Große Industrielle Lokomotive"
-
-#: advtrains_train_industrial/init.lua advtrains_train_japan/init.lua
-#: advtrains_train_steam/init.lua advtrains_train_subway/init.lua
-#, fuzzy
-msgid "Driver Stand"
-msgstr "Führerstand"
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Industrielle Lokomotive"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (left)"
-msgstr "Führerstand Links"
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Tankwaggon"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (right)"
-msgstr "Führerstand Rechts"
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Holztransportwaggon"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial Train Engine"
-msgstr "Industrielle Lokomotive"
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Japanische Personenzug-Lokomotive"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial tank wagon"
-msgstr "Tankwaggon"
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial wood wagon"
-msgstr "Holztransportwaggon"
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
-#: advtrains_train_japan/init.lua advtrains_train_subway/init.lua
-msgid "Driver stand"
-msgstr "Führerstand"
-
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Engine"
-msgstr "Japanische Personenzug-Lokomotive"
-
-#: 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_japan/init.lua advtrains_train_steam/init.lua
-#: advtrains_train_subway/init.lua
#, fuzzy
-msgid "Passenger area"
-msgstr "Passagierwaggon"
+#~ msgid "Japanese signal pole"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
-#: advtrains_train_steam/init.lua
-msgid "Box Wagon"
-msgstr "Güterwaggon"
+#~ msgid "Kick out passengers"
+#~ msgstr "Fahrgäste zum Ausstieg zwingen"
-#: advtrains_train_steam/init.lua
-msgid "Detailed Steam Engine"
-msgstr "Detaillierte Dampflokomotive"
+#~ msgid "Loading Track"
+#~ msgstr "Beladungsgleis"
-#: advtrains_train_steam/init.lua
-msgid "Passenger Wagon"
-msgstr "Passagierwaggon"
+#~ msgid "Lock couples"
+#~ msgstr "Kupplungen sperren"
-#: advtrains_train_steam/init.lua
-msgid "Steam Engine"
-msgstr "Dampflokomotive"
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
-#: advtrains_train_subway/init.lua
-msgid "Subway Passenger Wagon"
-msgstr "U-Bahn-Waggon"
+#~ msgid "Passenger Wagon"
+#~ msgstr "Passagierwaggon"
-#: advtrains_train_track/init.lua
-msgid "3-way turnout"
-msgstr "Dreiwegweiche"
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "Passagierwaggon"
-#: advtrains_train_track/init.lua
-msgid "90+Angle Diamond Crossing Track"
-msgstr "Kreuzung mit einem achsenparallelen Gleis"
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "PC-Benennungswerkzeug\n"
+#~ "\n"
+#~ "Rechtsklick zur Benennung der passiven Komponente."
-#: advtrains_train_track/init.lua
-msgid "ATC controller"
-msgstr "Zugbeeinflussungsgleis"
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
-#: advtrains_train_track/init.lua
-msgid "Bumper"
-msgstr "Prellbock"
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Geschwindigkeitskontrollgleis"
-#: advtrains_train_track/init.lua
-msgid "Detector Rail"
-msgstr "Detektorgleis"
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Geschwindigkeitskontrolle: @1"
-#: advtrains_train_track/init.lua
-msgid "Diagonal Diamond Crossing Track"
-msgstr "Diagonale Gleiskreuzung"
+#~ msgid "Reverse train"
+#~ msgstr "Zug Umkehren"
-#: advtrains_train_track/init.lua
-msgid "Loading Track"
-msgstr "Beladungsgleis"
+#~ msgid "Signal"
+#~ msgstr "Lichtsignal"
-#: advtrains_train_track/init.lua
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+#~ msgid "Speed:"
+#~ msgstr "Geschw.:"
-#: advtrains_train_track/init.lua
-msgid "Unloading Track"
-msgstr "Abladungsgleis"
+#~ msgid "Station Code"
+#~ msgstr "Kennzeichen der Haltestelle"
-#: advtrains_train_track/init.lua
-msgid "Y-turnout"
-msgstr "Y-Weiche"
+#~ msgid "Station Name"
+#~ msgstr "Name der Haltestelle"
-#~ msgid ""
-#~ "ATC controller, mode @1\n"
-#~ "Channel: @2"
+#~ msgid "Station code \"@1\" already exists and is owned by @2."
#~ msgstr ""
-#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
-#~ "Kanal: @2"
-
-#~ msgid "Access to @1"
-#~ msgstr "Zugang zu @1"
-
-#~ msgid "Can't get on: wagon full or doors closed!"
-#~ msgstr ""
-#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind "
-#~ "geschlossen."
-
-#~ msgid "Can't place: protected position!"
-#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt."
+#~ "Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird "
+#~ "von @2 verwaltet."
-#~ msgid "Default Seat"
-#~ msgstr "Standardsitzplatz"
+#~ msgid "Station/Stop Track"
+#~ msgstr "Gleis zur Kennzeichnung einer Haltestelle"
-#~ msgid "Default Seat (driver stand)"
-#~ msgstr "Standardsitzplatz (Führerstand)"
-
-#~ msgid "Deprecated Track"
-#~ msgstr "ausrangiertes Gleis, nicht verwenden."
+#~ msgid "Steam Engine"
+#~ msgstr "Dampflokomotive"
-#~ msgid "Lock couples"
-#~ msgstr "Kupplungen sperren"
+#~ msgid "Stop Time"
+#~ msgstr "Wartezeit"
-#~ msgid "Speed:"
-#~ msgstr "Geschw.:"
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "U-Bahn-Waggon"
#~ msgid "Target:"
#~ msgstr "Zielges.:"
@@ -1053,19 +868,58 @@ msgstr "Y-Weiche"
#~ msgid "This position is protected!"
#~ msgstr "Diese Position ist geschützt!"
+#~ 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."
+
#~ msgid "This track can not be changed."
#~ msgstr "Dieses Gleis kann nicht geändert werden."
+#~ msgid "Track"
+#~ msgstr "Gleis"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Abladungsgleis"
+
#~ msgid "Use Sneak+rightclick to bypass closed doors!"
#~ msgstr ""
#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen "
#~ "einzusteigen."
+#~ msgid "Y-turnout"
+#~ msgstr "Y-Weiche"
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
#, fuzzy
#~ msgid "You are not allowed to modify this protected track."
#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
#~ 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."
+
+#~ msgid ""
#~ "You need to own at least one neighboring wagon to destroy this couple."
#~ msgstr ""
#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln."
diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po
index d773a98..b2a54da 100644
--- a/advtrains/po/fr.po
+++ b/advtrains/po/fr.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2025-03-25 15:40+0100\n"
+"POT-Creation-Date: 2025-06-10 21:40+0200\n"
"PO-Revision-Date: 2025-03-25 15:06+0100\n"
"Last-Translator: Tanavit <tanavit@posto.ovh>\n"
"Language-Team: French\n"
@@ -12,94 +12,87 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr "Avertissement commande ATC Éjecter : portes closes."
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: train moving."
msgstr "Avertissement commande ATC Éjecter : train en mouvement."
-#: advtrains/atc.lua
+#: 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
+#: atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
-#: advtrains/atc.lua
+#: 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
-msgid ""
-"ATC controller, mode @1\n"
-"Command: @2"
+#: atc.lua
+#, fuzzy
+msgid "ATC controller, Command: @1"
msgstr ""
"Controlleur ATC, mode @1\n"
"Commande : @2"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Command"
msgstr "Commande"
-#: advtrains/atc.lua
-msgid "Command (on)"
-msgstr "Commande (marche)"
-
-#: advtrains/atc.lua
+#: atc.lua
msgid "Digiline channel"
msgstr "Canal Digiline"
-#: advtrains/atc.lua advtrains/wagons.lua
-#: advtrains_line_automation/stoprail.lua
-#: advtrains_luaautomation/active_common.lua
+#: atc.lua wagons.lua
msgid "Save"
msgstr "Sauvegarder"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Unconfigured ATC controller"
msgstr "Controlleur ATC, non-configuré"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr "La fin du train serait hors voie : annulation."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such lua entity."
msgstr "Pas de telle entité lua."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such train: @1."
msgstr "Pas de tel train : @1."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such wagon: @1."
msgstr "Pas de tel wagon : @1."
-#: advtrains/copytool.lua
+#: 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
+#: 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
+#: copytool.lua
msgid "The clipboard is empty."
msgstr "Le presse-papier est vide."
-#: advtrains/copytool.lua
+#: 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
+#: copytool.lua
msgid "Train copied."
msgstr "Train copié."
-#: advtrains/copytool.lua
+#: copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -112,72 +105,67 @@ msgstr ""
"\n"
"Clic-Droit : collage"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "You do not have the @1 privilege."
msgstr "Vous ne possédez pas le privilège \"@1\"."
-#: advtrains/couple.lua
+#: couple.lua
msgid "<No coupler>"
msgstr "<Pas de coupleur>"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Attelage à tampon et vis"
-#: advtrains/couple.lua
+#: 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
+#: couple.lua
+msgid ""
+"Cannot couple @1 and @2 - train would have length @3 which is above the "
+"limit of @4"
+msgstr ""
+
+#: couple.lua
msgid "Scharfenberg Coupler"
msgstr "Attelage Scharfenberg"
-#: advtrains/couple.lua
+#: 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/craft_items.lua
+#: craft_items.lua
msgid "Boiler"
msgstr "Chaudière à vapeur"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Chimney"
msgstr "Cheminée"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Driver's cab"
msgstr "Cabine de pilotage"
-#: advtrains/craft_items.lua
+#: craft_items.lua
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"
+#: init.lua
+#, fuzzy
+msgid "Advtrains Status: no_action @1 slowdown @2 (log @3)"
msgstr "État d'advtrains : aucune action"
-#: advtrains/init.lua
+#: init.lua
msgid "Advtrains is already running normally!"
msgstr "Advtrains fonctionne déjà correctement !"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
@@ -186,7 +174,7 @@ msgstr ""
"sauvegarde de terminaison pour éviter l'enregistrement de données "
"corrompues !"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
@@ -196,11 +184,11 @@ msgstr ""
"rechargés !"
# Routage est il le bon terme ?
-#: advtrains/init.lua
+#: init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr "Suppression et recalcul de tous les routages"
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
@@ -208,60 +196,62 @@ 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
+#: init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr "Désactive temporairement le pas global d'advtrains"
-#: advtrains/init.lua
+#: init.lua
msgid "Disabled advtrains successfully"
msgstr "Succès de la désactivation d'advtrains"
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Print advtrains status info"
msgstr "Affiche les informations d'état d'advtrains"
-#: advtrains/init.lua
+#: init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr "Réacivation du pas global d'advtrains..."
-#: advtrains/init.lua
+#: init.lua
msgid "Reload successful!"
msgstr "Succès du rechargement !"
-#: advtrains/init.lua
+#: init.lua
msgid "Removing unused wagon"
msgstr "Suppression d'un wagon inutilisé"
-#: advtrains/init.lua
+#: init.lua
msgid "Restoring saved state in 1 second..."
msgstr "Restauration du l'état sauvegardé dans une seconde..."
-#: advtrains/init.lua
+#: 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: "
+#: init.lua
+#, fuzzy
+msgid "Saving failed: @1"
msgstr "Échec de sauvegarde : "
# Routage est il le bon terme ?
-#: advtrains/init.lua
+#: init.lua
msgid "Successfully invalidated train routes"
msgstr "Succès d'invalidation des routages des trains"
-#: advtrains/init.lua
-msgid "Teleporting to train "
+#: init.lua
+#, fuzzy
+msgid "Teleporting to train @1"
msgstr "Téléportation au train "
-#: advtrains/init.lua
+#: 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
+#: 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!"
@@ -269,56 +259,55 @@ 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."
+#: init.lua
+#, fuzzy
+msgid "Train @1 does not exist or is invalid"
+msgstr " n'existe pas ou est invalide"
-#: advtrains/init.lua
+#: init.lua
+#, fuzzy
msgid ""
-"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
+"Train @1 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"
+#: init.lua
+msgid "Train @1 is at @2"
+msgstr ""
-#: advtrains/misc_nodes.lua
+#: init.lua
+msgid "from wagon_save table."
+msgstr "de la table wagon_save."
+
+#: misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "Quai @1 (haut, 45°)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "Quai @1 (haut)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low)"
msgstr "Quai @1 (bas)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Quai @1 (bas, 45°)"
-#: advtrains/protection.lua
+#: 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
+#: 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
+#: protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
@@ -326,34 +315,34 @@ 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
+#: protection.lua
msgid "Can place, remove and operate trains"
msgstr "Possibilité de poser, retirer ou opérer les trains"
-#: advtrains/protection.lua
+#: 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
+#: 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
+#: 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
+#: 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
+#: protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
@@ -361,72 +350,76 @@ msgstr ""
"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
"\"railway_operator\" manquant)"
-#: advtrains/signals.lua
+#: signals.lua
msgid "Andrew's Cross"
msgstr "Croix de Saint André"
-#: advtrains/signals.lua
-msgid "Lampless Signal"
+#: signals.lua
+#, fuzzy
+msgid "Lampless Signal (deprecated!)"
msgstr "Sémaphore"
-#: advtrains/signals.lua
-msgid "Signal"
-msgstr "Signal"
+#: signals.lua
+msgid "Signal (deprecated!)"
+msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (left)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (left) (deprecated!)"
msgstr "Signal mural (gauche)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (right)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (right) (deprecated!)"
msgstr "Signal mural (droit)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (top)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (top) (deprecated!)"
msgstr "Signal mural (plafond)"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "@1 Slope"
msgstr "Pente @1"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: Not enough slope items left (@1 required)"
msgstr ""
"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: There's no slope of length @1"
msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: no supporting node at upper end."
msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure."
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: not pointing at node"
msgstr "Placement impossible : ne pointe pas un nœud"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "Can't place: space occupied!"
msgstr "Placement impossible : espace occupé !"
-#: advtrains/track_reg_helper.lua advtrains/tracks.lua
+#: track_reg_helper.lua tracks.lua
msgid "This track can not be removed!"
msgstr "Cette voie ne peut pas être enlevée !"
-#: advtrains/trackplacer.lua
+#: 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
+#: 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
+#: trackplacer.lua
msgid "This track can not be rotated!"
msgstr "Cette voie ne peut pas être tournée !"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -439,33 +432,33 @@ msgstr ""
"\n"
"Clic-Droit : tourne l'objet"
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "Position is occupied by a train."
msgstr "Cet emplacement est occupé par un train."
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Signal Influence Point here."
msgstr "Il y a un \"Signal Influence Point\" ici."
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Track Circuit Break here."
msgstr "Il y a un \"Track Circuit Break\" ici."
-#: advtrains/trainhud.lua
+#: trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
"Franchissement de signal rouge : examinez la situation et inversez le sens "
"de marche du train."
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Insufficient privileges to use this!"
msgstr "Privilèges insuffisants pour utiliser ceci !"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Wagon Properties Tool"
msgstr "Outil de propriété du wagon"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid ""
"Wagon Properties Tool\n"
"Punch a wagon to view and edit the Wagon Properties"
@@ -473,45 +466,41 @@ msgstr ""
"Outil de propriété du wagon\n"
"Frappez un wagon pour voir et modifier ses propriétés"
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "!!! Train off track !!!"
msgstr "!!! Train hors voie !!!"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "(Doors closed)"
msgstr "(Portes closes)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Allow these players to access your wagon:"
msgstr "Autoriser ces joueurs à embarquer :"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr "Effacer le drapeau \"Désactiver l'ARS\""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Current FC: "
msgstr "Code de fret courant: "
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
@@ -519,159 +508,160 @@ msgstr ""
"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour "
"franchir les portes et débarquer."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Freight Code:"
msgstr "Code de frêt :"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off"
msgstr "Débarquer"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off (forced)"
msgstr "Débarquer (de force)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Line"
msgstr "Ligne"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: "
msgstr "Liquide : "
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: empty"
msgstr "Liquide : vide"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Missing train_operator privilege"
msgstr "Privilège \"train_operator\" manquant"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Next FC:"
msgstr "Code de fret suivant :"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not a valid wagon id."
msgstr "Identificateur de wagon invalide."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not allowed to do this."
msgstr "Vous n'êtes pas autorisé effectuer ceci."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Onboard Computer"
msgstr "Ordinateur embarqué"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Please specify a player name to transfer ownership to."
msgstr ""
"Spécifiez le nom du joueur à qui la propriété doit être transférée, SVP."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Prev FC"
msgstr "Code de fret précédent"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Remote Routesetting"
msgstr "Routage à distance"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Routingcode"
msgstr "Code de routage"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Save wagon properties"
msgstr "Sauvegarder les propriétés du wagon"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Select seat:"
msgstr "Choisir le siège :"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Show Inventory"
msgstr "Montrer le stock"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed inside train"
msgstr "Texte affiché à l'intérieur du train"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed outside on train"
msgstr "Texte affiché à l'extérieur du train"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That player does not exist!"
msgstr "Ce joueur n'existe pas !"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That wagon does not exist!"
msgstr "Ce wagon n'a pas de siège !"
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "The wagon's inventory is not empty."
msgstr "Le stock de ce wagon n'est pas vide."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This Wagon ID"
msgstr "Identificateur du wagon"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon has no seats."
msgstr "Ce wagon n'a pas de siège."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is full."
msgstr "Ce wagon est plein."
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "Train ID"
msgstr "Identificateur du train"
-#: advtrains/wagons.lua
+#: 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
+#: wagons.lua
msgid "Train overview /coupling control:"
msgstr "Aperçu du train / commande d'accouplement :"
-#: advtrains/wagons.lua
-msgid "Uninitialized init="
-msgstr "Variable init non initialisée"
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Uninitialized, removing"
msgstr "Non initialisé, retiré"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon @1 ownership changed from @2 to @3"
msgstr "La propriété du wagon @1 a été transférée de @2 à @3"
-#: advtrains/wagons.lua
+#: 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/wagons.lua
+#: wagons.lua
+#, fuzzy
+msgid "Wagon placeholder"
+msgstr ", dans un espace réservé"
+
+#: wagons.lua
msgid "Wagon properties"
msgstr "Propriétés du wagon"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon road number:"
msgstr "Immatriculation du wagon :"
-#: advtrains/wagons.lua
+#: 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."
@@ -680,377 +670,270 @@ msgstr ""
"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement "
"(Sneak)\" et Clic-Gauche."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr "Accès interdit au poste de pilotage."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You can't get on this wagon."
msgstr "Montée impossible dans ce wagon."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You don't have the train_operator privilege."
msgstr "Vous ne possédez pas le privilège \"train_operator\"."
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You have been given ownership of wagon @1"
msgstr "La propriété du wagon @1 vous a été transférée"
-#: advtrains_interlocking/routesetting.lua
-msgid "Route state changed."
-msgstr "Changement d'état de l'itinéraire."
+#~ msgid " is at "
+#~ msgstr " est à la position "
-#: advtrains_interlocking/tsr_rail.lua
-msgid "Point Speed Restriction Track"
-msgstr "Voie de point de limitation de vitesse"
+#~ msgid " wagon:destroy(): data is not set!"
+#~ msgstr " Appel de wagon:destroy() : données non définies !"
-#: advtrains_interlocking/tsr_rail.lua
-msgid "Point speed restriction: @1"
-msgstr "Point de limitation de vitesse : @1"
+#~ msgid "(log"
+#~ msgstr "(log"
-#: advtrains_interlocking/tsr_rail.lua
-msgid "Set point speed restriction:"
-msgstr "Placez un point de limitation de vitesse :"
+#~ msgid "3-way turnout"
+#~ msgstr "Embranchement triple"
-#: 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."
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculo-diagonal"
-#: 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."
+#~ msgid "ATC controller"
+#~ msgstr "Controlleur ATC"
-#: advtrains_line_automation/scheduler.lua
-msgid "No callback to handle schedule"
-msgstr "Absence de fonction de gestion de planning"
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Canal : @2"
-#: advtrains_line_automation/stoprail.lua
-msgid "Closed"
-msgstr "Fermé"
+#~ msgid "Access to @1"
+#~ msgstr "Accès à @1"
-#: advtrains_line_automation/stoprail.lua
-msgid "Dep. Speed"
-msgstr "Vit. de départ"
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Grosse locomotive industrielle"
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Delay"
-msgstr "Durée d'ouverture des portes"
+#~ msgid "Box Wagon"
+#~ msgstr "Wagon de frêt"
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Side"
-msgstr "Ouv. des portes coté"
+#~ msgid "Bumper"
+#~ msgstr "Heurtoir"
-#: advtrains_line_automation/stoprail.lua
-msgid "Kick out passengers"
-msgstr "Éjecter les passagers"
+#~ 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_line_automation/stoprail.lua
-msgid "Left"
-msgstr "Gauche"
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !"
-#: advtrains_line_automation/stoprail.lua
-msgid "Next Stop:\n"
-msgstr "Prochain arrêt :\n"
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Placement impossible : emplacement protégé"
-#: advtrains_line_automation/stoprail.lua
-msgid "Reverse train"
-msgstr "Inversion du sens de marche"
+#~ msgid "Caution"
+#~ msgstr "Attention"
-#: advtrains_line_automation/stoprail.lua
-msgid "Right"
-msgstr "Droit"
+#~ msgid "Clear (proceed)"
+#~ msgstr "Autorisation (procédez)"
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Code"
-msgstr "Code de Station"
+#~ msgid "Clear Local Environment"
+#~ msgstr "Effacer l'environnement LuaATC"
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Name"
-msgstr "Nom de Station"
+#~ msgid "Closed"
+#~ msgstr "Fermé"
-#: 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."
+#~ msgid "Code"
+#~ msgstr "Code"
-#: advtrains_line_automation/stoprail.lua
-msgid "Station/Stop Track"
-msgstr "Voie d'arrêt en station"
+#~ msgid "Command (on)"
+#~ msgstr "Commande (marche)"
-#: advtrains_line_automation/stoprail.lua
-msgid "Stop Time"
-msgstr "Durée d'arrêt"
+#~ msgid "Danger (halt)"
+#~ msgstr "Danger (stop)"
-#: 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."
+#~ msgid "Default Seat"
+#~ msgstr "Siège par défaut"
-#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
-msgid "Track"
-msgstr "Voie"
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Siège par défaut (poste de pilotage)"
-#: advtrains_line_automation/stoprail.lua
-msgid "Trains stopping here (ARS rules)"
-msgstr "Trains marquant l'arrêt (règles ARS)"
+#~ msgid "Dep. Speed"
+#~ msgstr "Vit. de départ"
-#: advtrains_line_automation/stoprail.lua
-msgid "Unknown Station"
-msgstr "Gare inconnue"
+#~ msgid "Deprecated Track"
+#~ msgstr "Voie déconseillée"
-#: advtrains_line_automation/stoprail.lua
-msgid "Wait for signal to clear"
-msgstr "En attente de signal d'autorisation"
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Locomotive à vapeur complexe"
-#: advtrains_luaautomation/active_common.lua
-msgid "Clear Local Environment"
-msgstr "Effacer l'environnement LuaATC"
+#~ msgid "Detector Rail"
+#~ msgstr "Voie détectrice"
-#: advtrains_luaautomation/active_common.lua
-msgid "Code"
-msgstr "Code"
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Croisement diagonal"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC Environment"
-msgstr "Environnement LuaATC"
+#~ msgid "Door Delay"
+#~ msgstr "Durée d'ouverture des portes"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to an invalid environment"
-msgstr "Composant LuaATC assigné à un environnement invalide"
+#~ msgid "Door Side"
+#~ msgstr "Ouv. des portes coté"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to environment '@1'"
-msgstr "Composant LuaATC assigné à l'environnement '@1'"
+#~ msgid "Driver Stand"
+#~ msgstr "Poste de pilotage"
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component with error: @1"
-msgstr "Erreur @1 du composant LuaATC"
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Poste de pilotage (gauche)"
-#: advtrains_luaautomation/active_common.lua
-msgid "Unconfigured LuaATC component"
-msgstr "Composant LuaATC non configuré"
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Poste de pilotage (droit)"
-#: 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."
+#~ msgid "Driver stand"
+#~ msgstr "Poste de pilotage"
-#: 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"
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Locomotive industrielle"
-#: advtrains_luaautomation/mesecon_controller.lua
-msgid "LuaATC Mesecon Controller"
-msgstr "Commande Mesecon de LuaATC"
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Wagon-citerne industriel"
-#: advtrains_luaautomation/operation_panel.lua
-msgid "LuaATC Operation Panel"
-msgstr "Panneau de commande de LuaATC"
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Wagon grumier industriel"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"Passive Component Naming Tool\n"
-"\n"
-"Right-click to name a passive component."
-msgstr ""
-"Outil de nommage de composant passif\n"
-"\n"
-"Clic-Droit pour nommer un composant passif."
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Motrice Japonaise"
-#: advtrains_luaautomation/pcnaming.lua
-msgid "Set name of component (empty to clear)"
-msgstr "Nommer le composant (chaîne vide pour effacer)"
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Passage inter-voiture de train Japonais"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"You are not allowed to name LuaATC passive components without the @1 "
-"privilege."
-msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
-
-#: advtrains_signals_japan/init.lua
-msgid "Caution"
-msgstr "Attention"
-
-#: advtrains_signals_japan/init.lua
-msgid "Clear (proceed)"
-msgstr "Autorisation (procédez)"
-
-#: advtrains_signals_japan/init.lua
-msgid "Danger (halt)"
-msgstr "Danger (stop)"
-
-#: advtrains_signals_japan/init.lua
-msgid "Japanese signal pole"
-msgstr "Voiture Japonaise"
-
-#: advtrains_signals_japan/init.lua
-msgid "Reduced speed"
-msgstr "Vitesse réduite"
-
-#: advtrains_signals_japan/init.lua
-msgid "Restricted speed"
-msgstr "Vitesse limitée"
-
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Distant Signal ("
-msgstr "Signal distant métro de Munich ("
-
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Main Signal ("
-msgstr "Signal principal métro de Munich ("
-
-#: advtrains_train_industrial/init.lua
-msgid "Big Industrial Train Engine"
-msgstr "Grosse locomotive industrielle"
-
-#: advtrains_train_industrial/init.lua advtrains_train_japan/init.lua
-#: advtrains_train_steam/init.lua advtrains_train_subway/init.lua
-msgid "Driver Stand"
-msgstr "Poste de pilotage"
-
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (left)"
-msgstr "Poste de pilotage (gauche)"
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Voiture Japonaise"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (right)"
-msgstr "Poste de pilotage (droit)"
+#~ msgid "Japanese signal pole"
+#~ msgstr "Voiture Japonaise"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial Train Engine"
-msgstr "Locomotive industrielle"
+#~ msgid "Kick out passengers"
+#~ msgstr "Éjecter les passagers"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial tank wagon"
-msgstr "Wagon-citerne industriel"
+#~ msgid "Left"
+#~ msgstr "Gauche"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial wood wagon"
-msgstr "Wagon grumier industriel"
+#~ msgid "Left,Right,Closed;"
+#~ msgstr "Gauche,Droit,Fermé;"
-#: advtrains_train_japan/init.lua advtrains_train_subway/init.lua
-msgid "Driver stand"
-msgstr "Poste de pilotage"
+#~ msgid "Loading Track"
+#~ msgstr "Voie de Chargement"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Engine"
-msgstr "Motrice Japonaise"
+#~ msgid "Lock couples"
+#~ msgstr "Verrouiller l'accouplement"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "Passage inter-voiture de train Japonais"
+#~ msgid "LuaATC Environment"
+#~ msgstr "Environnement LuaATC"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Wagon"
-msgstr "Voiture Japonaise"
+#~ msgid "LuaATC Mesecon Controller"
+#~ msgstr "Commande Mesecon de LuaATC"
-#: advtrains_train_japan/init.lua advtrains_train_steam/init.lua
-#: advtrains_train_subway/init.lua
-msgid "Passenger area"
-msgstr "Voiture Passager"
+#~ msgid "LuaATC Operation Panel"
+#~ msgstr "Panneau de commande de LuaATC"
-#: advtrains_train_steam/init.lua
-msgid "Box Wagon"
-msgstr "Wagon de frêt"
+#~ msgid "LuaATC component assigned to an invalid environment"
+#~ msgstr "Composant LuaATC assigné à un environnement invalide"
-#: advtrains_train_steam/init.lua
-msgid "Detailed Steam Engine"
-msgstr "Locomotive à vapeur complexe"
+#~ msgid "LuaATC component assigned to environment '@1'"
+#~ msgstr "Composant LuaATC assigné à l'environnement '@1'"
-#: advtrains_train_steam/init.lua
-msgid "Passenger Wagon"
-msgstr "Voiture passager"
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "Erreur @1 du composant LuaATC"
-#: advtrains_train_steam/init.lua
-msgid "Steam Engine"
-msgstr "Locomotive à vapeur"
+#~ msgid "Munich U-Bahn Distant Signal ("
+#~ msgstr "Signal distant métro de Munich ("
-#: advtrains_train_subway/init.lua
-msgid "Subway Passenger Wagon"
-msgstr "Voiture de Métropolitain"
+#~ msgid "Munich U-Bahn Main Signal ("
+#~ msgstr "Signal principal métro de Munich ("
-#: advtrains_train_track/init.lua
-msgid "3-way turnout"
-msgstr "Embranchement triple"
+#~ msgid "Next Stop:\n"
+#~ msgstr "Prochain arrêt :\n"
-#: advtrains_train_track/init.lua
-msgid "90+Angle Diamond Crossing Track"
-msgstr "Croisement perpendiculo-diagonal"
+#~ msgid "No callback to handle schedule"
+#~ msgstr "Absence de fonction de gestion de planning"
-#: advtrains_train_track/init.lua
-msgid "ATC controller"
-msgstr "Controlleur ATC"
+#~ msgid "Passenger Wagon"
+#~ msgstr "Voiture passager"
-#: advtrains_train_track/init.lua
-msgid "Bumper"
-msgstr "Heurtoir"
+#~ msgid "Passenger area"
+#~ msgstr "Voiture Passager"
-#: advtrains_train_track/init.lua
-msgid "Detector Rail"
-msgstr "Voie détectrice"
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "Outil de nommage de composant passif\n"
+#~ "\n"
+#~ "Clic-Droit pour nommer un composant passif."
-#: advtrains_train_track/init.lua
-msgid "Diagonal Diamond Crossing Track"
-msgstr "Croisement diagonal"
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculaire"
-#: advtrains_train_track/init.lua
-msgid "Loading Track"
-msgstr "Voie de Chargement"
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Voie de point de limitation de vitesse"
-#: advtrains_train_track/init.lua
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "Croisement perpendiculaire"
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Point de limitation de vitesse : @1"
-#: advtrains_train_track/init.lua
-msgid "Unloading Track"
-msgstr "Voie de Déchargement"
+#~ msgid "Reduced speed"
+#~ msgstr "Vitesse réduite"
-#: advtrains_train_track/init.lua
-msgid "Y-turnout"
-msgstr "Embranchement en Y"
+#~ msgid "Restricted speed"
+#~ msgstr "Vitesse limitée"
-#~ msgid ", using placeholder"
-#~ msgstr ", dans un espace réservé"
+#~ msgid "Reverse train"
+#~ msgstr "Inversion du sens de marche"
-#~ msgid ""
-#~ "ATC controller, mode @1\n"
-#~ "Channel: @2"
-#~ msgstr ""
-#~ "Controlleur ATC, mode @1\n"
-#~ "Canal : @2"
+#~ msgid "Right"
+#~ msgstr "Droit"
-#~ msgid "Access to @1"
-#~ msgstr "Accès à @1"
+#~ msgid "Route state changed."
+#~ msgstr "Changement d'état de l'itinéraire."
-#~ msgid "Can't get on: wagon full or doors closed!"
-#~ msgstr ""
-#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !"
+#~ msgid "Set name of component (empty to clear)"
+#~ msgstr "Nommer le composant (chaîne vide pour effacer)"
-#~ msgid "Can't place: protected position!"
-#~ msgstr "Placement impossible : emplacement protégé"
+#~ msgid "Set point speed restriction:"
+#~ msgstr "Placez un point de limitation de vitesse :"
-#~ msgid "Default Seat"
-#~ msgstr "Siège par défaut"
+#~ msgid "Signal"
+#~ msgstr "Signal"
-#~ msgid "Default Seat (driver stand)"
-#~ msgstr "Siège par défaut (poste de pilotage)"
+#~ msgid "Speed:"
+#~ msgstr "Vitesse : "
-#~ msgid "Deprecated Track"
-#~ msgstr "Voie déconseillée"
+#~ msgid "Station Code"
+#~ msgstr "Code de Station"
-#~ msgid "Left,Right,Closed;"
-#~ msgstr "Gauche,Droit,Fermé;"
+#~ msgid "Station Name"
+#~ msgstr "Nom de Station"
-#~ msgid "Lock couples"
-#~ msgstr "Verrouiller l'accouplement"
+#~ msgid "Station code \"@1\" already exists and is owned by @2."
+#~ msgstr "Le code de station \"@1\" existe et est possédé par @2."
-#~ msgid "Speed:"
-#~ msgstr "Vitesse : "
+#~ msgid "Station/Stop Track"
+#~ msgstr "Voie d'arrêt en station"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Locomotive à vapeur"
+
+#~ msgid "Stop Time"
+#~ msgstr "Durée d'arrêt"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "Voiture de Métropolitain"
#~ msgid "Target:"
#~ msgstr "Destination : "
@@ -1062,23 +945,80 @@ msgstr "Embranchement en Y"
#~ msgid "This position is protected!"
#~ msgstr "Cet emplacement est protégé !"
+#~ 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."
+
#~ msgid "This track can not be changed."
#~ msgstr "Cette voie ne peut pas être modifiée."
+#~ msgid "Track"
+#~ msgstr "Voie"
+
+#~ msgid "Train"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train "
+#~ msgstr "Identificateur du train "
+
+#~ msgid "Trains stopping here (ARS rules)"
+#~ msgstr "Trains marquant l'arrêt (règles ARS)"
+
#~ msgid "Unable to load wagon type"
#~ msgstr "Impossible de charger le type du wagon"
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Composant LuaATC non configuré"
+
+#~ msgid "Uninitialized init="
+#~ msgstr "Variable init non initialisée"
+
+#~ msgid "Unknown Station"
+#~ msgstr "Gare inconnue"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Voie de Déchargement"
+
#~ msgid "Use Sneak+rightclick to bypass closed doors!"
#~ msgstr ""
#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les "
#~ "portes closes !"
+#~ msgid "Wait for signal to clear"
+#~ msgstr "En attente de signal d'autorisation"
+
+#~ msgid "Y-turnout"
+#~ msgstr "Embranchement en Y"
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
#, fuzzy
#~ msgid "You are not allowed to modify this protected track."
#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé"
#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
+
+#~ msgid ""
#~ "You need to own at least one neighboring wagon to destroy this couple."
#~ msgstr ""
#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer "
#~ "cet attelage."
+
+#~ msgid "slowdown"
+#~ msgstr "ralentissement"
diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh
index 4c22c85..3228037 100755
--- a/advtrains/po/update-translations.sh
+++ b/advtrains/po/update-translations.sh
@@ -1,25 +1,24 @@
#!/bin/sh
-# NOTE: Please make sure you also have basic_trains installed, as it uses attrans for historical reasons
+
+MODNAME="advtrains"
+MSGID_BUGS_ADDR='advtrains-discuss@lists.sr.ht'
PODIR=`dirname "$0"`
-ATDIR="$PODIR/../.."
-BTDIR="$ATDIR/../basic_trains"
-POTFILE="$PODIR/advtrains.pot"
+ATDIR="$PODIR/.."
+POTFILE="$PODIR/$MODNAME.pot"
xgettext \
-D "$ATDIR" \
- -D "$BTDIR" \
- -d advtrains \
+ -d "$MODNAME" \
-o "$POTFILE" \
-p . \
-L lua \
--add-location=file \
--from-code=UTF-8 \
--sort-by-file \
- --keyword='attrans' \
--keyword='S' \
- --package-name='advtrains' \
- --msgid-bugs-address='advtrains-discuss@lists.sr.ht' \
+ --package-name="$MODNAME" \
+ --msgid-bugs-address="$MSGID_BUGS_ADDR" \
`find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \
&&
for i in "$PODIR"/*.po; do
diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po
index f1a3c0f..4fa4502 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: 2025-03-25 15:40+0100\n"
+"POT-Creation-Date: 2025-06-10 21:40+0200\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,94 +12,87 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: train moving."
msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Reverse command warning: didn't reverse train, train moving."
msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr "ATC 语法错误:未知命令:@1"
-#: advtrains/atc.lua
+#: 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"
+#: atc.lua
+#, fuzzy
+msgid "ATC controller, Command: @1"
msgstr ""
"ATC 控制器\n"
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua
-msgid "Command (on)"
-msgstr "命令 (激活时)"
-
-#: advtrains/atc.lua
+#: atc.lua
msgid "Digiline channel"
msgstr "Digiline 频道"
-#: advtrains/atc.lua advtrains/wagons.lua
-#: advtrains_line_automation/stoprail.lua
-#: advtrains_luaautomation/active_common.lua
+#: atc.lua wagons.lua
msgid "Save"
msgstr "保存"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Unconfigured ATC controller"
msgstr "ATC 控制器 (未配置)"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr "火车后部不在轨道上。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such lua entity."
msgstr "您没有指向一个可以用火车复制工具复制的物体。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such train: @1."
msgstr "ID 为“@1”的列车不存在。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such wagon: @1."
msgstr "ID 为“@1”的车厢不存在。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr "无法复制:剪贴板无法访问元数据。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr "无法粘贴:剪贴板无法访问元数据。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard is empty."
msgstr "剪贴板是空的。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The track you are trying to place the wagon on is not long enough."
msgstr "轨道太短。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Train copied."
msgstr "已复制列车。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -111,301 +104,295 @@ msgstr ""
"左键单击:复制\n"
"右键单击:粘帖"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "You do not have the @1 privilege."
msgstr "您没有“@1”权限。"
-#: advtrains/couple.lua
+#: couple.lua
msgid "<No coupler>"
msgstr "<没有车钩>"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Buffer and Chain Coupler"
msgstr "链式车钩"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
-#: advtrains/couple.lua
+#: couple.lua
+msgid ""
+"Cannot couple @1 and @2 - train would have length @3 which is above the "
+"limit of @4"
+msgstr ""
+
+#: couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式车钩"
-#: advtrains/couple.lua
+#: couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr "您没有“train_operator”权限,不能连接这两节车厢。"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Boiler"
msgstr "锅炉"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Chimney"
msgstr "烟囱"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Driver's cab"
msgstr "驾驶室"
-#: advtrains/craft_items.lua
+#: craft_items.lua
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"
+#: init.lua
+msgid "Advtrains Status: no_action @1 slowdown @2 (log @3)"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Advtrains is already running normally!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Disabled advtrains successfully"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Print advtrains status info"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Reload successful!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Removing unused wagon"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Returns the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
-msgid "Saving failed: "
+#: init.lua
+msgid "Saving failed: @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Successfully invalidated train routes"
msgstr ""
-#: advtrains/init.lua
-msgid "Teleporting to train "
+#: init.lua
+msgid "Teleporting to train @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
+#: 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"
+#: init.lua
+msgid "Train @1 does not exist or is invalid"
msgstr ""
-#: advtrains/init.lua
-#, fuzzy
-msgid "Train "
-msgstr "已复制列车。"
-
-#: advtrains/init.lua
-msgid "from wagon_save table."
+#: init.lua
+msgid ""
+"Train @1 had no wagons left because of some bug. It is being deleted. Wave "
+"it goodbye!"
msgstr ""
-#: advtrains/init.lua
-msgid ""
-"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
+#: init.lua
+msgid "Train @1 is at @2"
msgstr ""
-#: advtrains/init.lua
-msgid "slowdown"
+#: init.lua
+msgid "from wagon_save table."
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "较高的@1站台 (45°)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "较高的@1站台"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low)"
msgstr "较低的@1站台"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "较低的@1站台 (45°)"
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place and dig tracks in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build near tracks at this protected position."
msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build tracks at this protected position."
msgstr "这里已被保护,您不能在这里建造铁路。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr "您没有“train_operator”权限,不能在这里建造铁路。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
-#: advtrains/signals.lua
+#: signals.lua
msgid "Andrew's Cross"
msgstr "铁路道口信号灯"
-#: advtrains/signals.lua
-msgid "Lampless Signal"
+#: signals.lua
+#, fuzzy
+msgid "Lampless Signal (deprecated!)"
msgstr "臂板信号机"
-#: advtrains/signals.lua
-msgid "Signal"
-msgstr "信号灯"
+#: signals.lua
+msgid "Signal (deprecated!)"
+msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (left)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (left) (deprecated!)"
msgstr "壁挂式信号灯 (左侧)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (right)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (right) (deprecated!)"
msgstr "壁挂式信号灯 (右侧)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (top)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (top) (deprecated!)"
msgstr "悬挂式信号灯"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "@1 Slope"
msgstr "@1斜坡"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: Not enough slope items left (@1 required)"
msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: There's no slope of length @1"
msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: no supporting node at upper end."
msgstr "无法放置斜坡:较高端没有支撑方块。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: not pointing at node"
msgstr "无法放置斜坡:您没有选择任何方块。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: space occupied!"
msgstr "无法放置斜坡:此区域已被占用。"
-#: advtrains/track_reg_helper.lua advtrains/tracks.lua
+#: track_reg_helper.lua tracks.lua
#, fuzzy
msgid "This track can not be removed!"
msgstr "您不能移除这段轨道。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be changed using the trackworker!"
msgstr "您不能使用铁路调整工具调整这个方块。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be rotated using the trackworker!"
msgstr "您不能使用铁路调整工具旋转这个方块。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This track can not be rotated!"
msgstr "您不能旋转这段轨道。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -417,234 +404,231 @@ msgstr ""
"左键单击:切换轨道类型\n"
"右键单击:旋转方块"
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Signal Influence Point here."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/trainhud.lua
+#: trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
#, fuzzy
msgid "Wagon Properties Tool"
msgstr "车厢属性"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid ""
"Wagon Properties Tool\n"
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid " units"
msgstr ""
-#: advtrains/wagons.lua
-msgid " wagon:destroy(): data is not set!"
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "!!! Train off track !!!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "(Doors closed)"
msgstr "(车门已关闭)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Current FC: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
msgstr "车门已关闭,请使用潜行+右键单击下车。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Freight Code:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off"
msgstr "下车"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off (forced)"
msgstr "强制下车"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Line"
msgstr "火车线路"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: empty"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Missing train_operator privilege"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Next FC:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not a valid wagon id."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "Not allowed to do this."
msgstr "您不能调整这段轨道。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Please specify a player name to transfer ownership to."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Prev FC"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Remote Routesetting"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Routingcode"
msgstr "路由码"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Save wagon properties"
msgstr "保存车厢属性"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Select seat:"
msgstr "请选择座位:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Show Inventory"
msgstr "显示物品栏"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed inside train"
msgstr "车厢内部显示"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed outside on train"
msgstr "车厢外部显示"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That player does not exist!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "That wagon does not exist!"
msgstr "这节车厢没有座位。"
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr "轨道太短。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "This Wagon ID"
msgstr "车厢已满。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon has no seats."
msgstr "这节车厢没有座位。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is full."
msgstr "车厢已满。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr "这是 @1 的车厢,您不能摧毁它。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train ID"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview /coupling control:"
msgstr ""
-#: advtrains/wagons.lua
-msgid "Uninitialized init="
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Uninitialized, removing"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon @1 ownership changed from @2 to @3"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
+#, fuzzy
+msgid "Wagon placeholder"
+msgstr "车厢属性"
+
+#: wagons.lua
msgid "Wagon properties"
msgstr "车厢属性"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon road number:"
msgstr ""
-#: advtrains/wagons.lua
+#: 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."
@@ -652,371 +636,174 @@ msgstr ""
"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按"
"潜行键并左键单击此车厢。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You can't get on this wagon."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "您没有“@1”权限。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You have been given ownership of wagon @1"
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
-msgid "Set point speed restriction:"
-msgstr ""
-
-#: advtrains_interlocking/tsr_rail.lua
-msgid "You are not allowed to configure this track without the @1 privilege."
-msgstr "您没有“@1”权限,不能调整这段轨道。"
+#~ msgid "3-way turnout"
+#~ msgstr "三开道岔"
-#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
-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 "Closed"
-msgstr ""
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
-#: advtrains_line_automation/stoprail.lua
-msgid "Dep. Speed"
-msgstr "出发速度"
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Delay"
-msgstr "车门关闭时间"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Side"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Kick out passengers"
-msgstr "踢出乘客"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Left"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Next Stop:\n"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Reverse train"
-msgstr "改变行车方向"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Right"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Code"
-msgstr "车站代码"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Name"
-msgstr "车站名称"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station/Stop Track"
-msgstr "车站轨道"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Stop Time"
-msgstr "停站时间"
-
-#: 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 advtrains_train_track/init.lua
-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_line_automation/stoprail.lua
-msgid "Wait for signal to clear"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Clear Local Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Code"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
-
-#: 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/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 部件。"
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "频道:@2"
-#: advtrains_luaautomation/init.lua
-msgid ""
-"Can place and configure LuaATC components, including execute potentially "
-"harmful Lua code"
-msgstr ""
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
-#: advtrains_luaautomation/mesecon_controller.lua
-msgid "LuaATC Mesecon Controller"
-msgstr ""
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工业用火车头"
-#: advtrains_luaautomation/operation_panel.lua
-msgid "LuaATC Operation Panel"
-msgstr ""
+#~ msgid "Box Wagon"
+#~ msgstr "货运车厢"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"Passive Component Naming Tool\n"
-"\n"
-"Right-click to name a passive component."
-msgstr ""
-"被动元件命名工具\n"
-"\n"
-"右键单击命名所选元件。"
+#~ msgid "Bumper"
+#~ msgstr "保险杠"
-#: advtrains_luaautomation/pcnaming.lua
-msgid "Set name of component (empty to clear)"
-msgstr ""
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "无法上车:车门已关闭或车厢已满。"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"You are not allowed to name LuaATC passive components without the @1 "
-"privilege."
-msgstr "您没有“@1”权限,不能命名被动元件。"
+#~ msgid "Can't place: protected position!"
+#~ msgstr "无法放置:此区域已被保护。"
-#: advtrains_signals_japan/init.lua
-msgid "Caution"
-msgstr ""
+#~ msgid "Command (on)"
+#~ msgstr "命令 (激活时)"
-#: advtrains_signals_japan/init.lua
-msgid "Clear (proceed)"
-msgstr ""
+#~ msgid "Default Seat"
+#~ msgstr "默认座位"
-#: advtrains_signals_japan/init.lua
-msgid "Danger (halt)"
-msgstr ""
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "默认座位 (司机座位)"
-#: advtrains_signals_japan/init.lua
-#, fuzzy
-msgid "Japanese signal pole"
-msgstr "高速列车车厢"
+#~ msgid "Dep. Speed"
+#~ msgstr "出发速度"
-#: advtrains_signals_japan/init.lua
-msgid "Reduced speed"
-msgstr ""
+#~ msgid "Deprecated Track"
+#~ msgstr "请不要使用"
-#: advtrains_signals_japan/init.lua
-msgid "Restricted speed"
-msgstr ""
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精细的蒸汽机车"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Distant Signal ("
-msgstr ""
+#~ msgid "Detector Rail"
+#~ msgstr "探测轨道"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Main Signal ("
-msgstr ""
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉轨道"
-#: advtrains_train_industrial/init.lua
-msgid "Big Industrial Train Engine"
-msgstr "大型工业用火车头"
+#~ msgid "Door Delay"
+#~ msgstr "车门关闭时间"
-#: advtrains_train_industrial/init.lua advtrains_train_japan/init.lua
-#: advtrains_train_steam/init.lua advtrains_train_subway/init.lua
#, fuzzy
-msgid "Driver Stand"
-msgstr "司机座位"
+#~ msgid "Driver Stand"
+#~ msgstr "司机座位"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (left)"
-msgstr "左侧司机座位"
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左侧司机座位"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (right)"
-msgstr "右侧司机座位"
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右侧司机座位"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial Train Engine"
-msgstr "工业用火车头"
+#~ msgid "Driver stand"
+#~ msgstr "司机座位"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial tank wagon"
-msgstr "液体运输车厢"
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工业用火车头"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial wood wagon"
-msgstr "木材运输车厢"
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液体运输车厢"
-#: advtrains_train_japan/init.lua advtrains_train_subway/init.lua
-msgid "Driver stand"
-msgstr "司机座位"
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材运输车厢"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Engine"
-msgstr "高速列车车头"
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列车车头"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火车车钩"
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火车车钩"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Wagon"
-msgstr "高速列车车厢"
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列车车厢"
-#: advtrains_train_japan/init.lua advtrains_train_steam/init.lua
-#: advtrains_train_subway/init.lua
#, fuzzy
-msgid "Passenger area"
-msgstr "客车"
-
-#: advtrains_train_steam/init.lua
-msgid "Box Wagon"
-msgstr "货运车厢"
-
-#: advtrains_train_steam/init.lua
-msgid "Detailed Steam Engine"
-msgstr "精细的蒸汽机车"
-
-#: advtrains_train_steam/init.lua
-msgid "Passenger Wagon"
-msgstr "客车"
-
-#: advtrains_train_steam/init.lua
-msgid "Steam Engine"
-msgstr "蒸汽机车"
-
-#: advtrains_train_subway/init.lua
-msgid "Subway Passenger Wagon"
-msgstr "地铁车厢"
-
-#: advtrains_train_track/init.lua
-msgid "3-way turnout"
-msgstr "三开道岔"
-
-#: advtrains_train_track/init.lua
-msgid "90+Angle Diamond Crossing Track"
-msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
-
-#: advtrains_train_track/init.lua
-msgid "ATC controller"
-msgstr "ATC 控制器"
-
-#: advtrains_train_track/init.lua
-msgid "Bumper"
-msgstr "保险杠"
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列车车厢"
-#: advtrains_train_track/init.lua
-msgid "Detector Rail"
-msgstr "探测轨道"
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
-#: advtrains_train_track/init.lua
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉轨道"
+#~ msgid "Loading Track"
+#~ msgstr "装货轨道"
-#: advtrains_train_track/init.lua
-msgid "Loading Track"
-msgstr "装货轨道"
-
-#: advtrains_train_track/init.lua
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉轨道"
+#~ msgid "Lock couples"
+#~ msgstr "锁定连接处"
-#: advtrains_train_track/init.lua
-msgid "Unloading Track"
-msgstr "卸货轨道"
+#~ msgid "Passenger Wagon"
+#~ msgstr "客车"
-#: advtrains_train_track/init.lua
-msgid "Y-turnout"
-msgstr "对称道岔"
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客车"
#~ msgid ""
-#~ "ATC controller, mode @1\n"
-#~ "Channel: @2"
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
#~ msgstr ""
-#~ "ATC 控制器\n"
-#~ "模式:@1\n"
-#~ "频道:@2"
+#~ "被动元件命名工具\n"
+#~ "\n"
+#~ "右键单击命名所选元件。"
-#~ msgid "Access to @1"
-#~ msgstr "可前往@1"
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉轨道"
-#~ msgid "Can't get on: wagon full or doors closed!"
-#~ msgstr "无法上车:车门已关闭或车厢已满。"
+#~ msgid "Reverse train"
+#~ msgstr "改变行车方向"
-#~ msgid "Can't place: protected position!"
-#~ msgstr "无法放置:此区域已被保护。"
+#~ msgid "Signal"
+#~ msgstr "信号灯"
-#~ msgid "Default Seat"
-#~ msgstr "默认座位"
+#~ msgid "Speed:"
+#~ msgstr "速度"
-#~ msgid "Default Seat (driver stand)"
-#~ msgstr "默认座位 (司机座位)"
+#~ msgid "Station Code"
+#~ msgstr "车站代码"
-#~ msgid "Deprecated Track"
-#~ msgstr "请不要使用"
+#~ msgid "Station Name"
+#~ msgstr "车站名称"
-#~ msgid "Lock couples"
-#~ msgstr "锁定连接处"
+#~ msgid "Station/Stop Track"
+#~ msgstr "车站轨道"
-#~ msgid "Speed:"
-#~ msgstr "速度"
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽机车"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站时间"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地铁车厢"
#~ msgid "Target:"
#~ msgstr "目标速度"
@@ -1031,13 +818,46 @@ msgstr "对称道岔"
#~ msgid "This track can not be changed."
#~ msgstr "您不能调整这段轨道。"
+#~ msgid "Track"
+#~ msgstr "轨道"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已复制列车。"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 部件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸货轨道"
+
#~ msgid "Use Sneak+rightclick to bypass closed doors!"
#~ msgstr "请使用潜行+右键上车。"
+#~ msgid "Y-turnout"
+#~ msgstr "对称道岔"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您没有“@1”权限,不能调整这段轨道。"
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "您不能调整这段轨道。"
+
#, fuzzy
#~ msgid "You are not allowed to modify this protected track."
#~ msgstr "这里已被保护,您不能在这里建造铁路。"
#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能命名被动元件。"
+
+#~ msgid ""
#~ "You need to own at least one neighboring wagon to destroy this couple."
#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。"
diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po
index ec65737..b46de64 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: 2025-03-25 15:40+0100\n"
+"POT-Creation-Date: 2025-06-10 21:40+0200\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,94 +12,87 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Kick command warning: train moving."
msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC Reverse command warning: didn't reverse train, train moving."
msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
-#: advtrains/atc.lua
+#: atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr "ATC 語法錯誤:未知命令:@1"
-#: advtrains/atc.lua
+#: 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"
+#: atc.lua
+#, fuzzy
+msgid "ATC controller, Command: @1"
msgstr ""
"ATC 控制器\n"
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua
-msgid "Command (on)"
-msgstr "命令 (啟用時)"
-
-#: advtrains/atc.lua
+#: atc.lua
msgid "Digiline channel"
msgstr "Digiline 頻道"
-#: advtrains/atc.lua advtrains/wagons.lua
-#: advtrains_line_automation/stoprail.lua
-#: advtrains_luaautomation/active_common.lua
+#: atc.lua wagons.lua
msgid "Save"
msgstr "儲存"
-#: advtrains/atc.lua
+#: atc.lua
msgid "Unconfigured ATC controller"
msgstr "ATC 控制器 (未配置)"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr "火車後部不在軌道上。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such lua entity."
msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such train: @1."
msgstr "ID 為「@1」的列車不存在。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "No such wagon: @1."
msgstr "ID 為「@1」的車廂不存在。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr "無法複製:剪貼簿無法訪問元資料。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr "無法貼上:剪貼簿無法訪問元資料。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The clipboard is empty."
msgstr "剪貼簿是空的。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "The track you are trying to place the wagon on is not long enough."
msgstr "軌道太短。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "Train copied."
msgstr "已複製火車。"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -111,301 +104,295 @@ msgstr ""
"左鍵單擊:複製\n"
"右鍵單擊:粘帖"
-#: advtrains/copytool.lua
+#: copytool.lua
msgid "You do not have the @1 privilege."
msgstr "您沒有「@1」許可權。"
-#: advtrains/couple.lua
+#: couple.lua
msgid "<No coupler>"
msgstr "<無連結器>"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Buffer and Chain Coupler"
msgstr "鏈式連結器"
-#: advtrains/couple.lua
+#: couple.lua
msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
-#: advtrains/couple.lua
+#: couple.lua
+msgid ""
+"Cannot couple @1 and @2 - train would have length @3 which is above the "
+"limit of @4"
+msgstr ""
+
+#: couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式連結器"
-#: advtrains/couple.lua
+#: couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Boiler"
msgstr "鍋爐"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Chimney"
msgstr "煙囪"
-#: advtrains/craft_items.lua
+#: craft_items.lua
msgid "Driver's cab"
msgstr "駕駛室"
-#: advtrains/craft_items.lua
+#: craft_items.lua
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"
+#: init.lua
+msgid "Advtrains Status: no_action @1 slowdown @2 (log @3)"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Advtrains is already running normally!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""
-#: advtrains/init.lua
+#: 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
+#: init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Disabled advtrains successfully"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Print advtrains status info"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Reload successful!"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Removing unused wagon"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Returns the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
-msgid "Saving failed: "
+#: init.lua
+msgid "Saving failed: @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Successfully invalidated train routes"
msgstr ""
-#: advtrains/init.lua
-msgid "Teleporting to train "
+#: init.lua
+msgid "Teleporting to train @1"
msgstr ""
-#: advtrains/init.lua
+#: init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""
-#: advtrains/init.lua
+#: 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"
+#: init.lua
+msgid "Train @1 does not exist or is invalid"
msgstr ""
-#: advtrains/init.lua
-#, fuzzy
-msgid "Train "
-msgstr "已複製火車。"
-
-#: advtrains/init.lua
-msgid "from wagon_save table."
+#: init.lua
+msgid ""
+"Train @1 had no wagons left because of some bug. It is being deleted. Wave "
+"it goodbye!"
msgstr ""
-#: advtrains/init.lua
-msgid ""
-"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
+#: init.lua
+msgid "Train @1 is at @2"
msgstr ""
-#: advtrains/init.lua
-msgid "slowdown"
+#: init.lua
+msgid "from wagon_save table."
msgstr ""
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "較高的@1月臺 (45°)"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "較高的@1月臺"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low)"
msgstr "較低的@1月臺"
-#: advtrains/misc_nodes.lua
+#: misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "較低的@1月臺 (45°)"
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place and dig tracks in unprotected areas"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build near tracks at this protected position."
msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
-#: advtrains/protection.lua
+#: protection.lua
msgid "You are not allowed to build tracks at this protected position."
msgstr "這裡已被保護,您不能在這裡建造鐵路。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。"
-#: advtrains/protection.lua
+#: protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
-#: advtrains/signals.lua
+#: signals.lua
msgid "Andrew's Cross"
msgstr "平交道號誌燈"
-#: advtrains/signals.lua
-msgid "Lampless Signal"
+#: signals.lua
+#, fuzzy
+msgid "Lampless Signal (deprecated!)"
msgstr "臂木式號誌機"
-#: advtrains/signals.lua
-msgid "Signal"
-msgstr "色燈號誌機"
+#: signals.lua
+msgid "Signal (deprecated!)"
+msgstr ""
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (left)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (left) (deprecated!)"
msgstr "壁掛式色燈號誌機 (左側)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (right)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (right) (deprecated!)"
msgstr "壁掛式色燈號誌機 (右側)"
-#: advtrains/signals.lua
-msgid "Wallmounted Signal (top)"
+#: signals.lua
+#, fuzzy
+msgid "Wallmounted Signal (top) (deprecated!)"
msgstr "懸掛式色燈號誌機"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
msgid "@1 Slope"
msgstr "@1斜坡"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: Not enough slope items left (@1 required)"
msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: There's no slope of length @1"
msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: no supporting node at upper end."
msgstr "無法放置斜坡:較高階沒有支撐方塊。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: not pointing at node"
msgstr "無法放置斜坡:您沒有選擇任何方塊。"
-#: advtrains/track_reg_helper.lua
+#: track_reg_helper.lua
#, fuzzy
msgid "Can't place: space occupied!"
msgstr "無法放置斜坡:此區域已被佔用。"
-#: advtrains/track_reg_helper.lua advtrains/tracks.lua
+#: track_reg_helper.lua tracks.lua
#, fuzzy
msgid "This track can not be removed!"
msgstr "您不能移除這段軌道。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be changed using the trackworker!"
msgstr "您不能使用鐵路調整工具調整這個方塊。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This node can't be rotated using the trackworker!"
msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
#, fuzzy
msgid "This track can not be rotated!"
msgstr "您不能旋轉這段軌道。"
-#: advtrains/trackplacer.lua
+#: trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -417,234 +404,231 @@ msgstr ""
"左鍵單擊:切換軌道型別\n"
"右鍵單擊:旋轉方塊"
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Signal Influence Point here."
msgstr ""
-#: advtrains/tracks.lua
+#: tracks.lua
msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/trainhud.lua
+#: trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
#, fuzzy
msgid "Wagon Properties Tool"
msgstr "車廂屬性"
-#: advtrains/wagonprop_tool.lua
+#: wagonprop_tool.lua
msgid ""
"Wagon Properties Tool\n"
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid " units"
msgstr ""
-#: advtrains/wagons.lua
-msgid " wagon:destroy(): data is not set!"
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "!!! Train off track !!!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "(Doors closed)"
msgstr "(車門已關閉)"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Current FC: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Freight Code:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off"
msgstr "下車"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Get off (forced)"
msgstr "強制下車"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Line"
msgstr "火車線路"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: "
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Liquid: empty"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Missing train_operator privilege"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Next FC:"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Not a valid wagon id."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "Not allowed to do this."
msgstr "您不能調整這段軌道。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Please specify a player name to transfer ownership to."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Prev FC"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Remote Routesetting"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Routingcode"
msgstr "路由碼"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Save wagon properties"
msgstr "儲存車廂屬性"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Select seat:"
msgstr "請選擇座位:"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Show Inventory"
msgstr "顯示物品欄"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed inside train"
msgstr "車廂內部顯示"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Text displayed outside on train"
msgstr "車廂外部顯示"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "That player does not exist!"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "That wagon does not exist!"
msgstr "這節車廂沒有座位。"
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr "軌道太短。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "This Wagon ID"
msgstr "車廂已滿。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon has no seats."
msgstr "這節車廂沒有座位。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is full."
msgstr "車廂已滿。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr "這是 @1 的車廂,您不能摧毀它。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train ID"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Train overview /coupling control:"
msgstr ""
-#: advtrains/wagons.lua
-msgid "Uninitialized init="
-msgstr ""
-
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Uninitialized, removing"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon @1 ownership changed from @2 to @3"
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
+#, fuzzy
+msgid "Wagon placeholder"
+msgstr "車廂屬性"
+
+#: wagons.lua
msgid "Wagon properties"
msgstr "車廂屬性"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "Wagon road number:"
msgstr ""
-#: advtrains/wagons.lua
+#: 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."
@@ -652,371 +636,174 @@ msgstr ""
"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按"
"潛行鍵並左鍵單擊此車廂。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You can't get on this wagon."
msgstr ""
-#: advtrains/wagons.lua
+#: wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "您沒有「@1」許可權。"
-#: advtrains/wagons.lua
+#: wagons.lua
msgid "You have been given ownership of wagon @1"
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
-msgid "Set point speed restriction:"
-msgstr ""
-
-#: advtrains_interlocking/tsr_rail.lua
-msgid "You are not allowed to configure this track without the @1 privilege."
-msgstr "您沒有「@1」許可權,不能調整這段軌道。"
+#~ msgid "3-way turnout"
+#~ msgstr "三開道岔"
-#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
-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 "Closed"
-msgstr ""
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
-#: advtrains_line_automation/stoprail.lua
-msgid "Dep. Speed"
-msgstr "出發速度"
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Delay"
-msgstr "車門關閉時間"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Door Side"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Kick out passengers"
-msgstr "踢出乘客"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Left"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Next Stop:\n"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Reverse train"
-msgstr "改變行車方向"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Right"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Code"
-msgstr "車站碼"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station Name"
-msgstr "車站名稱"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Station/Stop Track"
-msgstr "車站軌道"
-
-#: advtrains_line_automation/stoprail.lua
-msgid "Stop Time"
-msgstr "停站時間"
-
-#: 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 advtrains_train_track/init.lua
-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_line_automation/stoprail.lua
-msgid "Wait for signal to clear"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Clear Local Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "Code"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC Environment"
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua
-msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
-
-#: 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/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 元件。"
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "頻道:@2"
-#: advtrains_luaautomation/init.lua
-msgid ""
-"Can place and configure LuaATC components, including execute potentially "
-"harmful Lua code"
-msgstr ""
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
-#: advtrains_luaautomation/mesecon_controller.lua
-msgid "LuaATC Mesecon Controller"
-msgstr ""
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工業用火車頭"
-#: advtrains_luaautomation/operation_panel.lua
-msgid "LuaATC Operation Panel"
-msgstr ""
+#~ msgid "Box Wagon"
+#~ msgstr "貨運車廂"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"Passive Component Naming Tool\n"
-"\n"
-"Right-click to name a passive component."
-msgstr ""
-"被動元件命名工具\n"
-"\n"
-"右鍵單擊命名所選元件。"
+#~ msgid "Bumper"
+#~ msgstr "保險槓"
-#: advtrains_luaautomation/pcnaming.lua
-msgid "Set name of component (empty to clear)"
-msgstr ""
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "無法上車:車門已關閉或車廂已滿。"
-#: advtrains_luaautomation/pcnaming.lua
-msgid ""
-"You are not allowed to name LuaATC passive components without the @1 "
-"privilege."
-msgstr "您沒有「@1」許可權,不能命名這個元件。"
+#~ msgid "Can't place: protected position!"
+#~ msgstr "無法放置:此區域已被保護。"
-#: advtrains_signals_japan/init.lua
-msgid "Caution"
-msgstr ""
+#~ msgid "Command (on)"
+#~ msgstr "命令 (啟用時)"
-#: advtrains_signals_japan/init.lua
-msgid "Clear (proceed)"
-msgstr ""
+#~ msgid "Default Seat"
+#~ msgstr "預設座位"
-#: advtrains_signals_japan/init.lua
-msgid "Danger (halt)"
-msgstr ""
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "預設座位 (司機座位)"
-#: advtrains_signals_japan/init.lua
-#, fuzzy
-msgid "Japanese signal pole"
-msgstr "高速列車車廂"
+#~ msgid "Dep. Speed"
+#~ msgstr "出發速度"
-#: advtrains_signals_japan/init.lua
-msgid "Reduced speed"
-msgstr ""
+#~ msgid "Deprecated Track"
+#~ msgstr "請不要使用"
-#: advtrains_signals_japan/init.lua
-msgid "Restricted speed"
-msgstr ""
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精細的蒸汽機車"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Distant Signal ("
-msgstr ""
+#~ msgid "Detector Rail"
+#~ msgstr "探測軌道"
-#: advtrains_signals_muc_ubahn/init.lua
-msgid "Munich U-Bahn Main Signal ("
-msgstr ""
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉軌道"
-#: advtrains_train_industrial/init.lua
-msgid "Big Industrial Train Engine"
-msgstr "大型工業用火車頭"
+#~ msgid "Door Delay"
+#~ msgstr "車門關閉時間"
-#: advtrains_train_industrial/init.lua advtrains_train_japan/init.lua
-#: advtrains_train_steam/init.lua advtrains_train_subway/init.lua
#, fuzzy
-msgid "Driver Stand"
-msgstr "司機座位"
+#~ msgid "Driver Stand"
+#~ msgstr "司機座位"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (left)"
-msgstr "左側司機座位"
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左側司機座位"
-#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
-msgid "Driver Stand (right)"
-msgstr "右側司機座位"
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右側司機座位"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial Train Engine"
-msgstr "工業用火車頭"
+#~ msgid "Driver stand"
+#~ msgstr "司機座位"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial tank wagon"
-msgstr "液體運輸車廂"
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工業用火車頭"
-#: advtrains_train_industrial/init.lua
-msgid "Industrial wood wagon"
-msgstr "木材運輸車廂"
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液體運輸車廂"
-#: advtrains_train_japan/init.lua advtrains_train_subway/init.lua
-msgid "Driver stand"
-msgstr "司機座位"
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材運輸車廂"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Engine"
-msgstr "高速列車車頭"
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列車車頭"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火車連結器"
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火車連結器"
-#: advtrains_train_japan/init.lua
-msgid "Japanese Train Wagon"
-msgstr "高速列車車廂"
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列車車廂"
-#: advtrains_train_japan/init.lua advtrains_train_steam/init.lua
-#: advtrains_train_subway/init.lua
#, fuzzy
-msgid "Passenger area"
-msgstr "客車"
-
-#: advtrains_train_steam/init.lua
-msgid "Box Wagon"
-msgstr "貨運車廂"
-
-#: advtrains_train_steam/init.lua
-msgid "Detailed Steam Engine"
-msgstr "精細的蒸汽機車"
-
-#: advtrains_train_steam/init.lua
-msgid "Passenger Wagon"
-msgstr "客車"
-
-#: advtrains_train_steam/init.lua
-msgid "Steam Engine"
-msgstr "蒸汽機車"
-
-#: advtrains_train_subway/init.lua
-msgid "Subway Passenger Wagon"
-msgstr "地鐵車廂"
-
-#: advtrains_train_track/init.lua
-msgid "3-way turnout"
-msgstr "三開道岔"
-
-#: advtrains_train_track/init.lua
-msgid "90+Angle Diamond Crossing Track"
-msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
-
-#: advtrains_train_track/init.lua
-msgid "ATC controller"
-msgstr "ATC 控制器"
-
-#: advtrains_train_track/init.lua
-msgid "Bumper"
-msgstr "保險槓"
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列車車廂"
-#: advtrains_train_track/init.lua
-msgid "Detector Rail"
-msgstr "探測軌道"
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
-#: advtrains_train_track/init.lua
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉軌道"
+#~ msgid "Loading Track"
+#~ msgstr "裝貨軌道"
-#: advtrains_train_track/init.lua
-msgid "Loading Track"
-msgstr "裝貨軌道"
-
-#: advtrains_train_track/init.lua
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉軌道"
+#~ msgid "Lock couples"
+#~ msgstr "鎖定連結處"
-#: advtrains_train_track/init.lua
-msgid "Unloading Track"
-msgstr "卸貨軌道"
+#~ msgid "Passenger Wagon"
+#~ msgstr "客車"
-#: advtrains_train_track/init.lua
-msgid "Y-turnout"
-msgstr "對稱道岔"
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客車"
#~ msgid ""
-#~ "ATC controller, mode @1\n"
-#~ "Channel: @2"
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
#~ msgstr ""
-#~ "ATC 控制器\n"
-#~ "模式:@1\n"
-#~ "頻道:@2"
+#~ "被動元件命名工具\n"
+#~ "\n"
+#~ "右鍵單擊命名所選元件。"
-#~ msgid "Access to @1"
-#~ msgstr "可前往@1"
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉軌道"
-#~ msgid "Can't get on: wagon full or doors closed!"
-#~ msgstr "無法上車:車門已關閉或車廂已滿。"
+#~ msgid "Reverse train"
+#~ msgstr "改變行車方向"
-#~ msgid "Can't place: protected position!"
-#~ msgstr "無法放置:此區域已被保護。"
+#~ msgid "Signal"
+#~ msgstr "色燈號誌機"
-#~ msgid "Default Seat"
-#~ msgstr "預設座位"
+#~ msgid "Speed:"
+#~ msgstr "速度"
-#~ msgid "Default Seat (driver stand)"
-#~ msgstr "預設座位 (司機座位)"
+#~ msgid "Station Code"
+#~ msgstr "車站碼"
-#~ msgid "Deprecated Track"
-#~ msgstr "請不要使用"
+#~ msgid "Station Name"
+#~ msgstr "車站名稱"
-#~ msgid "Lock couples"
-#~ msgstr "鎖定連結處"
+#~ msgid "Station/Stop Track"
+#~ msgstr "車站軌道"
-#~ msgid "Speed:"
-#~ msgstr "速度"
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽機車"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站時間"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地鐵車廂"
#~ msgid "Target:"
#~ msgstr "目標速度"
@@ -1031,13 +818,46 @@ msgstr "對稱道岔"
#~ msgid "This track can not be changed."
#~ msgstr "您不能調整這段軌道。"
+#~ msgid "Track"
+#~ msgstr "軌道"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已複製火車。"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 元件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸貨軌道"
+
#~ msgid "Use Sneak+rightclick to bypass closed doors!"
#~ msgstr "請使用潛行+右鍵上車。"
+#~ msgid "Y-turnout"
+#~ msgstr "對稱道岔"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您沒有「@1」許可權,不能調整這段軌道。"
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "您不能調整這段軌道。"
+
#, fuzzy
#~ msgid "You are not allowed to modify this protected track."
#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能命名這個元件。"
+
+#~ msgid ""
#~ "You need to own at least one neighboring wagon to destroy this couple."
#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。"
diff --git a/advtrains/protection.lua b/advtrains/protection.lua
index ac1cd66..6bb1ccb 100644
--- a/advtrains/protection.lua
+++ b/advtrains/protection.lua
@@ -1,27 +1,29 @@
-- advtrains
-- protection.lua: privileges and rail protection, and some helpers
+-- Get current translator
+local S = advtrains.translate
-- Privileges to control TRAIN DRIVING/COUPLING
minetest.register_privilege("train_operator", {
- description = attrans("Can place, remove and operate trains"),
+ description = S("Can place, remove and operate trains"),
give_to_singleplayer= true,
});
minetest.register_privilege("train_admin", {
- description = attrans("Can place, remove and operate any train, regardless of owner, whitelist, or protection"),
+ description = S("Can place, remove and operate any train, regardless of owner, whitelist, or protection"),
give_to_singleplayer= true,
});
-- Privileges to control TRACK BUILDING
minetest.register_privilege("track_builder", {
- description = attrans("Can place and dig tracks in unprotected areas"),
+ description = S("Can place and dig tracks in unprotected areas"),
give_to_singleplayer= true,
});
-- Privileges to control OPERATING TURNOUTS/SIGNALS
minetest.register_privilege("railway_operator", {
- description = attrans("Can operate turnouts and signals in unprotected areas"),
+ description = S("Can operate turnouts and signals in unprotected areas"),
give_to_singleplayer= true,
});
@@ -145,12 +147,12 @@ function advtrains.check_track_protection(pos, pname, near, prot_p)
--atdebug("CTP: ",pos,pname,near,prot_p,"priv=",priv,"prot=",prot,"dprot=",dprot)
if not priv and (not boo or prot or not dprot) then
- minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks without the track_builder privilege.") or attrans("You are not allowed to build tracks without the track_builder privilege."))
+ minetest.chat_send_player(pname, near and S("You are not allowed to build near tracks without the track_builder privilege.") or S("You are not allowed to build tracks without the track_builder privilege."))
minetest.log("action", pname.." tried to modify terrain "..nears.."track at "..minetest.pos_to_string(apos).." but is not permitted to (no privilege)")
return false
end
if prot then
- minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks at this protected position.") or attrans("You are not allowed to build tracks at this protected position."))
+ minetest.chat_send_player(pname, near and S("You are not allowed to build near tracks at this protected position.") or S("You are not allowed to build tracks at this protected position."))
minetest.record_protection_violation(pos, pname)
minetest.log("action", pname.." tried to modify "..nears.."track at "..minetest.pos_to_string(apos).." but position is protected!")
return false
@@ -181,7 +183,7 @@ function advtrains.check_turnout_signal_protection(pos, pname)
nocheck=false
return true
else
- minetest.chat_send_player(pname, attrans("You are not allowed to operate turnouts and signals without the railway_operator privilege."))
+ minetest.chat_send_player(pname, S("You are not allowed to operate turnouts and signals without the railway_operator privilege."))
minetest.log("action", pname.." tried to operate turnout/signal at "..minetest.pos_to_string(pos).." but does not have railway_operator")
nocheck=false
return false
diff --git a/advtrains/signals.lua b/advtrains/signals.lua
index 35e118c..198507a 100644
--- a/advtrains/signals.lua
+++ b/advtrains/signals.lua
@@ -1,6 +1,9 @@
--advtrains by orwell96
--signals.lua
+-- Get current translator
+local S = advtrains.translate
+
local mrules_wallsignal = advtrains.meseconrules
local function can_dig_func(pos, player)
@@ -59,7 +62,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
tiles = {"advtrains_retrosignal.png"},
inventory_image="advtrains_retrosignal_inv.png",
drop="advtrains:retrosignal_off",
- description=attrans("Lampless Signal"),
+ description=S("Lampless Signal (deprecated!)"),
sunlight_propagates=true,
groups = {
cracky=3,
@@ -122,7 +125,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
tiles = {"advtrains_signal_"..r..".png"},
inventory_image="advtrains_signal_inv.png",
drop="advtrains:signal_off",
- description=attrans("Signal"),
+ description=S("Signal (deprecated!)"),
groups = {
cracky=3,
not_blocking_trains=1,
@@ -177,9 +180,9 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
--tunnel signals. no rotations.
local swdesc = { -- needed for xgettext
- l = attrans("Wallmounted Signal (left)"),
- r = attrans("Wallmounted Signal (right)"),
- t = attrans("Wallmounted Signal (top)"),
+ l = S("Wallmounted Signal (left) (deprecated!)"),
+ r = S("Wallmounted Signal (right) (deprecated!)"),
+ t = S("Wallmounted Signal (top) (deprecated!)"),
}
for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do
minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, {
@@ -258,7 +261,7 @@ minetest.register_node("advtrains:across_off", {
mesh = "advtrains_across.obj",
tiles = {"advtrains_across.png"},
drop="advtrains:across_off",
- description=attrans("Andrew's Cross"),
+ description=S("Andrew's Cross"),
groups = {
cracky=3,
not_blocking_trains=1,
@@ -295,7 +298,7 @@ minetest.register_node("advtrains:across_on", {
mesh = "advtrains_across.obj",
tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}},
drop="advtrains:across_off",
- description=attrans("Andrew's Cross"),
+ description=S("Andrew's Cross"),
groups = {
cracky=3,
not_blocking_trains=1,
diff --git a/advtrains/track_reg_helper.lua b/advtrains/track_reg_helper.lua
index e2f71e8..fe1d11d 100644
--- a/advtrains/track_reg_helper.lua
+++ b/advtrains/track_reg_helper.lua
@@ -4,6 +4,9 @@
-- Note to future: This is actually just a work-saver, avoiding me to port over all the crossing nodes as well as the linetrack tracks.
-- Future track mods should please directly use the appropriate advtrains.register_node_4rot() API and not rely on this!
+-- Get current translator
+local S = advtrains.translate
+
--definition preparation
local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end
@@ -471,7 +474,7 @@ Depending on the number of connections:
local function can_dig_callback(pos, player)
local ok, reason = advtrains.can_dig_or_modify_track(pos)
if not ok and player then
- minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason)
+ minetest.chat_send_player(player:get_player_name(), S("This track can not be removed!") .. " " .. reason)
end
return ok
end
@@ -656,7 +659,7 @@ end
local sl={}
function sl.register_placer(def, preset)
minetest.register_craftitem(":"..def.nodename_prefix.."_slopeplacer",{
- description = attrans("@1 Slope", def.description),
+ description = S("@1 Slope", def.description),
inventory_image = def.texture_prefix.."_slopeplacer.png",
wield_image = def.texture_prefix.."_slopeplacer.png",
groups={},
@@ -667,17 +670,17 @@ end
function sl.create_slopeplacer_on_place(def, preset)
return function(istack, player, pt)
if not pt.type=="node" then
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: not pointing at node"))
return istack
end
local pos=pt.above
if not pos then
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: not pointing at node"))
return istack
end
local node=minetest.get_node(pos)
if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!"))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: space occupied!"))
return istack
end
if not advtrains.check_track_protection(pos, player:get_player_name()) then
@@ -730,17 +733,17 @@ function sl.create_slopeplacer_on_place(def, preset)
pos=vector.subtract(pos, dirvec)
end
else
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: Not enough slope items left (@1 required)", step))
end
else
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: There's no slope of length @1",step))
end
return istack
end
step=step+1
pos=vector.add(pos, dirvec)
end
- minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end."))
+ minetest.chat_send_player(player:get_player_name(), S("Can't place: no supporting node at upper end."))
return itemstack
end
end
diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua
index 3278b8c..0bcde77 100644
--- a/advtrains/trackplacer.lua
+++ b/advtrains/trackplacer.lua
@@ -1,6 +1,9 @@
--trackplacer.lua
--holds code for the track-placing system. the default 'track' item will be a craftitem that places rails as needed. this will neither place or change switches nor place vertical rails.
+-- Get current translator
+local S = advtrains.translate
+
--all new trackplacer code
local tp={
groups={}
@@ -237,7 +240,7 @@ end
minetest.register_craftitem("advtrains:trackworker",{
- description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate object"),
+ description = S("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate object"),
groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
inventory_image = "advtrains_trackworker.png",
wield_image = "advtrains_trackworker.png",
@@ -260,7 +263,7 @@ minetest.register_craftitem("advtrains:trackworker",{
local ndef = minetest.registered_nodes[node.name]
if not ndef.advtrains or not ndef.advtrains.trackworker_next_rot then
- minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!"))
+ minetest.chat_send_player(placer:get_player_name(), S("This node can't be rotated using the trackworker!"))
return
end
@@ -269,7 +272,7 @@ minetest.register_craftitem("advtrains:trackworker",{
-- is a track, we can query
local can_modify, reason = advtrains.can_dig_or_modify_track(pos)
if not can_modify then
- local str = attrans("This track can not be rotated!")
+ local str = S("This track can not be rotated!")
if reason then
str = str .. " " .. reason
end
@@ -309,7 +312,7 @@ minetest.register_craftitem("advtrains:trackworker",{
local ndef = minetest.registered_nodes[node.name]
if not ndef.advtrains or not ndef.advtrains.trackworker_next_var then
- minetest.chat_send_player(name, attrans("This node can't be changed using the trackworker!"))
+ minetest.chat_send_player(name, S("This node can't be changed using the trackworker!"))
return
end
@@ -318,7 +321,7 @@ minetest.register_craftitem("advtrains:trackworker",{
-- is a track, we can query
local can_modify, reason = advtrains.can_dig_or_modify_track(pos)
if not can_modify then
- local str = attrans("This track can not be rotated!")
+ local str = S("This track can not be rotated!")
if reason then
str = str .. " " .. reason
end
diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua
index fa7b702..e6d08a7 100644
--- a/advtrains/tracks.lua
+++ b/advtrains/tracks.lua
@@ -1,6 +1,8 @@
-- tracks.lua
-- rewritten with advtrains 2.5 according to new track registration system
+-- Get current translator
+local S = advtrains.translate
--[[
@@ -125,7 +127,7 @@ Switchable nodes (turnouts, single/double-slip switches) are implemented by havi
function advtrains.track_can_dig_callback(pos, player)
local ok, reason = advtrains.can_dig_or_modify_track(pos)
if not ok and player then
- minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason)
+ minetest.chat_send_player(player:get_player_name(), S("This track can not be removed!") .. " " .. reason)
end
return ok
end
@@ -256,17 +258,17 @@ end
-- Impl Note: possibly duplicate code in "self contained TCB" - see interlocking/tcb_ts_ui.lua!
function advtrains.can_dig_or_modify_track(pos)
if advtrains.get_train_at_pos(pos) then
- return false, attrans("Position is occupied by a train.")
+ return false, S("Position is occupied by a train.")
end
-- interlocking: tcb, signal IP a.s.o.
if advtrains.interlocking then
-- TCB?
if advtrains.interlocking.db.get_tcb(pos) then
- return false, attrans("There's a Track Circuit Break here.")
+ return false, S("There's a Track Circuit Break here.")
end
-- signal ip?
if advtrains.interlocking.db.is_ip_at(pos, true) then -- is_ip_at with purge parameter
- return false, attrans("There's a Signal Influence Point here.")
+ return false, S("There's a Signal Influence Point here.")
end
end
return true
diff --git a/advtrains/trainhud.lua b/advtrains/trainhud.lua
index 9d9d475..eeebff0 100644
--- a/advtrains/trainhud.lua
+++ b/advtrains/trainhud.lua
@@ -1,5 +1,8 @@
--trainhud.lua: holds all the code for train controlling
+-- Get current translator
+local S = advtrains.translate
+
local T = advtrains.texture
advtrains.hud = {}
@@ -274,7 +277,7 @@ function advtrains.hud_train_format(train, flip)
hud:add_n7seg(131, 18, 28, 14, lzbdisp.d, 3, lzbdisp.c)
if res and res == 0 then
- table.insert(st, attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again."))
+ table.insert(st, S("OVERRUN RED SIGNAL! Examine situation and reverse train to move again."))
end
if train.atc_command then
diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua
index c49d7e3..c0ac179 100644
--- a/advtrains/trainlogic.lua
+++ b/advtrains/trainlogic.lua
@@ -1,6 +1,9 @@
--trainlogic.lua
--controls train entities stuff about connecting/disconnecting/colliding trains and other things
+-- Get current translator
+local S = advtrains.translate
+
local setting_overrun_mode = minetest.settings:get("advtrains_overrun_mode")
local benchmark=false
diff --git a/advtrains/wagonprop_tool.lua b/advtrains/wagonprop_tool.lua
index 2a4a9e2..f32dd03 100644
--- a/advtrains/wagonprop_tool.lua
+++ b/advtrains/wagonprop_tool.lua
@@ -1,6 +1,10 @@
+
+-- Get current translator
+local S = advtrains.translate
+
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"),
+ description = S("Wagon Properties Tool\nPunch a wagon to view and edit the Wagon Properties"),
+ short_description = S("Wagon Properties Tool"),
groups = {},
inventory_image = "advtrains_wagon_prop_tool.png",
wield_image = "advtrains_wagon_prop_tool.png",
@@ -23,7 +27,7 @@ minetest.register_craftitem("advtrains:wagon_prop_tool",{ --craftitem because it
--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!"))
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
object:show_wagon_properties(pname)
@@ -40,4 +44,4 @@ if minetest.get_modpath("default") then --register recipe
{"","","group:wood"},
}
})
-end \ No newline at end of file
+end
diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua
index 760c7da..52ce577 100644
--- a/advtrains/wagons.lua
+++ b/advtrains/wagons.lua
@@ -7,8 +7,8 @@
-- 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
+-- Get current translator
+local S = advtrains.translate
-- TP delay when getting off wagon
local GETOFF_TP_DELAY = 0.5
@@ -157,7 +157,7 @@ function wagon:ensure_init()
end
end
if not self.noninitticks then
- atwarn("Wagon",self.id,S("Uninitialized init="),self.initialized)
+ atwarn("Wagon",self.id,"Uninitialized init=",self.initialized)
self.noninitticks=0
end
self.noninitticks=self.noninitticks+1
@@ -243,7 +243,7 @@ function wagon:destroy()
if self.id then
local data = advtrains.wagons[self.id]
if not data then
- atwarn(S(" wagon:destroy(): data is not set!"))
+ atwarn(" wagon:destroy(): data is not set!")
return
end
@@ -1481,7 +1481,7 @@ advtrains.register_wagon("advtrains:wagon_placeholder", {
assign_to_seat_group = {},
wagon_span=1,
drops={},
-}, "Wagon placeholder", "advtrains_wagon_placeholder.png", true)
+}, S("Wagon placeholder"), "advtrains_wagon_placeholder.png", true)
@@ -1579,12 +1579,12 @@ minetest.register_chatcommand("at_chown", {
local new_owner = params[2]
if not wid then return false end --no params added
--player name checks
- if not new_owner then return false, attrans("Please specify a player name to transfer ownership to.") end --no player name argument
- if not core.player_exists(new_owner) then return false, attrans("That player does not exist!") end --is a valid player
+ if not new_owner then return false, S("Please specify a player name to transfer ownership to.") end --no player name argument
+ if not core.player_exists(new_owner) then return false, S("That player does not exist!") end --is a valid player
--wagon id checks
- if not wid:match("%d%d%d%d%d%d") then return false, attrans("Not a valid wagon id.") end -- invalid wagon id
+ if not wid:match("%d%d%d%d%d%d") then return false, S("Not a valid wagon id.") end -- invalid wagon id
local w_data = advtrains.wagons[wid]
- if not w_data then return false, attrans("That wagon does not exist!") end
+ if not w_data then return false, S("That wagon does not exist!") end
-- actually chown the wagon
local curr_owner = w_data.owner
w_data.owner = new_owner
@@ -1592,8 +1592,8 @@ minetest.register_chatcommand("at_chown", {
advtrains.log("Chown", name, core.get_player_by_name(name):get_pos(), "wid="..wid..", from="..curr_owner..", to="..new_owner)
if name ~= new_owner then
- core.chat_send_player(new_owner, attrans("You have been given ownership of wagon @1", wid))
+ core.chat_send_player(new_owner, S("You have been given ownership of wagon @1", wid))
end
- return true, attrans("Wagon @1 ownership changed from @2 to @3", wid, curr_owner, new_owner)
+ return true, S("Wagon @1 ownership changed from @2 to @3", wid, curr_owner, new_owner)
end
-}) \ No newline at end of file
+})
diff --git a/advtrains_interlocking/autonaming.lua b/advtrains_interlocking/autonaming.lua
index f88ccbd..78886c0 100644
--- a/advtrains_interlocking/autonaming.lua
+++ b/advtrains_interlocking/autonaming.lua
@@ -1,6 +1,8 @@
-- autonaming.lua
-- Automatically set names of signals (and maybe track sections) based on numbering
+-- Get current translator
+local S = advtrains.interlocking.translate
local function find_highest_count(prefix)
local cnt = 0
@@ -34,10 +36,10 @@ function advtrains.interlocking.set_autoname_prefix(pname, prefix)
-- scan database for this prefix to find out the highest count
local count = find_highest_count(prefix)
player_prefix_info[pname] = { prefix = prefix, count = count}
- return true, "Prefix set, next signal name will be: ".. advtrains.interlocking.get_next_autoname(pname, true)
+ return true, S("Prefix set, next signal name will be: @1", advtrains.interlocking.get_next_autoname(pname, true))
else
player_prefix_info[pname] = nil
- return true, "Prefix unset, signals are not auto-named for you!"
+ return true, S("Prefix unset, signals are not auto-named for you!")
end
end
@@ -62,7 +64,7 @@ end
minetest.register_chatcommand("at_nameprefix",
{
params = "<prefix>",
- description = "Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on",
+ description = S("Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"),
privs = {interlocking = true},
func = advtrains.interlocking.set_autoname_prefix,
})
diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua
index 5e35dba..bd90e36 100644
--- a/advtrains_interlocking/database.lua
+++ b/advtrains_interlocking/database.lua
@@ -55,6 +55,9 @@ Every time a repair operation takes place, and on every track edit operation, th
]]--
+-- Get current translator
+local S = advtrains.interlocking.translate
+
local TRAVERSER_LIMIT = 1000
@@ -380,7 +383,7 @@ function ildb.check_and_repair_ts_at_pos(pos, tcb_connid, notify_pname, force_cr
if ts_id ~= tcbs_ts_id then
-- inconsistency is found, repair it
--atdebug("check_and_repair_ts_at_pos: Inconsistency is found!")
- tsrepair_notify(notify_pname, "Track section inconsistent here, repairing...")
+ tsrepair_notify(notify_pname, S("Track section inconsistent here, repairing..."))
return ildb.repair_ts_merge_all(all_tcbs, force_create, notify_pname)
-- Step2 check is no longer necessary since we just created that new section
end
@@ -409,7 +412,7 @@ function ildb.check_and_repair_ts_at_pos(pos, tcb_connid, notify_pname, force_cr
-- That means it is sufficient to compare the LENGTHS of both lists, if one is longer then it is inconsistent
if #ts.tc_breaks ~= #all_tcbs then
--atdebug("check_and_repair_ts_at_pos: Partition is found!")
- tsrepair_notify(notify_pname, "Track section partition found, repairing...")
+ tsrepair_notify(notify_pname, S("Track section partition found, repairing..."))
return ildb.repair_ts_merge_all(all_tcbs, force_create, notify_pname)
end
--tsrepair_notify(notify_pname, "Found section", ts.name or ts_id, "here.")
@@ -537,7 +540,7 @@ function ildb.repair_ts_merge_all(all_tcbs, force_create, notify_pname)
end
-- Create a new fresh track section with all the TCBs we have in our collection
local new_ts_id, new_ts = ildb.create_ts_from_tcb_list(all_tcbs)
- tsrepair_notify(notify_pname, "Created track section",new_ts_id,"from",#all_tcbs,"TCBs")
+ tsrepair_notify(notify_pname, S("Created track section @1 from @2 TCBs", new_ts_id, #all_tcbs))
return new_ts_id
end
@@ -738,7 +741,8 @@ local function recursively_find_routes(s_pos, s_connid, locks_found, result_tabl
local end_pkey = advtrains.encode_pos(pos)
--atdebug("Found end TCB", pos, end_pkey,", returning")
if result_table[end_pkey] then
- atwarn("While caching track section routing, found multiple route paths within same track section. Only first one found will be used")
+ --atwarn("While caching track section routing, found multiple route paths within same track section. Only first one found will be used")
+ -- this warning appears too often and is typically harmless
else
result_table[end_pkey] = table.copy(locks_found)
end
@@ -784,9 +788,9 @@ function ildb.update_rs_cache(ts_id)
end
end
-- warn about superfluous entry
- for sup_end_pkey, sup_entry in pairs(result_table) do
- atwarn("In update_rs_cache for section",ts_id,"found superfluous endpoint",sup_end_pkey,"->",sup_entry)
- end
+ --for sup_end_pkey, sup_entry in pairs(result_table) do
+ -- atwarn("In update_rs_cache for section",ts_id,"found superfluous endpoint",sup_end_pkey,"->",sup_entry)
+ --end -- this warning appears too often and is typically harmless
end
ts.rs_cache = rscache
--atdebug("== Done update_rs_cache for ",ts_id, "result:",rscache)
diff --git a/advtrains_interlocking/init.lua b/advtrains_interlocking/init.lua
index ee08c30..c30a22f 100644
--- a/advtrains_interlocking/init.lua
+++ b/advtrains_interlocking/init.lua
@@ -3,6 +3,14 @@
advtrains.interlocking = {}
+-- Initialize internationalization (using ywang's poconvert)
+advtrains.poconvert.from_flat("advtrains_interlocking")
+-- ask engine for translator instance, this will load the translation files
+advtrains.interlocking.translate = core.get_translator("advtrains_interlocking")
+
+-- Get current translator
+local S = advtrains.interlocking.translate
+
advtrains.SHUNT_SPEED_MAX = 6
function advtrains.interlocking.sigd_equal(sigd, cmp)
@@ -30,4 +38,4 @@ dofile(modpath.."ars.lua")
dofile(modpath.."tsr_rail.lua")
-minetest.register_privilege("interlocking", {description = "Can set up track sections, routes and signals.", give_to_singleplayer = true})
+minetest.register_privilege("interlocking", {description = S("Can set up track sections, routes and signals"), give_to_singleplayer = true})
diff --git a/advtrains_interlocking/locale/advtrains_interlocking.de.tr b/advtrains_interlocking/locale/advtrains_interlocking.de.tr
new file mode 100644
index 0000000..2c67a9f
--- /dev/null
+++ b/advtrains_interlocking/locale/advtrains_interlocking.de.tr
@@ -0,0 +1,191 @@
+# textdomain: advtrains_interlocking
+Prefix set, next signal name will be: @1=Präfix gesetzt, nächster Signalname: @1
+Prefix unset, signals are not auto-named for you!=Präfix gelöscht, automatische Signalbenennung deaktiviert!
+Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on=Setze einen Präfix für die automatische Benennung von neu hinzugefügten Signalen. Beispiel: '/at_nameprefix TEST' - Signale werden mit TEST1, TEST2 usw. benannt
+Created track section @1 from @2 TCBs=Gleisabschnitt @1 aus @2 TCBs erstellt
+Track section inconsistent here, repairing...=Gleisabschnitt ist inkonsistent, repariere...
+Track section partition found, repairing...=Gleisabschnitt partitioniert, repariere...
+Can set up track sections, routes and signals=Darf Gleisabschnitte, Fahrstraßen und Signale bearbeiten
+@1 Terminal @2=@1 Ziel @2
+@1 is held in @2 position when this route is set and freed =@1 wird durch die Fahrstraße in Position @2 festgelegt
+@1 is no longer affected when this route is set.=@1 wird nicht mehr durch die Fahrstraße festgelegt
+Added track section @1 to the route.=Gleisabschnitt @1 zur Fahrstraße hinzugefügt.
+Advance to next route section=Nächsten Gleisabschnitt hinzufügen
+Advance/Complete Route=Fahrstraße fortsetzen/beenden
+Advancing over next section is=Fortsetzen über nächsten Gleisabschnitt hinaus
+Cancel if you are unsure!=Abbrechen, wenn Sie unsicher sind!
+Cancel route programming=Fahrstraßenprogrammierung abbrechen
+Cannot program route without a target=Kann keine Fahrstraße ohne Ziel programmieren
+End of interlocking=Ende der Zugsicherung
+Enter Route Name=Fahrstraßennamen eingeben
+Finish programming route=Fahrstraße abschließen
+Finish route HERE=Fahrstraße HIER abschließen
+Finish route at end of NEXT section=Fahrstraße am Ende des NÄCHSTEN Abschnitts abschließen
+Fixed in state @1 by route @2 (punch to unfix)=Festgelegt in Zustand @1 durch Fahrstraße @2 (Schlagen um freizugeben)
+Fixed in state @1 by route @2 until segment #@3 is freed.=Festgelegt in Zustand @1 durch Fahrstraße @2, bis Segment @3 freigegeben wird.
+Insufficient privileges to use this!=Unzureichende Privilegien, um dies zu benutzen!
+Next section is diverging (>2 TCBs)=Nächster Abschnitt enthält eine Weiche (>2 TCBs)
+Route discarded.=Fahrstraße verworfen.
+Route ends at signal:=Fahrstraße endet bei Signal:
+Route leads into=Fahrstraße führt in
+Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.=Fahrstraßenprogrammierung aktiv. Schlage Gleisabschnittsgrenzen (TCB) um Segmente hinzuzufügen, schlage Weichen um sie festzulegen.
+Route section @1 removed.=Fahrstraßenabschnitt @1 entfernt.
+Routes should in most cases end at signals.=Fahrstraßen sollten normalerweise an einem Signal enden.
+Save Route=Fahrstraße speichern
+Step back one section=Einen Abschnitt zurück
+Successfully programmed route.=Fahrstraße erfolgreich programmiert.
+The origin TCB has become unknown during programming. Try again.=Der Start-TCB ist unbekannt geworden. Versuche nochmal.
+This TCB is not suitable as=Diese Gleisabschnittsgrenze ist
+This TCB is unconfigured, you first need to assign it to a rail=Diese Gleisabschnittsgrenze ist noch nicht konfiguiert, sie muss erst zugewiesen werden
+WARNING: Route does not end at a signal.=ACHTUNG: Fahrstraße endet nicht an einem Signal.
+[Route programming] =[Fahrstraßenprogrammierung]
+impossible at this place.=ist hier nicht möglich.
+non-interlocked area=nicht-überwachtes Gebiet
+route continuation.=nicht als Fortsetzung geeignet.
+<< Select a route part to edit options=<< Wähle einen Abschnitt, um Optionen zu bearbeiten
+<Default Aspect>=<Standardbegriff>
+ARS Rule List=ARS-Regelliste
+Announce distant signal=Entferntes Hauptsignal ankündigen
+Back to signal=Zurück zum Signal
+Call-on (section may be occupied)=Abschnitt darf belegt sein
+Clone Route=Duplizieren
+Delete Route=Fahrstraße löschen
+Error:=Fehler:
+New From Route=Neu aus dieser FS
+No Signal at this TCB=Kein Signal hier
+Route name=Fahrstraßenname
+Route overview=Fahrstraßenübersicht
+Save ARS List=ARS-Liste speichern
+Section Options:=Abschnittsoptionen:
+Set=Setzen
+Signal Aspect:=Signalbegriff:
+TCB at @1 has different section than previous TCB=TCB bei @1 hat einen anderen Gleisabschnitt als der vorherige TCB
+TCB at @1 is missing=TCB bei @1 fehlt
+TCB at @1 is not assigned to previous track section=TCB bei @1 ist dem vorherigen Gleisabschnitt nicht zugewiesen
+Track section after @1 missing=Gleisabschnitt nach @1 fehlt
+Turnout/component missing at @1=Weiche oder Komponente bei @1 fehlt
+Lock conflict at @1, Held locked by:=Sperrenkonflikt bei @1, bereits gesperrt durch:
+No TCB found at @1. Please update or reconfigure route!=TCB bei @1 nicht gefunden. Bitte Fahrstraße korrigieren!
+No track section adjacent to @1. Please reconfigure route!=Gleisabschnitt nach @1 nicht gefunden. Bitte Fahrstraße korrigieren!
+Route @1 from signal @2=Fahrstraße @1 von Signal @2
+Route @1 from signal @2, segment #@3=Fahrstraße @1 von Signal @2, Segment @3
+Section '@1' already has route set from @2:=Abschnitt '@1' bereits durch Fahrstraße von @2 belegt:
+Section '@1' is occupied!=Abschnitt '@1' ist durch einen Zug belegt!
+Section '@1' not found!=Abschnitt '@1' nicht gefunden!
+TCB at @1 has different section than previous TCB. Please update track section or reconfigure route!=TCB bei @1 hat anderen Abschnitt als vorhergehender TCB. Bitte Fahrstraße korrigieren!
+Turnout/component missing at @1. Please update track section or reconfigure route!=Weiche/Komponente bei @1 nicht gefunden. Bitte Fahrstraße korrigieren!
+<assign distant>=<entf. Hauptsignal festl.>
+<none>=<kein>
+Assigned distant signal to the main signal at @1=Vorsignal dem Hauptsignal bei @1 zugewiesen
+Assigned signal to the TCB at @1=Signal der Gleisabschnittsgrenze bei @1 zugewiesen
+Clear=Leeren
+Configuring Signal: Influence point of another signal is already present!=Signal einstellen: Beeinflussungspunkt eines anderen Signals bereits vorhanden!
+Configuring Signal: Node is too far away. Aborted.=Signal einstellen: Block ist zu weit entfernt. Abbruch.
+Configuring Signal: Please look in train's driving direction and punch rail to set influence point.=Signal einstellen: In Fahrtrichtung schauen und Gleis schlagen, um Beeinflussungspunkt zu setzen.
+Configuring Signal: Successfully set influence point=Signal einstellen: Beeinflussungspunkt erfolgreich gesetzt
+Configuring Signal: This is not a normal two-connection rail! Aborted.=Signal einstellen: Dies ist kein geeignetes Gleis! Abbruch.
+Dst: @1=Haupts.: @1
+Influence point is not set.=Beeinflussungspunkt ist nicht gesetzt.
+Influence point is set at @1.=Beeinflussungspunkt ist gesetzt bei @1.
+Modify=Bearbeiten
+Set distant signal: Punch the main signal to assign!=Hauptsignal zuweisen: Bitte schlage das Hauptsignal!
+Set influence point=Beeinflussungspunkt setzen
+Apply=Anwenden
+Route search: @1 found=Fahrstraßensuche: @1 gefunden
+Search further=Weitersuchen
+Smartroute: No track section directly ahead!=Fahrstraßensuche: Kein Gleisabschnitt voraus!
+Smartroute: TCBS or routes don't exist here!=Fahrstraßensuche: Gleisabschnittsgrenze oder Fahrstraßen existieren hier nicht!
+ (invalid)=(ungültig)
+@1 locks in state @2=@1 gesperrt in Position @2
+A route is requested from this signal:=Fahrstraße von diesem Signal:
+Add locks=Sperre hinzu.
+Assign a signal=Signal zuweisen
+Automatic Working is active.=Automatischer Blockbetrieb aktiv.
+Automatic routesetting=ARS (autom. Fahrstraßenauswahl)
+Boundary TCBs:=Gleisabschnittsgrenzen:
+Can't remove TCB: Both sides must have no signal assigned!=Kann Gleisabschnittsgrenze nicht entfernen: mindestens eine Seite hat noch ein Signal zugewiesen!
+Can't remove track, a train is here!=Kann Gleisabschnittsgrenze nicht entfernen: hier ist noch ein Zug!
+Cancel=Abbruch
+Cancel Route=Fahrstraße auflösen
+Cannot delete route which has ARS rules, please review and then delete through edit dialog!=Fahrstraße hat ARS-Regeln, bitte überprüfe diese und lösche die Fahrstraße über den Bearbeitungsdialog!
+Clear locks=Sperren löschen
+Configuring TCB: Already existed at this position, it is now linked to this TCB marker=Gleisabschnittsgrenze einstellen: Existierte hier bereits, der Marker ist nun verbunden
+Configuring TCB: Cannot use static signals for routesetting. Aborted.=Gleisabschnittsgrenze einstellen: statische Signale können nicht für Fahrstraßen benutzt werden. Abbruch.
+Configuring TCB: Internal error, TCBS doesn't exist. Aborted.=Gleisabschnittsgrenze einstellen: Interner Fehler, TCB existiert nicht. Abbruch.
+Configuring TCB: Node is too far away. Aborted.=Gleisabschnittsgrenze einstellen: Block ist zu weit entfernt. Abbruch.
+Configuring TCB: Not a compatible signal. Aborted.=Gleisabschnittsgrenze einstellen: Kein kompatibles Signal. Abbruch.
+Configuring TCB: Please punch the rail you want to assign this TCB to.=Gleisabschnittsgrenze einstellen: Bitte das Gleis schlagen, wo die Grenze erstellt werden soll.
+Configuring TCB: Please punch the signal to assign.=Gleisabschnittsgrenze einstellen: Bitte das zuzuweisende Signal schlagen.
+Configuring TCB: Successfully assigned signal.=Gleisabschnittsgrenze einstellen: Signal erfolgreich zugewiesen.
+Configuring TCB: Successfully configured TCB=Gleisabschnittsgrenze einstellen: Grenze erfolgreich erstellt
+Configuring TCB: This is not a normal two-connection rail! Aborted.=Gleisabschnittsgrenze einstellen: Dies ist kein geeignetes Gleis! Abbruch.
+Create Interlocked Track Section=Gleisabschnitt anlegen
+Delete this route=Fahrstraße löschen
+Disable Automatic Working=Auto. Blockbetrieb aus
+Distant signal triggers ARS=Vorsignal kann ARS auslösen
+Edit=Bearbeiten
+Enable Automatic Working=Automatischer Blockbetrieb
+Error: TS modified, abort!=Fehler: Abschnitt verändert, Abbruch!
+Final TCBS unset (legacy-style buffer route)=Letzte Abschnittsgrenze fehlt (Prellbockroute aus älterer Version)
+Fixed route locks (e.g. level crossings):=Feste Fahrstraßensperren (z.B. Bahnübergang):
+Link @1=Verknüpfe @1
+Link: @1=Verknüpfung: @1
+Multiple routes are requested (first available is set):=Mehrere Fahrstraßen angefragt (erste verfügbare wird eingestellt):
+NOTE: ARS is disabled.=ACHTUNG: ARS deaktiviert!
+New (Manual)=Neu (Manuell)
+No Link=Keine Verknüpfung
+No routes are yet defined.=Bisher keine Fahrstraßen definiert.
+No trains on this section.=Keine Züge auf diesem Abschnitt.
+Punch components to add fixed locks. (punch anything else @= end)=Schlage auf Komponenten um diese zu sperren (schlage irgendetwas anderes @= Ende)
+Remove Section=Gleisabschnitt löschen
+Reset section state=Gleisabschnitt zurücksetzen
+Reset track section=Gleisabschnitt zurücksetzen
+Reset track section @1!=Streckenabschnitt @1 zurückgesetzt!
+Route has been set.=Fahrstraße ist festgelegt.
+Route is re-set when a train passed.=Fahrstraße wird nach Passieren eines Zuges nicht aufgelöst.
+Route is set over this signal by:=Eine Fahrstraße ist über dieses Signal gestellt von:
+Route is set: =Fahrstraße ist festgelegt:
+Routes are not automatically set.=Fahrstraßen werden nicht automatisch gestellt.
+Routes:=Fahrstraßen:
+Section holds @1 route locks.=Abschnitt hält @1 Sperren.
+Section name=Name des Streckenabschnitts
+Set ARS default route=Setze als ARS-Standardroute
+Set Route=Fahrstraße einstellen
+Setting fixed locks finished!=Feste Fahrstraßensperren hinzugefügt!
+Show=Anzeigen
+Show track section=Gleisabschnitt anzeigen
+Side @1=Seite @1
+Signal at @1=Signal bei @1
+Signal name=Signalname
+Signal on B side already assigned!=Signal auf Seite B bereits zugewiesen!
+Signalling=Fahrstraßen stellen
+Smart Route=Fahrstraßensuche
+TCB Link: Select linked TCB now!=Gleisabschnitte verknüpfen: Zu verknüpfende Gleisabschnittsgrenze jetzt auswählen!
+TCB already existed at this position, now linked to this node=Gleisabschnittsgrenze existierte hier bereits, der Block ist nun verbunden
+TCB assigned to @1=Gleisabschnittsgrenze an @1 zugewiesen
+This TCB has been removed. Please dig marker.=Gleisabschnittsgrenze wurde gelöscht. Bitte Marker entfernen.
+This is a pure distant signal@nNo route is currently set through.=Dies ist ein reines Vorsignal@nAktuell keine Fahrstraße eingestellt.
+This is an always-halt signal (e.g. a buffer)@nNo routes can be set from here.=Dies ist ein Haltsignal (z.B. Prellbock)@nVon hier aus können keine Fahrstraßen eingestellt werden.
+This will clear the list of trains@nand the routesetting status of this section.@nAre you sure?=Dies löscht die Liste der Züge im Abschnitt@nsowie den Fahrstraßenstatus.@nSind Sie sicher?
+This will remove the track section and set all its end points to End Of Interlocking=Dies wird den Gleisabschnitt löschen
+Track Circuit Break=Gleisabschnittsgrenze
+Track Circuit Break Configuration=Einstellungen der Gleisabschnittsgrenze
+Track Section Detail - @1=Gleisabschnitts-Details - @1
+Trains on this section:=Züge in diesem Abschnitt
+Unconfigured Track Circuit Break, right-click to assign.=Nicht konfiguierte Gleisabschnittsgrenze (TCB). Rechtsklick zum Zuweisen.
+Wait for this route to be cancelled in order to do anything here.=Erst nach Auflösung dieser Fahrstraße kann von hier gestellt werden.
+Waiting for route to be set...=Warten, bis Fahrstraße verfügbar ist...
+Yes=Ja
+You cannot modify track sections when a route is set or a train is on the section.=Abschnitt kann nicht bearbeitet werden, wenn eine Fahrstraße gesetzt ist oder der Abschnitt belegt ist.
+Emplace manual lock=Manuelle Sperre setzen
+Interlocking tool@nPunch: Highlight track section@nPlace: check route locks/show track section info=Zugsicherungswerkzeug@nSchlagen: Gleisabschnitte hervorheben@nPlatzieren: Gleisabschnittsinformation/Fahrstraßensperren anzeigen
+No route locks set=Keine Fahrstraßensperren gehalten
+No track section at this location!=Kein Gleisabschnitt gefunden!
+Node is not a track!=Block ist kein Gleis!
+Route lock inspector=Fahrstraßensperren-Inspektor
+Route locks currently put:=Gesetzte Fahrstraßensperren:
+Point Speed Restriction Track=Geschwindigkeitskontrollgleis
+Point speed restriction: @1=Geschwindigkeitskontrolle: @1
+Set point speed restriction:=Setze Kontrollgeschwindigkeit:
+You are not allowed to configure this track without the @1 privilege.=Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren.
+You are not allowed to configure this track.=Sie dürfen dieses Gleis nicht konfigurieren. \ No newline at end of file
diff --git a/advtrains_interlocking/locale/advtrains_interlocking.fr.tr b/advtrains_interlocking/locale/advtrains_interlocking.fr.tr
new file mode 100644
index 0000000..93bbaf2
--- /dev/null
+++ b/advtrains_interlocking/locale/advtrains_interlocking.fr.tr
@@ -0,0 +1,191 @@
+# textdomain: advtrains_interlocking
+Prefix set, next signal name will be: @1=
+Prefix unset, signals are not auto-named for you!=
+Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on=
+Created track section @1 from @2 TCBs=
+Track section inconsistent here, repairing...=
+Track section partition found, repairing...=
+Can set up track sections, routes and signals=
+@1 Terminal @2=
+@1 is held in @2 position when this route is set and freed =
+@1 is no longer affected when this route is set.=
+Added track section @1 to the route.=
+Advance to next route section=
+Advance/Complete Route=
+Advancing over next section is=
+Cancel if you are unsure!=
+Cancel route programming=
+Cannot program route without a target=
+End of interlocking=
+Enter Route Name=
+Finish programming route=
+Finish route HERE=
+Finish route at end of NEXT section=
+Fixed in state @1 by route @2 (punch to unfix)=
+Fixed in state @1 by route @2 until segment #@3 is freed.=
+Insufficient privileges to use this!=Privilèges insuffisants pour utiliser ceci !
+Next section is diverging (>2 TCBs)=
+#Route discarded.=Changement d'état de l'itinéraire.
+Route ends at signal:=
+Route leads into=
+Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.=
+Route section @1 removed.=
+Routes should in most cases end at signals.=
+Save Route=
+Step back one section=
+#Successfully programmed route.=Succès d'invalidation des routages des trains
+The origin TCB has become unknown during programming. Try again.=
+This TCB is not suitable as=
+This TCB is unconfigured, you first need to assign it to a rail=
+WARNING: Route does not end at a signal.=
+[Route programming] =
+impossible at this place.=
+non-interlocked area=
+route continuation.=
+<< Select a route part to edit options=
+#<Default Aspect>=Siège par défaut
+ARS Rule List=
+#Announce distant signal=Signal distant métro de Munich (
+Back to signal=
+Call-on (section may be occupied)=
+Clone Route=
+Delete Route=
+Error:=
+New From Route=
+No Signal at this TCB=
+Route name=
+Route overview=
+Save ARS List=
+Section Options:=
+Set=
+#Signal Aspect:=Signal
+TCB at @1 has different section than previous TCB=
+TCB at @1 is missing=
+TCB at @1 is not assigned to previous track section=
+Track section after @1 missing=
+Turnout/component missing at @1=
+Lock conflict at @1, Held locked by:=
+No TCB found at @1. Please update or reconfigure route!=
+No track section adjacent to @1. Please reconfigure route!=
+Route @1 from signal @2=
+Route @1 from signal @2, segment #@3=
+Section '@1' already has route set from @2:=
+Section '@1' is occupied!=
+Section '@1' not found!=
+TCB at @1 has different section than previous TCB. Please update track section or reconfigure route!=
+Turnout/component missing at @1. Please update track section or reconfigure route!=
+<assign distant>=
+<none>=
+Assigned distant signal to the main signal at @1=
+Assigned signal to the TCB at @1=
+Clear=
+Configuring Signal: Influence point of another signal is already present!=
+Configuring Signal: Node is too far away. Aborted.=
+Configuring Signal: Please look in train's driving direction and punch rail to set influence point.=
+Configuring Signal: Successfully set influence point=
+Configuring Signal: This is not a normal two-connection rail! Aborted.=
+Dst: @1=
+Influence point is not set.=
+Influence point is set at @1.=
+Modify=
+Set distant signal: Punch the main signal to assign!=
+Set influence point=
+Apply=
+Route search: @1 found=
+Search further=
+Smartroute: No track section directly ahead!=
+Smartroute: TCBS or routes don't exist here!=
+ (invalid)=
+@1 locks in state @2=
+A route is requested from this signal:=
+Add locks=
+Assign a signal=
+Automatic Working is active.=
+#Automatic routesetting=Routage à distance
+Boundary TCBs:=
+Can't remove TCB: Both sides must have no signal assigned!=
+Can't remove track, a train is here!=
+Cancel=
+Cancel Route=
+Cannot delete route which has ARS rules, please review and then delete through edit dialog!=
+#Clear locks=Autorisation (procédez)
+Configuring TCB: Already existed at this position, it is now linked to this TCB marker=
+Configuring TCB: Cannot use static signals for routesetting. Aborted.=
+Configuring TCB: Internal error, TCBS doesn't exist. Aborted.=
+Configuring TCB: Node is too far away. Aborted.=
+Configuring TCB: Not a compatible signal. Aborted.=
+Configuring TCB: Please punch the rail you want to assign this TCB to.=
+Configuring TCB: Please punch the signal to assign.=
+Configuring TCB: Successfully assigned signal.=
+Configuring TCB: Successfully configured TCB=
+Configuring TCB: This is not a normal two-connection rail! Aborted.=
+Create Interlocked Track Section=
+Delete this route=
+Disable Automatic Working=
+Distant signal triggers ARS=
+Edit=
+Enable Automatic Working=
+Error: TS modified, abort!=
+Final TCBS unset (legacy-style buffer route)=
+Fixed route locks (e.g. level crossings):=
+Link @1=
+Link: @1=
+Multiple routes are requested (first available is set):=
+NOTE: ARS is disabled.=
+New (Manual)=
+No Link=
+No routes are yet defined.=
+No trains on this section.=
+Punch components to add fixed locks. (punch anything else @= end)=
+#Remove Section=Routage à distance
+Reset section state=
+#Reset track section=Inversion du sens de marche
+Reset track section @1!=
+Route has been set.=
+Route is re-set when a train passed.=
+Route is set over this signal by:=
+Route is set: =
+Routes are not automatically set.=
+Routes:=
+Section holds @1 route locks.=
+#Section name=Nom de Station
+Set ARS default route=
+Set Route=
+Setting fixed locks finished!=
+Show=
+Show track section=
+Side @1=
+#Signal at @1=Signal
+#Signal name=Signal
+Signal on B side already assigned!=
+#Signalling=Signal
+Smart Route=
+TCB Link: Select linked TCB now!=
+TCB already existed at this position, now linked to this node=
+TCB assigned to @1=
+This TCB has been removed. Please dig marker.=
+This is a pure distant signal@nNo route is currently set through.=
+This is an always-halt signal (e.g. a buffer)@nNo routes can be set from here.=
+This will clear the list of trains@nand the routesetting status of this section.@nAre you sure?=
+This will remove the track section and set all its end points to End Of Interlocking=
+#Track Circuit Break=Il y a un "Track Circuit Break" ici.
+#Track Circuit Break Configuration=Il y a un "Track Circuit Break" ici.
+Track Section Detail - @1=
+Trains on this section:=
+Unconfigured Track Circuit Break, right-click to assign.=
+Wait for this route to be cancelled in order to do anything here.=
+Waiting for route to be set...=
+Yes=
+You cannot modify track sections when a route is set or a train is on the section.=
+Emplace manual lock=
+Interlocking tool@nPunch: Highlight track section@nPlace: check route locks/show track section info=
+No route locks set=
+No track section at this location!=
+Node is not a track!=
+Route lock inspector=
+Route locks currently put:=
+Point Speed Restriction Track=Voie de point de limitation de vitesse
+Point speed restriction: @1=Point de limitation de vitesse : @1
+Set point speed restriction:=Placez un point de limitation de vitesse :
+You are not allowed to configure this track without the @1 privilege.=Vous n'êtes pas autorisé à configurer cette voie sans le privilège @1.
+You are not allowed to configure this track.=Vous n'êtes pas autorisé à configurer cette voie. \ No newline at end of file
diff --git a/advtrains_interlocking/locale/advtrains_interlocking.zh_CN.tr b/advtrains_interlocking/locale/advtrains_interlocking.zh_CN.tr
new file mode 100644
index 0000000..701d283
--- /dev/null
+++ b/advtrains_interlocking/locale/advtrains_interlocking.zh_CN.tr
@@ -0,0 +1,191 @@
+# textdomain: advtrains_interlocking
+Prefix set, next signal name will be: @1=
+Prefix unset, signals are not auto-named for you!=
+Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on=
+Created track section @1 from @2 TCBs=
+Track section inconsistent here, repairing...=
+Track section partition found, repairing...=
+Can set up track sections, routes and signals=
+@1 Terminal @2=
+@1 is held in @2 position when this route is set and freed =
+@1 is no longer affected when this route is set.=
+Added track section @1 to the route.=
+Advance to next route section=
+Advance/Complete Route=
+Advancing over next section is=
+Cancel if you are unsure!=
+Cancel route programming=
+Cannot program route without a target=
+End of interlocking=
+Enter Route Name=
+Finish programming route=
+Finish route HERE=
+Finish route at end of NEXT section=
+Fixed in state @1 by route @2 (punch to unfix)=
+Fixed in state @1 by route @2 until segment #@3 is freed.=
+Insufficient privileges to use this!=
+Next section is diverging (>2 TCBs)=
+Route discarded.=
+Route ends at signal:=
+Route leads into=
+Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.=
+Route section @1 removed.=
+Routes should in most cases end at signals.=
+Save Route=
+Step back one section=
+Successfully programmed route.=
+The origin TCB has become unknown during programming. Try again.=
+This TCB is not suitable as=
+This TCB is unconfigured, you first need to assign it to a rail=
+WARNING: Route does not end at a signal.=
+[Route programming] =
+impossible at this place.=
+non-interlocked area=
+route continuation.=
+<< Select a route part to edit options=
+#<Default Aspect>=默认座位
+ARS Rule List=
+Announce distant signal=
+Back to signal=
+Call-on (section may be occupied)=
+Clone Route=
+Delete Route=
+Error:=
+New From Route=
+No Signal at this TCB=
+Route name=
+Route overview=
+Save ARS List=
+Section Options:=
+Set=
+#Signal Aspect:=信号灯
+TCB at @1 has different section than previous TCB=
+TCB at @1 is missing=
+TCB at @1 is not assigned to previous track section=
+Track section after @1 missing=
+Turnout/component missing at @1=
+Lock conflict at @1, Held locked by:=
+No TCB found at @1. Please update or reconfigure route!=
+No track section adjacent to @1. Please reconfigure route!=
+Route @1 from signal @2=
+Route @1 from signal @2, segment #@3=
+Section '@1' already has route set from @2:=
+Section '@1' is occupied!=
+Section '@1' not found!=
+TCB at @1 has different section than previous TCB. Please update track section or reconfigure route!=
+Turnout/component missing at @1. Please update track section or reconfigure route!=
+<assign distant>=
+<none>=
+Assigned distant signal to the main signal at @1=
+Assigned signal to the TCB at @1=
+Clear=
+Configuring Signal: Influence point of another signal is already present!=
+Configuring Signal: Node is too far away. Aborted.=
+Configuring Signal: Please look in train's driving direction and punch rail to set influence point.=
+Configuring Signal: Successfully set influence point=
+Configuring Signal: This is not a normal two-connection rail! Aborted.=
+Dst: @1=
+Influence point is not set.=
+Influence point is set at @1.=
+Modify=
+Set distant signal: Punch the main signal to assign!=
+Set influence point=
+Apply=
+Route search: @1 found=
+Search further=
+Smartroute: No track section directly ahead!=
+Smartroute: TCBS or routes don't exist here!=
+ (invalid)=
+@1 locks in state @2=
+A route is requested from this signal:=
+Add locks=
+Assign a signal=
+Automatic Working is active.=
+Automatic routesetting=
+Boundary TCBs:=
+Can't remove TCB: Both sides must have no signal assigned!=
+Can't remove track, a train is here!=
+Cancel=
+Cancel Route=
+Cannot delete route which has ARS rules, please review and then delete through edit dialog!=
+Clear locks=
+Configuring TCB: Already existed at this position, it is now linked to this TCB marker=
+Configuring TCB: Cannot use static signals for routesetting. Aborted.=
+Configuring TCB: Internal error, TCBS doesn't exist. Aborted.=
+Configuring TCB: Node is too far away. Aborted.=
+Configuring TCB: Not a compatible signal. Aborted.=
+Configuring TCB: Please punch the rail you want to assign this TCB to.=
+Configuring TCB: Please punch the signal to assign.=
+Configuring TCB: Successfully assigned signal.=
+Configuring TCB: Successfully configured TCB=
+Configuring TCB: This is not a normal two-connection rail! Aborted.=
+Create Interlocked Track Section=
+Delete this route=
+Disable Automatic Working=
+Distant signal triggers ARS=
+Edit=
+Enable Automatic Working=
+Error: TS modified, abort!=
+Final TCBS unset (legacy-style buffer route)=
+Fixed route locks (e.g. level crossings):=
+Link @1=
+Link: @1=
+Multiple routes are requested (first available is set):=
+NOTE: ARS is disabled.=
+New (Manual)=
+No Link=
+No routes are yet defined.=
+No trains on this section.=
+Punch components to add fixed locks. (punch anything else @= end)=
+Remove Section=
+Reset section state=
+#Reset track section=改变行车方向
+Reset track section @1!=
+Route has been set.=
+Route is re-set when a train passed.=
+Route is set over this signal by:=
+Route is set: =
+Routes are not automatically set.=
+Routes:=
+Section holds @1 route locks.=
+#Section name=车站名称
+Set ARS default route=
+Set Route=
+Setting fixed locks finished!=
+Show=
+Show track section=
+Side @1=
+#Signal at @1=信号灯
+#Signal name=信号灯
+Signal on B side already assigned!=
+#Signalling=信号灯
+Smart Route=
+TCB Link: Select linked TCB now!=
+TCB already existed at this position, now linked to this node=
+TCB assigned to @1=
+This TCB has been removed. Please dig marker.=
+This is a pure distant signal@nNo route is currently set through.=
+This is an always-halt signal (e.g. a buffer)@nNo routes can be set from here.=
+This will clear the list of trains@nand the routesetting status of this section.@nAre you sure?=
+This will remove the track section and set all its end points to End Of Interlocking=
+Track Circuit Break=
+Track Circuit Break Configuration=
+Track Section Detail - @1=
+Trains on this section:=
+Unconfigured Track Circuit Break, right-click to assign.=
+Wait for this route to be cancelled in order to do anything here.=
+Waiting for route to be set...=
+Yes=
+You cannot modify track sections when a route is set or a train is on the section.=
+Emplace manual lock=
+Interlocking tool@nPunch: Highlight track section@nPlace: check route locks/show track section info=
+No route locks set=
+No track section at this location!=
+Node is not a track!=
+Route lock inspector=
+Route locks currently put:=
+Point Speed Restriction Track=
+Point speed restriction: @1=
+Set point speed restriction:=
+You are not allowed to configure this track without the @1 privilege.=您没有“@1”权限,不能调整这段轨道。
+You are not allowed to configure this track.=您不能调整这段轨道。 \ No newline at end of file
diff --git a/advtrains_interlocking/locale/advtrains_interlocking.zh_TW.tr b/advtrains_interlocking/locale/advtrains_interlocking.zh_TW.tr
new file mode 100644
index 0000000..64e1626
--- /dev/null
+++ b/advtrains_interlocking/locale/advtrains_interlocking.zh_TW.tr
@@ -0,0 +1,191 @@
+# textdomain: advtrains_interlocking
+Prefix set, next signal name will be: @1=
+Prefix unset, signals are not auto-named for you!=
+Sets the current prefix for automatically naming interlocking components. Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on=
+Created track section @1 from @2 TCBs=
+Track section inconsistent here, repairing...=
+Track section partition found, repairing...=
+Can set up track sections, routes and signals=
+@1 Terminal @2=
+@1 is held in @2 position when this route is set and freed =
+@1 is no longer affected when this route is set.=
+Added track section @1 to the route.=
+Advance to next route section=
+Advance/Complete Route=
+Advancing over next section is=
+Cancel if you are unsure!=
+Cancel route programming=
+Cannot program route without a target=
+End of interlocking=
+Enter Route Name=
+Finish programming route=
+Finish route HERE=
+Finish route at end of NEXT section=
+Fixed in state @1 by route @2 (punch to unfix)=
+Fixed in state @1 by route @2 until segment #@3 is freed.=
+Insufficient privileges to use this!=
+Next section is diverging (>2 TCBs)=
+Route discarded.=
+Route ends at signal:=
+Route leads into=
+Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.=
+Route section @1 removed.=
+Routes should in most cases end at signals.=
+Save Route=
+Step back one section=
+Successfully programmed route.=
+The origin TCB has become unknown during programming. Try again.=
+This TCB is not suitable as=
+This TCB is unconfigured, you first need to assign it to a rail=
+WARNING: Route does not end at a signal.=
+[Route programming] =
+impossible at this place.=
+non-interlocked area=
+route continuation.=
+<< Select a route part to edit options=
+#<Default Aspect>=預設座位
+ARS Rule List=
+Announce distant signal=
+Back to signal=
+Call-on (section may be occupied)=
+Clone Route=
+Delete Route=
+Error:=
+New From Route=
+No Signal at this TCB=
+Route name=
+Route overview=
+Save ARS List=
+Section Options:=
+Set=
+#Signal Aspect:=色燈號誌機
+TCB at @1 has different section than previous TCB=
+TCB at @1 is missing=
+TCB at @1 is not assigned to previous track section=
+Track section after @1 missing=
+Turnout/component missing at @1=
+Lock conflict at @1, Held locked by:=
+No TCB found at @1. Please update or reconfigure route!=
+No track section adjacent to @1. Please reconfigure route!=
+Route @1 from signal @2=
+Route @1 from signal @2, segment #@3=
+Section '@1' already has route set from @2:=
+Section '@1' is occupied!=
+Section '@1' not found!=
+TCB at @1 has different section than previous TCB. Please update track section or reconfigure route!=
+Turnout/component missing at @1. Please update track section or reconfigure route!=
+<assign distant>=
+<none>=
+Assigned distant signal to the main signal at @1=
+Assigned signal to the TCB at @1=
+Clear=
+Configuring Signal: Influence point of another signal is already present!=
+Configuring Signal: Node is too far away. Aborted.=
+Configuring Signal: Please look in train's driving direction and punch rail to set influence point.=
+Configuring Signal: Successfully set influence point=
+Configuring Signal: This is not a normal two-connection rail! Aborted.=
+Dst: @1=
+Influence point is not set.=
+Influence point is set at @1.=
+Modify=
+Set distant signal: Punch the main signal to assign!=
+Set influence point=
+Apply=
+Route search: @1 found=
+Search further=
+Smartroute: No track section directly ahead!=
+Smartroute: TCBS or routes don't exist here!=
+ (invalid)=
+@1 locks in state @2=
+A route is requested from this signal:=
+Add locks=
+Assign a signal=
+Automatic Working is active.=
+Automatic routesetting=
+Boundary TCBs:=
+Can't remove TCB: Both sides must have no signal assigned!=
+Can't remove track, a train is here!=
+Cancel=
+Cancel Route=
+Cannot delete route which has ARS rules, please review and then delete through edit dialog!=
+Clear locks=
+Configuring TCB: Already existed at this position, it is now linked to this TCB marker=
+Configuring TCB: Cannot use static signals for routesetting. Aborted.=
+Configuring TCB: Internal error, TCBS doesn't exist. Aborted.=
+Configuring TCB: Node is too far away. Aborted.=
+Configuring TCB: Not a compatible signal. Aborted.=
+Configuring TCB: Please punch the rail you want to assign this TCB to.=
+Configuring TCB: Please punch the signal to assign.=
+Configuring TCB: Successfully assigned signal.=
+Configuring TCB: Successfully configured TCB=
+Configuring TCB: This is not a normal two-connection rail! Aborted.=
+Create Interlocked Track Section=
+Delete this route=
+Disable Automatic Working=
+Distant signal triggers ARS=
+Edit=
+Enable Automatic Working=
+Error: TS modified, abort!=
+Final TCBS unset (legacy-style buffer route)=
+Fixed route locks (e.g. level crossings):=
+Link @1=
+Link: @1=
+Multiple routes are requested (first available is set):=
+NOTE: ARS is disabled.=
+New (Manual)=
+No Link=
+No routes are yet defined.=
+No trains on this section.=
+Punch components to add fixed locks. (punch anything else @= end)=
+Remove Section=
+Reset section state=
+#Reset track section=改變行車方向
+Reset track section @1!=
+Route has been set.=
+Route is re-set when a train passed.=
+Route is set over this signal by:=
+Route is set: =
+Routes are not automatically set.=
+Routes:=
+Section holds @1 route locks.=
+#Section name=車站名稱
+Set ARS default route=
+Set Route=
+Setting fixed locks finished!=
+Show=
+Show track section=
+Side @1=
+#Signal at @1=色燈號誌機
+#Signal name=色燈號誌機
+Signal on B side already assigned!=
+#Signalling=色燈號誌機
+Smart Route=
+TCB Link: Select linked TCB now!=
+TCB already existed at this position, now linked to this node=
+TCB assigned to @1=
+This TCB has been removed. Please dig marker.=
+This is a pure distant signal@nNo route is currently set through.=
+This is an always-halt signal (e.g. a buffer)@nNo routes can be set from here.=
+This will clear the list of trains@nand the routesetting status of this section.@nAre you sure?=
+This will remove the track section and set all its end points to End Of Interlocking=
+Track Circuit Break=
+Track Circuit Break Configuration=
+Track Section Detail - @1=
+Trains on this section:=
+Unconfigured Track Circuit Break, right-click to assign.=
+Wait for this route to be cancelled in order to do anything here.=
+Waiting for route to be set...=
+Yes=
+You cannot modify track sections when a route is set or a train is on the section.=
+Emplace manual lock=
+Interlocking tool@nPunch: Highlight track section@nPlace: check route locks/show track section info=
+No route locks set=
+No track section at this location!=
+Node is not a track!=
+Route lock inspector=
+Route locks currently put:=
+Point Speed Restriction Track=
+Point speed restriction: @1=
+Set point speed restriction:=
+You are not allowed to configure this track without the @1 privilege.=您沒有「@1」許可權,不能調整這段軌道。
+You are not allowed to configure this track.=您不能調整這段軌道。 \ No newline at end of file
diff --git a/advtrains_interlocking/po/README.md b/advtrains_interlocking/po/README.md
new file mode 100644
index 0000000..3e94682
--- /dev/null
+++ b/advtrains_interlocking/po/README.md
@@ -0,0 +1,70 @@
+# Translations
+Please read this document before working on any translations.
+
+Unlike many other mods, Advtrains uses `.po` files for localization,
+which are then automatically converted to `.tr` files when the mod is
+loaded. Therefore, please submit patches that edit the `.po` files.
+
+## Getting Started
+The translation files can be edited like any other `.po` file.
+
+If the translation file for your language does not exist, create it by
+copying `template.txt` to `advtrains.XX.tr`, where `XX` is replaced by
+the language code.
+
+Feel free to use the [discussion mailing list][srht-discuss] if you
+have any questions regarding localization.
+
+You can share your `.po` file directly or [as a patch][gsm] to the [dev
+mailing list][srht-devel]. The latter is encouraged, but, unlike code
+changes, translation files sent directly are also accepted.
+
+[tr-format]: https://minetest.gitlab.io/minetest/translations/#translation-file-format
+[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss
+[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel
+[gsm]: https://git-send-email.io
+
+## Translation Notes
+* Translations should be consistent. You can use other entries or the
+translations in Minetest as a reference.
+* Translations do not have to fully correspond to the original text -
+they only need to provide the same information. In particular,
+translations do not need to have the same linguistical structure as the
+original text.
+* Replacement sequences (`@1`, `@2`, etc) should not be translated.
+* Certain abbreviations or names, such as "Ks" or "Zs 3", should
+generally not be translated.
+
+### (de) German
+* Verwenden Sie die neue Rechtschreibung und die Sie-Form.
+* Mit der deutschen Tastaturbelegung unter Linux können die
+Anführungszeichen „“ mit AltGr-V bzw. AltGr-B eingegeben werden.
+
+### (zh) Chinese
+(This section is written in English to avoid writing the note twice or
+using only one of the variants, as most of this section applies to both
+the traditional and simplified variants.)
+
+* Please use the 「」 quotation marks for Traditional Chinese and “”
+for Simplified Chinese.
+* Please use the fullwidth variants of: , 、 。 ? ! : ;
+* Please use the halfwidth variants of: ( ) [ ] / \ |
+* Please do not leave any space between Han characters (including
+fullwidth punctuation marks).
+* Please leave a space between Han characters (excluding fullwidth
+punctuation marks) and characters from other scripts (including
+halfwidth punctuation marks). However, do not leave any space between
+Han characters and Arabic numerals.
+
+## Notes for developers
+* The `update-translations.sh` script can be used to update the
+translation files. However, please make sure to install the
+`basic_trains` mod before running the script.
+* Please make sure that the first argument to `S` (or `attrans`) _only_
+includes string literals without formatting or concatenation. This is
+unfortunately a limitation of the `xgettext` utility.
+* Avoid word-by-word translations.
+* Avoid manipulating translated strings (except for concatenation). Use
+server-side translations if you have to modify the text sent to users.
+* Avoid truncating strings unless multibyte characters are handled
+properly.
diff --git a/advtrains_interlocking/po/advtrains_interlocking.pot b/advtrains_interlocking/po/advtrains_interlocking.pot
new file mode 100644
index 0000000..312a843
--- /dev/null
+++ b/advtrains_interlocking/po/advtrains_interlocking.pot
@@ -0,0 +1,807 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the advtrains_interlocking package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains_interlocking\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:21+0200\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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: autonaming.lua
+msgid "Prefix set, next signal name will be: @1"
+msgstr ""
+
+#: autonaming.lua
+msgid "Prefix unset, signals are not auto-named for you!"
+msgstr ""
+
+#: autonaming.lua
+msgid ""
+"Sets the current prefix for automatically naming interlocking components. "
+"Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"
+msgstr ""
+
+#: database.lua
+msgid "Track section inconsistent here, repairing..."
+msgstr ""
+
+#: database.lua
+msgid "Track section partition found, repairing..."
+msgstr ""
+
+#: database.lua
+msgid "Created track section @1 from @2 TCBs"
+msgstr ""
+
+#: init.lua
+msgid "Can set up track sections, routes and signals"
+msgstr ""
+
+#: route_prog.lua
+msgid "[Route programming] "
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is no longer affected when this route is set."
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 until segment #@3 is freed."
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 Terminal @2"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 (punch to unfix)"
+msgstr ""
+
+#: route_prog.lua route_ui.lua signal_aspect_ui.lua tcb_ts_ui.lua tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
+
+#: route_prog.lua
+msgid ""
+"Route programming mode active. Punch TCBs to add route segments, punch "
+"turnouts to lock them."
+msgstr ""
+
+#: route_prog.lua
+msgid "Added track section @1 to the route."
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish programming route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route ends at signal:"
+msgstr ""
+
+#: route_prog.lua
+msgid "WARNING: Route does not end at a signal."
+msgstr ""
+
+#: route_prog.lua
+msgid "Routes should in most cases end at signals."
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel if you are unsure!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route leads into"
+msgstr ""
+
+#: route_prog.lua
+msgid "non-interlocked area"
+msgstr ""
+
+#: route_prog.lua
+msgid "Enter Route Name"
+msgstr ""
+
+#: route_prog.lua
+msgid "Save Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Next section is diverging (>2 TCBs)"
+msgstr ""
+
+#: route_prog.lua tcb_ts_ui.lua
+msgid "End of interlocking"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance/Complete Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance to next route section"
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is not suitable as"
+msgstr ""
+
+#: route_prog.lua
+msgid "route continuation."
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route HERE"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route at end of NEXT section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advancing over next section is"
+msgstr ""
+
+#: route_prog.lua
+msgid "impossible at this place."
+msgstr ""
+
+#: route_prog.lua
+msgid "Step back one section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel route programming"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route section @1 removed."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route discarded."
+msgstr ""
+
+#: route_prog.lua
+msgid "Cannot program route without a target"
+msgstr ""
+
+#: route_prog.lua
+msgid "The origin TCB has become unknown during programming. Try again."
+msgstr ""
+
+#: route_prog.lua
+msgid "Successfully programmed route."
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is unconfigured, you first need to assign it to a rail"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is held in @2 position when this route is set and freed "
+msgstr ""
+
+#: route_ui.lua
+msgid "Route overview"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route name"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Set"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Track section after @1 missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Turnout/component missing at @1"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is not assigned to previous track section"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 has different section than previous TCB"
+msgstr ""
+
+#: route_ui.lua signal_aspect_ui.lua
+msgid "Signal Aspect:"
+msgstr ""
+
+#: route_ui.lua
+msgid "<Default Aspect>"
+msgstr ""
+
+#: route_ui.lua
+msgid "Announce distant signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "No Signal at this TCB"
+msgstr ""
+
+#: route_ui.lua
+msgid "Section Options:"
+msgstr ""
+
+#: route_ui.lua
+msgid "Call-on (section may be occupied)"
+msgstr ""
+
+#: route_ui.lua
+msgid "Error:"
+msgstr ""
+
+#: route_ui.lua
+msgid "<< Select a route part to edit options"
+msgstr ""
+
+#: route_ui.lua
+msgid "Delete Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Back to signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Clone Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "New From Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "ARS Rule List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Save ARS List"
+msgstr ""
+
+#: routesetting.lua
+msgid "No TCB found at @1. Please update or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "No track section adjacent to @1. Please reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' not found!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' already has route set from @2:"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' is occupied!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Lock conflict at @1, Held locked by:"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"Turnout/component missing at @1. Please update track section or reconfigure "
+"route!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"TCB at @1 has different section than previous TCB. Please update track "
+"section or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2, segment #@3"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is set at @1."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Modify"
+msgstr ""
+
+#: signal_aspect_ui.lua tool.lua
+msgid "Clear"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is not set."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set influence point"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<none>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Dst: @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<assign distant>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Please look in train's driving direction and punch rail "
+"to set influence point."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set distant signal: Punch the main signal to assign!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned signal to the TCB at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned distant signal to the main signal at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Successfully set influence point"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Influence point of another signal is already present!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Node is too far away. Aborted."
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: TCBS or routes don't exist here!"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: No track section directly ahead!"
+msgstr ""
+
+#: smartroute.lua
+msgid "Route search: @1 found"
+msgstr ""
+
+#: smartroute.lua
+msgid "Search further"
+msgstr ""
+
+#: smartroute.lua
+msgid "Apply"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Unconfigured Track Circuit Break, right-click to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "This TCB has been removed. Please dig marker."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the rail you want to assign this TCB to."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove TCB: Both sides must have no signal assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Configuring TCB: Already existed at this position, it is now linked to this "
+"TCB marker"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB assigned to @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully configured TCB"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Node is too far away. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully assigned signal."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Internal error, TCBS doesn't exist. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Cannot use static signals for routesetting. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Not a compatible signal. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "@1 locks in state @2"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Error: TS modified, abort!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Setting fixed locks finished!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB already existed at this position, now linked to this node"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Signal on B side already assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove track, a train is here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Side @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show track section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Create Interlocked Track Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link: @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No Link"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Signalling"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Assign a signal"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break Configuration"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB Link: Select linked TCB now!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the signal to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Section Detail - @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Section name"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Boundary TCBs:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Fixed route locks (e.g. level crossings):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Add locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Clear locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Remove Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will remove the track section and set all its end points to End Of "
+"Interlocking"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set: "
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Section holds @1 route locks."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Trains on this section:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No trains on this section."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Reset section state"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"You cannot modify track sections when a route is set or a train is on the "
+"section."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Punch components to add fixed locks. (punch anything else = end)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Reset track section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will clear the list of trains\n"
+"and the routesetting status of this section.\n"
+"Are you sure?"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Yes"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Reset track section @1!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Final TCBS unset (legacy-style buffer route)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Signal at @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Signal name"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Multiple routes are requested (first available is set):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "A route is requested from this signal:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route has been set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Waiting for route to be set..."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Enable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic Working is active."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is re-set when a train passed."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Disable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid " (invalid)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Set Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Set ARS default route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Edit"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Delete this route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "NOTE: ARS is disabled."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes are not automatically set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Smart Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "New (Manual)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic routesetting"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Distant signal triggers ARS"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No routes are yet defined."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is an always-halt signal (e.g. a buffer)\n"
+"No routes can be set from here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is a pure distant signal\n"
+"No route is currently set through."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set over this signal by:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Wait for this route to be cancelled in order to do anything here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Cannot delete route which has ARS rules, please review and then delete "
+"through edit dialog!"
+msgstr ""
+
+#: tool.lua
+msgid "Route lock inspector"
+msgstr ""
+
+#: tool.lua
+msgid "Route locks currently put:"
+msgstr ""
+
+#: tool.lua
+msgid "No route locks set"
+msgstr ""
+
+#: tool.lua
+msgid "Emplace manual lock"
+msgstr ""
+
+#: tool.lua
+msgid "Node is not a track!"
+msgstr ""
+
+#: tool.lua
+msgid "No track section at this location!"
+msgstr ""
+
+#: tool.lua
+msgid ""
+"Interlocking tool\n"
+"Punch: Highlight track section\n"
+"Place: check route locks/show track section info"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track without the @1 privilege."
+msgstr ""
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track."
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
diff --git a/advtrains_interlocking/po/de.po b/advtrains_interlocking/po/de.po
new file mode 100644
index 0000000..d3aa1dc
--- /dev/null
+++ b/advtrains_interlocking/po/de.po
@@ -0,0 +1,1378 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:21+0200\n"
+"PO-Revision-Date: 2025-06-12 22:55+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: autonaming.lua
+msgid "Prefix set, next signal name will be: @1"
+msgstr "Präfix gesetzt, nächster Signalname: @1"
+
+#: autonaming.lua
+msgid "Prefix unset, signals are not auto-named for you!"
+msgstr "Präfix gelöscht, automatische Signalbenennung deaktiviert!"
+
+#: autonaming.lua
+msgid ""
+"Sets the current prefix for automatically naming interlocking components. "
+"Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"
+msgstr ""
+"Setze einen Präfix für die automatische Benennung von neu hinzugefügten "
+"Signalen. Beispiel: '/at_nameprefix TEST' - Signale werden mit TEST1, TEST2 "
+"usw. benannt"
+
+#: database.lua
+msgid "Created track section @1 from @2 TCBs"
+msgstr "Gleisabschnitt @1 aus @2 TCBs erstellt"
+
+#: database.lua
+msgid "Track section inconsistent here, repairing..."
+msgstr "Gleisabschnitt ist inkonsistent, repariere..."
+
+#: database.lua
+msgid "Track section partition found, repairing..."
+msgstr "Gleisabschnitt partitioniert, repariere..."
+
+#: init.lua
+msgid "Can set up track sections, routes and signals"
+msgstr "Darf Gleisabschnitte, Fahrstraßen und Signale bearbeiten"
+
+#: route_prog.lua
+msgid "@1 Terminal @2"
+msgstr "@1 Ziel @2"
+
+#: route_prog.lua
+msgid "@1 is held in @2 position when this route is set and freed "
+msgstr "@1 wird durch die Fahrstraße in Position @2 festgelegt"
+
+#: route_prog.lua
+msgid "@1 is no longer affected when this route is set."
+msgstr "@1 wird nicht mehr durch die Fahrstraße festgelegt"
+
+#: route_prog.lua
+msgid "Added track section @1 to the route."
+msgstr "Gleisabschnitt @1 zur Fahrstraße hinzugefügt."
+
+#: route_prog.lua
+msgid "Advance to next route section"
+msgstr "Nächsten Gleisabschnitt hinzufügen"
+
+#: route_prog.lua
+msgid "Advance/Complete Route"
+msgstr "Fahrstraße fortsetzen/beenden"
+
+#: route_prog.lua
+msgid "Advancing over next section is"
+msgstr "Fortsetzen über nächsten Gleisabschnitt hinaus"
+
+#: route_prog.lua
+msgid "Cancel if you are unsure!"
+msgstr "Abbrechen, wenn Sie unsicher sind!"
+
+#: route_prog.lua
+msgid "Cancel route programming"
+msgstr "Fahrstraßenprogrammierung abbrechen"
+
+#: route_prog.lua
+msgid "Cannot program route without a target"
+msgstr "Kann keine Fahrstraße ohne Ziel programmieren"
+
+#: route_prog.lua tcb_ts_ui.lua
+msgid "End of interlocking"
+msgstr "Ende der Zugsicherung"
+
+#: route_prog.lua
+msgid "Enter Route Name"
+msgstr "Fahrstraßennamen eingeben"
+
+#: route_prog.lua
+msgid "Finish programming route"
+msgstr "Fahrstraße abschließen"
+
+#: route_prog.lua
+msgid "Finish route HERE"
+msgstr "Fahrstraße HIER abschließen"
+
+#: route_prog.lua
+msgid "Finish route at end of NEXT section"
+msgstr "Fahrstraße am Ende des NÄCHSTEN Abschnitts abschließen"
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 (punch to unfix)"
+msgstr "Festgelegt in Zustand @1 durch Fahrstraße @2 (Schlagen um freizugeben)"
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 until segment #@3 is freed."
+msgstr ""
+"Festgelegt in Zustand @1 durch Fahrstraße @2, bis Segment @3 freigegeben "
+"wird."
+
+#: route_prog.lua route_ui.lua signal_aspect_ui.lua tcb_ts_ui.lua tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr "Unzureichende Privilegien, um dies zu benutzen!"
+
+#: route_prog.lua
+msgid "Next section is diverging (>2 TCBs)"
+msgstr "Nächster Abschnitt enthält eine Weiche (>2 TCBs)"
+
+#: route_prog.lua
+msgid "Route discarded."
+msgstr "Fahrstraße verworfen."
+
+#: route_prog.lua
+msgid "Route ends at signal:"
+msgstr "Fahrstraße endet bei Signal:"
+
+#: route_prog.lua
+msgid "Route leads into"
+msgstr "Fahrstraße führt in"
+
+#: route_prog.lua
+msgid ""
+"Route programming mode active. Punch TCBs to add route segments, punch "
+"turnouts to lock them."
+msgstr ""
+"Fahrstraßenprogrammierung aktiv. Schlage Gleisabschnittsgrenzen (TCB) um "
+"Segmente hinzuzufügen, schlage Weichen um sie festzulegen."
+
+#: route_prog.lua
+msgid "Route section @1 removed."
+msgstr "Fahrstraßenabschnitt @1 entfernt."
+
+#: route_prog.lua
+msgid "Routes should in most cases end at signals."
+msgstr "Fahrstraßen sollten normalerweise an einem Signal enden."
+
+#: route_prog.lua
+msgid "Save Route"
+msgstr "Fahrstraße speichern"
+
+#: route_prog.lua
+msgid "Step back one section"
+msgstr "Einen Abschnitt zurück"
+
+#: route_prog.lua
+msgid "Successfully programmed route."
+msgstr "Fahrstraße erfolgreich programmiert."
+
+#: route_prog.lua
+msgid "The origin TCB has become unknown during programming. Try again."
+msgstr "Der Start-TCB ist unbekannt geworden. Versuche nochmal."
+
+#: route_prog.lua
+msgid "This TCB is not suitable as"
+msgstr "Diese Gleisabschnittsgrenze ist"
+
+#: route_prog.lua
+msgid "This TCB is unconfigured, you first need to assign it to a rail"
+msgstr ""
+"Diese Gleisabschnittsgrenze ist noch nicht konfiguiert, sie muss erst "
+"zugewiesen werden"
+
+#: route_prog.lua
+msgid "WARNING: Route does not end at a signal."
+msgstr "ACHTUNG: Fahrstraße endet nicht an einem Signal."
+
+#: route_prog.lua
+msgid "[Route programming] "
+msgstr "[Fahrstraßenprogrammierung] "
+
+#: route_prog.lua
+msgid "impossible at this place."
+msgstr "ist hier nicht möglich."
+
+#: route_prog.lua
+msgid "non-interlocked area"
+msgstr "nicht-überwachtes Gebiet"
+
+#: route_prog.lua
+msgid "route continuation."
+msgstr "nicht als Fortsetzung geeignet."
+
+#: route_ui.lua
+msgid "<< Select a route part to edit options"
+msgstr "<< Wähle einen Abschnitt, um Optionen zu bearbeiten"
+
+#: route_ui.lua
+msgid "<Default Aspect>"
+msgstr "<Standardbegriff>"
+
+#: route_ui.lua
+msgid "ARS Rule List"
+msgstr "ARS-Regelliste"
+
+#: route_ui.lua
+msgid "Announce distant signal"
+msgstr "Entferntes Hauptsignal ankündigen"
+
+#: route_ui.lua
+msgid "Back to signal"
+msgstr "Zurück zum Signal"
+
+#: route_ui.lua
+msgid "Call-on (section may be occupied)"
+msgstr "Abschnitt darf belegt sein"
+
+#: route_ui.lua
+msgid "Clone Route"
+msgstr "Duplizieren"
+
+#: route_ui.lua
+msgid "Delete Route"
+msgstr "Fahrstraße löschen"
+
+#: route_ui.lua
+msgid "Error:"
+msgstr "Fehler:"
+
+#: route_ui.lua
+msgid "New From Route"
+msgstr "Neu aus dieser FS"
+
+#: route_ui.lua
+msgid "No Signal at this TCB"
+msgstr "Kein Signal hier"
+
+#: route_ui.lua
+msgid "Route name"
+msgstr "Fahrstraßenname"
+
+#: route_ui.lua
+msgid "Route overview"
+msgstr "Fahrstraßenübersicht"
+
+#: route_ui.lua
+msgid "Save ARS List"
+msgstr "ARS-Liste speichern"
+
+#: route_ui.lua
+msgid "Section Options:"
+msgstr "Abschnittsoptionen:"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Set"
+msgstr "Setzen"
+
+#: route_ui.lua signal_aspect_ui.lua
+msgid "Signal Aspect:"
+msgstr "Signalbegriff:"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 has different section than previous TCB"
+msgstr "TCB bei @1 hat einen anderen Gleisabschnitt als der vorherige TCB"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is missing"
+msgstr "TCB bei @1 fehlt"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is not assigned to previous track section"
+msgstr "TCB bei @1 ist dem vorherigen Gleisabschnitt nicht zugewiesen"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Track section after @1 missing"
+msgstr "Gleisabschnitt nach @1 fehlt"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Turnout/component missing at @1"
+msgstr "Weiche oder Komponente bei @1 fehlt"
+
+#: routesetting.lua
+msgid "Lock conflict at @1, Held locked by:"
+msgstr "Sperrenkonflikt bei @1, bereits gesperrt durch:"
+
+#: routesetting.lua
+msgid "No TCB found at @1. Please update or reconfigure route!"
+msgstr "TCB bei @1 nicht gefunden. Bitte Fahrstraße korrigieren!"
+
+#: routesetting.lua
+msgid "No track section adjacent to @1. Please reconfigure route!"
+msgstr "Gleisabschnitt nach @1 nicht gefunden. Bitte Fahrstraße korrigieren!"
+
+#: routesetting.lua
+msgid "Route @1 from signal @2"
+msgstr "Fahrstraße @1 von Signal @2"
+
+#: routesetting.lua
+msgid "Route @1 from signal @2, segment #@3"
+msgstr "Fahrstraße @1 von Signal @2, Segment @3"
+
+#: routesetting.lua
+msgid "Section '@1' already has route set from @2:"
+msgstr "Abschnitt '@1' bereits durch Fahrstraße von @2 belegt:"
+
+#: routesetting.lua
+msgid "Section '@1' is occupied!"
+msgstr "Abschnitt '@1' ist durch einen Zug belegt!"
+
+#: routesetting.lua
+msgid "Section '@1' not found!"
+msgstr "Abschnitt '@1' nicht gefunden!"
+
+#: routesetting.lua
+msgid ""
+"TCB at @1 has different section than previous TCB. Please update track "
+"section or reconfigure route!"
+msgstr ""
+"TCB bei @1 hat anderen Abschnitt als vorhergehender TCB. Bitte Fahrstraße "
+"korrigieren!"
+
+#: routesetting.lua
+msgid ""
+"Turnout/component missing at @1. Please update track section or reconfigure "
+"route!"
+msgstr "Weiche/Komponente bei @1 nicht gefunden. Bitte Fahrstraße korrigieren!"
+
+#: signal_aspect_ui.lua
+msgid "<assign distant>"
+msgstr "<entf. Hauptsignal festl.>"
+
+#: signal_aspect_ui.lua
+msgid "<none>"
+msgstr "<kein>"
+
+#: signal_aspect_ui.lua
+msgid "Assigned distant signal to the main signal at @1"
+msgstr "Vorsignal dem Hauptsignal bei @1 zugewiesen"
+
+#: signal_aspect_ui.lua
+msgid "Assigned signal to the TCB at @1"
+msgstr "Signal der Gleisabschnittsgrenze bei @1 zugewiesen"
+
+#: signal_aspect_ui.lua tool.lua
+msgid "Clear"
+msgstr "Leeren"
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Influence point of another signal is already present!"
+msgstr ""
+"Signal einstellen: Beeinflussungspunkt eines anderen Signals bereits "
+"vorhanden!"
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Node is too far away. Aborted."
+msgstr "Signal einstellen: Block ist zu weit entfernt. Abbruch."
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Please look in train's driving direction and punch rail "
+"to set influence point."
+msgstr ""
+"Signal einstellen: In Fahrtrichtung schauen und Gleis schlagen, um "
+"Beeinflussungspunkt zu setzen."
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Successfully set influence point"
+msgstr "Signal einstellen: Beeinflussungspunkt erfolgreich gesetzt"
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: This is not a normal two-connection rail! Aborted."
+msgstr "Signal einstellen: Dies ist kein geeignetes Gleis! Abbruch."
+
+#: signal_aspect_ui.lua
+msgid "Dst: @1"
+msgstr "Haupts.: @1"
+
+#: signal_aspect_ui.lua
+msgid "Influence point is not set."
+msgstr "Beeinflussungspunkt ist nicht gesetzt."
+
+#: signal_aspect_ui.lua
+msgid "Influence point is set at @1."
+msgstr "Beeinflussungspunkt ist gesetzt bei @1."
+
+#: signal_aspect_ui.lua
+msgid "Modify"
+msgstr "Bearbeiten"
+
+#: signal_aspect_ui.lua
+msgid "Set distant signal: Punch the main signal to assign!"
+msgstr "Hauptsignal zuweisen: Bitte schlage das Hauptsignal!"
+
+#: signal_aspect_ui.lua
+msgid "Set influence point"
+msgstr "Beeinflussungspunkt setzen"
+
+#: smartroute.lua
+msgid "Apply"
+msgstr "Anwenden"
+
+#: smartroute.lua
+msgid "Route search: @1 found"
+msgstr "Fahrstraßensuche: @1 gefunden"
+
+#: smartroute.lua
+msgid "Search further"
+msgstr "Weitersuchen"
+
+#: smartroute.lua
+msgid "Smartroute: No track section directly ahead!"
+msgstr "Fahrstraßensuche: Kein Gleisabschnitt voraus!"
+
+#: smartroute.lua
+msgid "Smartroute: TCBS or routes don't exist here!"
+msgstr ""
+"Fahrstraßensuche: Gleisabschnittsgrenze oder Fahrstraßen existieren hier "
+"nicht!"
+
+#: tcb_ts_ui.lua
+msgid " (invalid)"
+msgstr "(ungültig)"
+
+#: tcb_ts_ui.lua
+msgid "@1 locks in state @2"
+msgstr "@1 gesperrt in Position @2"
+
+#: tcb_ts_ui.lua
+msgid "A route is requested from this signal:"
+msgstr "Fahrstraße von diesem Signal:"
+
+#: tcb_ts_ui.lua
+msgid "Add locks"
+msgstr "Sperre hinzu."
+
+#: tcb_ts_ui.lua
+msgid "Assign a signal"
+msgstr "Signal zuweisen"
+
+#: tcb_ts_ui.lua
+msgid "Automatic Working is active."
+msgstr "Automatischer Blockbetrieb aktiv."
+
+#: tcb_ts_ui.lua
+msgid "Automatic routesetting"
+msgstr "ARS (autom. Fahrstraßenauswahl)"
+
+#: tcb_ts_ui.lua
+msgid "Boundary TCBs:"
+msgstr "Gleisabschnittsgrenzen:"
+
+#: tcb_ts_ui.lua
+msgid "Can't remove TCB: Both sides must have no signal assigned!"
+msgstr ""
+"Kann Gleisabschnittsgrenze nicht entfernen: mindestens eine Seite hat noch "
+"ein Signal zugewiesen!"
+
+#: tcb_ts_ui.lua
+msgid "Can't remove track, a train is here!"
+msgstr "Kann Gleisabschnittsgrenze nicht entfernen: hier ist noch ein Zug!"
+
+#: tcb_ts_ui.lua
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: tcb_ts_ui.lua
+msgid "Cancel Route"
+msgstr "Fahrstraße auflösen"
+
+#: tcb_ts_ui.lua
+msgid ""
+"Cannot delete route which has ARS rules, please review and then delete "
+"through edit dialog!"
+msgstr ""
+"Fahrstraße hat ARS-Regeln, bitte überprüfe diese und lösche die Fahrstraße "
+"über den Bearbeitungsdialog!"
+
+#: tcb_ts_ui.lua
+msgid "Clear locks"
+msgstr "Sperren löschen"
+
+#: tcb_ts_ui.lua
+msgid ""
+"Configuring TCB: Already existed at this position, it is now linked to this "
+"TCB marker"
+msgstr ""
+"Gleisabschnittsgrenze einstellen: Existierte hier bereits, der Marker ist "
+"nun verbunden"
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Cannot use static signals for routesetting. Aborted."
+msgstr ""
+"Gleisabschnittsgrenze einstellen: statische Signale können nicht für "
+"Fahrstraßen benutzt werden. Abbruch."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Internal error, TCBS doesn't exist. Aborted."
+msgstr ""
+"Gleisabschnittsgrenze einstellen: Interner Fehler, TCB existiert nicht. "
+"Abbruch."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Node is too far away. Aborted."
+msgstr "Gleisabschnittsgrenze einstellen: Block ist zu weit entfernt. Abbruch."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Not a compatible signal. Aborted."
+msgstr "Gleisabschnittsgrenze einstellen: Kein kompatibles Signal. Abbruch."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the rail you want to assign this TCB to."
+msgstr ""
+"Gleisabschnittsgrenze einstellen: Bitte das Gleis schlagen, wo die Grenze "
+"erstellt werden soll."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the signal to assign."
+msgstr ""
+"Gleisabschnittsgrenze einstellen: Bitte das zuzuweisende Signal schlagen."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully assigned signal."
+msgstr "Gleisabschnittsgrenze einstellen: Signal erfolgreich zugewiesen."
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully configured TCB"
+msgstr "Gleisabschnittsgrenze einstellen: Grenze erfolgreich erstellt"
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: This is not a normal two-connection rail! Aborted."
+msgstr ""
+"Gleisabschnittsgrenze einstellen: Dies ist kein geeignetes Gleis! Abbruch."
+
+#: tcb_ts_ui.lua
+msgid "Create Interlocked Track Section"
+msgstr "Gleisabschnitt anlegen"
+
+#: tcb_ts_ui.lua
+msgid "Delete this route"
+msgstr "Fahrstraße löschen"
+
+#: tcb_ts_ui.lua
+msgid "Disable Automatic Working"
+msgstr "Auto. Blockbetrieb aus"
+
+#: tcb_ts_ui.lua
+msgid "Distant signal triggers ARS"
+msgstr "Vorsignal kann ARS auslösen"
+
+#: tcb_ts_ui.lua
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: tcb_ts_ui.lua
+msgid "Enable Automatic Working"
+msgstr "Automatischer Blockbetrieb"
+
+#: tcb_ts_ui.lua
+msgid "Error: TS modified, abort!"
+msgstr "Fehler: Abschnitt verändert, Abbruch!"
+
+#: tcb_ts_ui.lua
+msgid "Final TCBS unset (legacy-style buffer route)"
+msgstr "Letzte Abschnittsgrenze fehlt (Prellbockroute aus älterer Version)"
+
+#: tcb_ts_ui.lua
+msgid "Fixed route locks (e.g. level crossings):"
+msgstr "Feste Fahrstraßensperren (z.B. Bahnübergang):"
+
+#: tcb_ts_ui.lua
+msgid "Link @1"
+msgstr "Verknüpfe @1"
+
+#: tcb_ts_ui.lua
+msgid "Link: @1"
+msgstr "Verknüpfung: @1"
+
+#: tcb_ts_ui.lua
+msgid "Multiple routes are requested (first available is set):"
+msgstr "Mehrere Fahrstraßen angefragt (erste verfügbare wird eingestellt):"
+
+#: tcb_ts_ui.lua
+msgid "NOTE: ARS is disabled."
+msgstr "ACHTUNG: ARS deaktiviert!"
+
+#: tcb_ts_ui.lua
+msgid "New (Manual)"
+msgstr "Neu (Manuell)"
+
+#: tcb_ts_ui.lua
+msgid "No Link"
+msgstr "Keine Verknüpfung"
+
+#: tcb_ts_ui.lua
+msgid "No routes are yet defined."
+msgstr "Bisher keine Fahrstraßen definiert."
+
+#: tcb_ts_ui.lua
+msgid "No trains on this section."
+msgstr "Keine Züge auf diesem Abschnitt."
+
+#: tcb_ts_ui.lua
+msgid "Punch components to add fixed locks. (punch anything else = end)"
+msgstr ""
+"Schlage auf Komponenten um diese zu sperren (schlage irgendetwas anderes = "
+"Ende)"
+
+#: tcb_ts_ui.lua
+msgid "Remove Section"
+msgstr "Gleisabschnitt löschen"
+
+#: tcb_ts_ui.lua
+msgid "Reset section state"
+msgstr "Gleisabschnitt zurücksetzen"
+
+#: tcb_ts_ui.lua
+msgid "Reset track section"
+msgstr "Gleisabschnitt zurücksetzen"
+
+#: tcb_ts_ui.lua
+msgid "Reset track section @1!"
+msgstr "Streckenabschnitt @1 zurückgesetzt!"
+
+#: tcb_ts_ui.lua
+msgid "Route has been set."
+msgstr "Fahrstraße ist festgelegt."
+
+#: tcb_ts_ui.lua
+msgid "Route is re-set when a train passed."
+msgstr "Fahrstraße wird nach Passieren eines Zuges nicht aufgelöst."
+
+#: tcb_ts_ui.lua
+msgid "Route is set over this signal by:"
+msgstr "Eine Fahrstraße ist über dieses Signal gestellt von:"
+
+#: tcb_ts_ui.lua
+msgid "Route is set: "
+msgstr "Fahrstraße ist festgelegt: "
+
+#: tcb_ts_ui.lua
+msgid "Routes are not automatically set."
+msgstr "Fahrstraßen werden nicht automatisch gestellt."
+
+#: tcb_ts_ui.lua
+msgid "Routes:"
+msgstr "Fahrstraßen:"
+
+#: tcb_ts_ui.lua
+msgid "Section holds @1 route locks."
+msgstr "Abschnitt hält @1 Sperren."
+
+#: tcb_ts_ui.lua
+msgid "Section name"
+msgstr "Name des Streckenabschnitts"
+
+#: tcb_ts_ui.lua
+msgid "Set ARS default route"
+msgstr "Setze als ARS-Standardroute"
+
+#: tcb_ts_ui.lua
+msgid "Set Route"
+msgstr "Fahrstraße einstellen"
+
+#: tcb_ts_ui.lua
+msgid "Setting fixed locks finished!"
+msgstr "Feste Fahrstraßensperren hinzugefügt!"
+
+#: tcb_ts_ui.lua
+msgid "Show"
+msgstr "Anzeigen"
+
+#: tcb_ts_ui.lua
+msgid "Show track section"
+msgstr "Gleisabschnitt anzeigen"
+
+#: tcb_ts_ui.lua
+msgid "Side @1"
+msgstr "Seite @1"
+
+#: tcb_ts_ui.lua
+msgid "Signal at @1"
+msgstr "Signal bei @1"
+
+#: tcb_ts_ui.lua
+msgid "Signal name"
+msgstr "Signalname"
+
+#: tcb_ts_ui.lua
+msgid "Signal on B side already assigned!"
+msgstr "Signal auf Seite B bereits zugewiesen!"
+
+#: tcb_ts_ui.lua
+msgid "Signalling"
+msgstr "Fahrstraßen stellen"
+
+#: tcb_ts_ui.lua
+msgid "Smart Route"
+msgstr "Fahrstraßensuche"
+
+#: tcb_ts_ui.lua
+msgid "TCB Link: Select linked TCB now!"
+msgstr ""
+"Gleisabschnitte verknüpfen: Zu verknüpfende Gleisabschnittsgrenze jetzt "
+"auswählen!"
+
+#: tcb_ts_ui.lua
+msgid "TCB already existed at this position, now linked to this node"
+msgstr ""
+"Gleisabschnittsgrenze existierte hier bereits, der Block ist nun verbunden"
+
+#: tcb_ts_ui.lua
+msgid "TCB assigned to @1"
+msgstr "Gleisabschnittsgrenze an @1 zugewiesen"
+
+#: tcb_ts_ui.lua
+msgid "This TCB has been removed. Please dig marker."
+msgstr "Gleisabschnittsgrenze wurde gelöscht. Bitte Marker entfernen."
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is a pure distant signal\n"
+"No route is currently set through."
+msgstr ""
+"Dies ist ein reines Vorsignal\n"
+"Aktuell keine Fahrstraße eingestellt."
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is an always-halt signal (e.g. a buffer)\n"
+"No routes can be set from here."
+msgstr ""
+"Dies ist ein Haltsignal (z.B. Prellbock)\n"
+"Von hier aus können keine Fahrstraßen eingestellt werden."
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will clear the list of trains\n"
+"and the routesetting status of this section.\n"
+"Are you sure?"
+msgstr ""
+"Dies löscht die Liste der Züge im Abschnitt\n"
+"sowie den Fahrstraßenstatus.\n"
+"Sind Sie sicher?"
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will remove the track section and set all its end points to End Of "
+"Interlocking"
+msgstr "Dies wird den Gleisabschnitt löschen"
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break"
+msgstr "Gleisabschnittsgrenze"
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break Configuration"
+msgstr "Einstellungen der Gleisabschnittsgrenze"
+
+#: tcb_ts_ui.lua
+msgid "Track Section Detail - @1"
+msgstr "Gleisabschnitts-Details - @1"
+
+#: tcb_ts_ui.lua
+msgid "Trains on this section:"
+msgstr "Züge in diesem Abschnitt"
+
+#: tcb_ts_ui.lua
+msgid "Unconfigured Track Circuit Break, right-click to assign."
+msgstr ""
+"Nicht konfiguierte Gleisabschnittsgrenze (TCB). Rechtsklick zum Zuweisen."
+
+#: tcb_ts_ui.lua
+msgid "Wait for this route to be cancelled in order to do anything here."
+msgstr "Erst nach Auflösung dieser Fahrstraße kann von hier gestellt werden."
+
+#: tcb_ts_ui.lua
+msgid "Waiting for route to be set..."
+msgstr "Warten, bis Fahrstraße verfügbar ist..."
+
+#: tcb_ts_ui.lua
+msgid "Yes"
+msgstr "Ja"
+
+#: tcb_ts_ui.lua
+msgid ""
+"You cannot modify track sections when a route is set or a train is on the "
+"section."
+msgstr ""
+"Abschnitt kann nicht bearbeitet werden, wenn eine Fahrstraße gesetzt ist "
+"oder der Abschnitt belegt ist."
+
+#: tool.lua
+msgid "Emplace manual lock"
+msgstr "Manuelle Sperre setzen"
+
+#: tool.lua
+msgid ""
+"Interlocking tool\n"
+"Punch: Highlight track section\n"
+"Place: check route locks/show track section info"
+msgstr ""
+"Zugsicherungswerkzeug\n"
+"Schlagen: Gleisabschnitte hervorheben\n"
+"Platzieren: Gleisabschnittsinformation/Fahrstraßensperren anzeigen"
+
+#: tool.lua
+msgid "No route locks set"
+msgstr "Keine Fahrstraßensperren gehalten"
+
+#: tool.lua
+msgid "No track section at this location!"
+msgstr "Kein Gleisabschnitt gefunden!"
+
+#: tool.lua
+msgid "Node is not a track!"
+msgstr "Block ist kein Gleis!"
+
+#: tool.lua
+msgid "Route lock inspector"
+msgstr "Fahrstraßensperren-Inspektor"
+
+#: tool.lua
+msgid "Route locks currently put:"
+msgstr "Gesetzte Fahrstraßensperren:"
+
+#: tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr "Geschwindigkeitskontrollgleis"
+
+#: tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr "Geschwindigkeitskontrolle: @1"
+
+#: tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr "Setze Kontrollgeschwindigkeit:"
+
+#: 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."
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Türen geschlossen)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Dreiwegweiche"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Kreuzung mit einem achsenparallelen Gleis"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Keine Kupplung vorhanden>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Hoher @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Hoher @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Niedriger @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Niedriger @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1 Steigung"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
+#~ "Ausstieg gezwungen."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden "
+#~ "nicht zum Ausstieg gezwungen."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht "
+#~ "umgekehrt werden."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Zugbeeinflussungsgleis"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Kanal: @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Befehl: @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Zugang zu @1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Andreaskreuz"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Große Industrielle Lokomotive"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Güterwaggon"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Schraubenkupplung"
+
+#~ msgid "Bumper"
+#~ msgstr "Prellbock"
+
+#~ 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)."
+
+#~ msgid ""
+#~ "Can place and configure LuaATC components, including execute potentially "
+#~ "harmful Lua code"
+#~ msgstr ""
+#~ "Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
+#~ "Programme ausführen)"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind "
+#~ "geschlossen."
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es "
+#~ "werden insgesamt @1 benötigt."
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht "
+#~ "definiert."
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: es gibt keinen unterstützenden Block am "
+#~ "Ende der Steigung."
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt."
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
+
+#~ msgid "Command"
+#~ msgstr "Befehl"
+
+#~ msgid "Command (on)"
+#~ msgstr "Befehl (wenn aktiviert)"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Standardsitzplatz (Führerstand)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "Zielgeschwindigkeit bei Abfahrt"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "ausrangiertes Gleis, nicht verwenden."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Detaillierte Dampflokomotive"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Detektorgleis"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Diagonale Gleiskreuzung"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline-Kanal"
+
+#~ msgid "Door Delay"
+#~ msgstr "Zeit für die Türschließung"
+
+#~ msgid "Door Side"
+#~ msgstr "Türseite"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Die Türen sind geschlossen."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Führerstand Links"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Führerstand Rechts"
+
+#~ msgid "Driver stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Führerstand"
+
+#~ msgid "Get off"
+#~ msgstr "Aussteigen"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Ausstieg zwingen"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Industrielle Lokomotive"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Tankwaggon"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Holztransportwaggon"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Japanische Personenzug-Lokomotive"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "Fahrgäste zum Ausstieg zwingen"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Mechanisches Signal"
+
+#~ msgid "Line"
+#~ msgstr "Linie"
+
+#~ msgid "Loading Track"
+#~ msgstr "Beladungsgleis"
+
+#~ msgid "Lock couples"
+#~ msgstr "Kupplungen sperren"
+
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
+
+#~ msgid "No such lua entity."
+#~ msgstr ""
+#~ "Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
+#~ "kann."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "Passagierwaggon"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "PC-Benennungswerkzeug\n"
+#~ "\n"
+#~ "Rechtsklick zur Benennung der passiven Komponente."
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Ein Zug steht an dieser Position."
+
+#~ msgid "Save"
+#~ msgstr "Speichern"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Waggon-Einstellungen speichern"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenbergkupplung"
+
+#~ msgid "Select seat:"
+#~ msgstr "Wählen Sie einen Sitzplatz aus:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Inventar Zeigen"
+
+#~ msgid "Speed:"
+#~ msgstr "Geschw.:"
+
+#~ msgid "Station Code"
+#~ msgstr "Kennzeichen der Haltestelle"
+
+#~ 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."
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "Gleis zur Kennzeichnung einer Haltestelle"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Dampflokomotive"
+
+#~ msgid "Stop Time"
+#~ msgstr "Wartezeit"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "U-Bahn-Waggon"
+
+#~ msgid "Target:"
+#~ msgstr "Zielges.:"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Innere Anzeige"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Äußere Anzeige"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr ""
+#~ "Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug "
+#~ "nicht kopiert werden."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Das Clipboard ist leer."
+
+#, 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."
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Das Inventar dieses Waggons ist nicht leer."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Hier ist ein Signal-Beeinflussungspunkt."
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "Der Waggon ist voll."
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
+
+#~ msgid "This position is protected!"
+#~ msgstr "Diese Position ist geschützt!"
+
+#~ 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."
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Dieses Gleis kann nicht geändert werden."
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "Dieses Gleis kann nicht entfernt werden."
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Dieses Gleis kann nicht gedreht werden."
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Der Waggon ist voll."
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
+
+#~ msgid "Track"
+#~ msgstr "Gleis"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Gleiswerkzeug\n"
+#~ "\n"
+#~ "Linksklick: Gleistyp ändern\n"
+#~ "Rechtsklick: Objekt drehen"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid "Train copied."
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Werkzeug zur Erstellung von Zugkopien\n"
+#~ "\n"
+#~ "Linksklick: Zug ins Clipboard kopieren\n"
+#~ "Right-click: Kopierten Zug einfügen"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Abladungsgleis"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen "
+#~ "einzusteigen."
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "An der linken Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "An der rechten Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "An der Decke montiertes Signal"
+
+#~ msgid ""
+#~ "Warning: If you destroy this wagon, you only get some steel back! If you "
+#~ "are sure, hold Sneak and left-click the wagon."
+#~ msgstr ""
+#~ "Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
+#~ "Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
+
+#~ msgid "Y-turnout"
+#~ msgstr "Y-Weiche"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Sie haben keinen Zugang zum Führerstand."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ 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."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Sie können nicht in diesen Waggon einsteigen."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln."
diff --git a/advtrains_interlocking/po/fr.po b/advtrains_interlocking/po/fr.po
new file mode 100644
index 0000000..1ebf2bb
--- /dev/null
+++ b/advtrains_interlocking/po/fr.po
@@ -0,0 +1,1629 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:21+0200\n"
+"PO-Revision-Date: 2025-03-25 15:06+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"
+
+#: autonaming.lua
+msgid "Prefix set, next signal name will be: @1"
+msgstr ""
+
+#: autonaming.lua
+msgid "Prefix unset, signals are not auto-named for you!"
+msgstr ""
+
+#: autonaming.lua
+msgid ""
+"Sets the current prefix for automatically naming interlocking components. "
+"Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"
+msgstr ""
+
+#: database.lua
+msgid "Created track section @1 from @2 TCBs"
+msgstr ""
+
+#: database.lua
+msgid "Track section inconsistent here, repairing..."
+msgstr ""
+
+#: database.lua
+msgid "Track section partition found, repairing..."
+msgstr ""
+
+#: init.lua
+msgid "Can set up track sections, routes and signals"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 Terminal @2"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is held in @2 position when this route is set and freed "
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is no longer affected when this route is set."
+msgstr ""
+
+#: route_prog.lua
+msgid "Added track section @1 to the route."
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance to next route section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance/Complete Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advancing over next section is"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel if you are unsure!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel route programming"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cannot program route without a target"
+msgstr ""
+
+#: route_prog.lua tcb_ts_ui.lua
+msgid "End of interlocking"
+msgstr ""
+
+#: route_prog.lua
+msgid "Enter Route Name"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish programming route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route HERE"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route at end of NEXT section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 (punch to unfix)"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 until segment #@3 is freed."
+msgstr ""
+
+#: route_prog.lua route_ui.lua signal_aspect_ui.lua tcb_ts_ui.lua tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr "Privilèges insuffisants pour utiliser ceci !"
+
+#: route_prog.lua
+msgid "Next section is diverging (>2 TCBs)"
+msgstr ""
+
+#: route_prog.lua
+#, fuzzy
+msgid "Route discarded."
+msgstr "Changement d'état de l'itinéraire."
+
+#: route_prog.lua
+msgid "Route ends at signal:"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route leads into"
+msgstr ""
+
+#: route_prog.lua
+msgid ""
+"Route programming mode active. Punch TCBs to add route segments, punch "
+"turnouts to lock them."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route section @1 removed."
+msgstr ""
+
+#: route_prog.lua
+msgid "Routes should in most cases end at signals."
+msgstr ""
+
+#: route_prog.lua
+msgid "Save Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Step back one section"
+msgstr ""
+
+# Routage est il le bon terme ?
+#: route_prog.lua
+#, fuzzy
+msgid "Successfully programmed route."
+msgstr "Succès d'invalidation des routages des trains"
+
+#: route_prog.lua
+msgid "The origin TCB has become unknown during programming. Try again."
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is not suitable as"
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is unconfigured, you first need to assign it to a rail"
+msgstr ""
+
+#: route_prog.lua
+msgid "WARNING: Route does not end at a signal."
+msgstr ""
+
+#: route_prog.lua
+msgid "[Route programming] "
+msgstr ""
+
+#: route_prog.lua
+msgid "impossible at this place."
+msgstr ""
+
+#: route_prog.lua
+msgid "non-interlocked area"
+msgstr ""
+
+#: route_prog.lua
+msgid "route continuation."
+msgstr ""
+
+#: route_ui.lua
+msgid "<< Select a route part to edit options"
+msgstr ""
+
+#: route_ui.lua
+#, fuzzy
+msgid "<Default Aspect>"
+msgstr "Siège par défaut"
+
+#: route_ui.lua
+msgid "ARS Rule List"
+msgstr ""
+
+#: route_ui.lua
+#, fuzzy
+msgid "Announce distant signal"
+msgstr "Signal distant métro de Munich ("
+
+#: route_ui.lua
+msgid "Back to signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Call-on (section may be occupied)"
+msgstr ""
+
+#: route_ui.lua
+msgid "Clone Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Delete Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Error:"
+msgstr ""
+
+#: route_ui.lua
+msgid "New From Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "No Signal at this TCB"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route name"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route overview"
+msgstr ""
+
+#: route_ui.lua
+msgid "Save ARS List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Section Options:"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Set"
+msgstr ""
+
+#: route_ui.lua signal_aspect_ui.lua
+#, fuzzy
+msgid "Signal Aspect:"
+msgstr "Signal"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 has different section than previous TCB"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is not assigned to previous track section"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Track section after @1 missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Turnout/component missing at @1"
+msgstr ""
+
+#: routesetting.lua
+msgid "Lock conflict at @1, Held locked by:"
+msgstr ""
+
+#: routesetting.lua
+msgid "No TCB found at @1. Please update or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "No track section adjacent to @1. Please reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2, segment #@3"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' already has route set from @2:"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' is occupied!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' not found!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"TCB at @1 has different section than previous TCB. Please update track "
+"section or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"Turnout/component missing at @1. Please update track section or reconfigure "
+"route!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<assign distant>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<none>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned distant signal to the main signal at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned signal to the TCB at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua tool.lua
+msgid "Clear"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Influence point of another signal is already present!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Node is too far away. Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Please look in train's driving direction and punch rail "
+"to set influence point."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Successfully set influence point"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Dst: @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is not set."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is set at @1."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Modify"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set distant signal: Punch the main signal to assign!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set influence point"
+msgstr ""
+
+#: smartroute.lua
+msgid "Apply"
+msgstr ""
+
+#: smartroute.lua
+msgid "Route search: @1 found"
+msgstr ""
+
+#: smartroute.lua
+msgid "Search further"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: No track section directly ahead!"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: TCBS or routes don't exist here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid " (invalid)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "@1 locks in state @2"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "A route is requested from this signal:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Add locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Assign a signal"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic Working is active."
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Automatic routesetting"
+msgstr "Routage à distance"
+
+#: tcb_ts_ui.lua
+msgid "Boundary TCBs:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove TCB: Both sides must have no signal assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove track, a train is here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Cannot delete route which has ARS rules, please review and then delete "
+"through edit dialog!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Clear locks"
+msgstr "Autorisation (procédez)"
+
+#: tcb_ts_ui.lua
+msgid ""
+"Configuring TCB: Already existed at this position, it is now linked to this "
+"TCB marker"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Cannot use static signals for routesetting. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Internal error, TCBS doesn't exist. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Node is too far away. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Not a compatible signal. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the rail you want to assign this TCB to."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the signal to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully assigned signal."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully configured TCB"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Create Interlocked Track Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Delete this route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Disable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Distant signal triggers ARS"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Edit"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Enable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Error: TS modified, abort!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Final TCBS unset (legacy-style buffer route)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Fixed route locks (e.g. level crossings):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link: @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Multiple routes are requested (first available is set):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "NOTE: ARS is disabled."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "New (Manual)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No Link"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No routes are yet defined."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No trains on this section."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Punch components to add fixed locks. (punch anything else = end)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Remove Section"
+msgstr "Routage à distance"
+
+#: tcb_ts_ui.lua
+msgid "Reset section state"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Reset track section"
+msgstr "Inversion du sens de marche"
+
+#: tcb_ts_ui.lua
+msgid "Reset track section @1!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route has been set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is re-set when a train passed."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set over this signal by:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set: "
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes are not automatically set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Section holds @1 route locks."
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Section name"
+msgstr "Nom de Station"
+
+#: tcb_ts_ui.lua
+msgid "Set ARS default route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Set Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Setting fixed locks finished!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show track section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Side @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal at @1"
+msgstr "Signal"
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal name"
+msgstr "Signal"
+
+#: tcb_ts_ui.lua
+msgid "Signal on B side already assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signalling"
+msgstr "Signal"
+
+#: tcb_ts_ui.lua
+msgid "Smart Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB Link: Select linked TCB now!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB already existed at this position, now linked to this node"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB assigned to @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "This TCB has been removed. Please dig marker."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is a pure distant signal\n"
+"No route is currently set through."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is an always-halt signal (e.g. a buffer)\n"
+"No routes can be set from here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will clear the list of trains\n"
+"and the routesetting status of this section.\n"
+"Are you sure?"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will remove the track section and set all its end points to End Of "
+"Interlocking"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Track Circuit Break"
+msgstr "Il y a un \"Track Circuit Break\" ici."
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Track Circuit Break Configuration"
+msgstr "Il y a un \"Track Circuit Break\" ici."
+
+#: tcb_ts_ui.lua
+msgid "Track Section Detail - @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Trains on this section:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Unconfigured Track Circuit Break, right-click to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Wait for this route to be cancelled in order to do anything here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Waiting for route to be set..."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Yes"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"You cannot modify track sections when a route is set or a train is on the "
+"section."
+msgstr ""
+
+#: tool.lua
+msgid "Emplace manual lock"
+msgstr ""
+
+#: tool.lua
+msgid ""
+"Interlocking tool\n"
+"Punch: Highlight track section\n"
+"Place: check route locks/show track section info"
+msgstr ""
+
+#: tool.lua
+msgid "No route locks set"
+msgstr ""
+
+#: tool.lua
+msgid "No track section at this location!"
+msgstr ""
+
+#: tool.lua
+msgid "Node is not a track!"
+msgstr ""
+
+#: tool.lua
+msgid "Route lock inspector"
+msgstr ""
+
+#: tool.lua
+msgid "Route locks currently put:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr "Voie de point de limitation de vitesse"
+
+#: tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr "Point de limitation de vitesse : @1"
+
+#: tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr "Placez un point de limitation de vitesse :"
+
+#: 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."
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
+#~ msgid " does not exist or is invalid"
+#~ msgstr " n'existe pas ou est invalide"
+
+#~ msgid " is at "
+#~ msgstr " est à la position "
+
+#~ msgid " units"
+#~ msgstr " Unités"
+
+#~ msgid " wagon:destroy(): data is not set!"
+#~ msgstr " Appel de wagon:destroy() : données non définies !"
+
+#~ msgid "!!! Train off track !!!"
+#~ msgstr "!!! Train hors voie !!!"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Portes closes)"
+
+#~ msgid "(log"
+#~ msgstr "(log"
+
+#~ msgid ", using placeholder"
+#~ msgstr ", dans un espace réservé"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Embranchement triple"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculo-diagonal"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Pas de coupleur>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Quai @1 (haut, 45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Quai @1 (haut)"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Quai @1 (bas)"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Quai @1 (bas, 45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "Pente @1"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "Avertissement commande ATC Éjecter : portes closes."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "Avertissement commande ATC Éjecter : train en mouvement."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Attention : Commande ATC de renversement impossible car le train se "
+#~ "déplace."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr ""
+#~ "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Controlleur ATC"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Canal : @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Commande : @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Accès à @1"
+
+#~ msgid "Advtrains Status: no_action"
+#~ msgstr "État d'advtrains : aucune action"
+
+#~ msgid "Advtrains is already running normally!"
+#~ msgstr "Advtrains fonctionne déjà correctement !"
+
+#~ msgid "Allow these players to access your wagon:"
+#~ msgstr "Autoriser ces joueurs à embarquer :"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Croix de Saint André"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "La fin du train serait hors voie : annulation."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Grosse locomotive industrielle"
+
+#~ msgid "Boiler"
+#~ msgstr "Chaudière à vapeur"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Wagon de frêt"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Attelage à tampon et vis"
+
+#~ msgid "Bumper"
+#~ msgstr "Heurtoir"
+
+#~ 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)."
+
+#~ 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"
+
+#~ 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"
+
+#~ msgid "Can place and dig tracks in unprotected areas"
+#~ msgstr ""
+#~ "Possibilité de poser ou retirer des voies dans les zones non protégées"
+
+#~ 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"
+
+#~ msgid "Can place, remove and operate trains"
+#~ msgstr "Possibilité de poser, retirer ou opérer les trains"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !"
+
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
+
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1"
+
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Placement impossible : pas de nœud d'appui à l'extrémité supérieure."
+
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Placement impossible : ne pointe pas un nœud"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Placement impossible : emplacement protégé"
+
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Placement impossible : espace occupé !"
+
+#~ msgid "Caution"
+#~ msgstr "Attention"
+
+#~ msgid "Chimney"
+#~ msgstr "Cheminée"
+
+#~ msgid "Clear 'Disable ARS' flag"
+#~ msgstr "Effacer le drapeau \"Désactiver l'ARS\""
+
+#~ msgid "Clear Local Environment"
+#~ msgstr "Effacer l'environnement LuaATC"
+
+#~ msgid "Closed"
+#~ msgstr "Fermé"
+
+#~ msgid "Code"
+#~ msgstr "Code"
+
+#~ msgid "Command"
+#~ msgstr "Commande"
+
+#~ msgid "Command (on)"
+#~ msgstr "Commande (marche)"
+
+#~ 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 !"
+
+#~ msgid "Current FC: "
+#~ msgstr "Code de fret courant: "
+
+#~ msgid "Danger (halt)"
+#~ msgstr "Danger (stop)"
+
+#~ 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 !"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Siège par défaut (poste de pilotage)"
+
+# Routage est il le bon terme ?
+#~ msgid "Delete all train routes, force them to recalculate"
+#~ msgstr "Suppression et recalcul de tous les routages"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "Vit. de départ"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "Voie déconseillée"
+
+#~ msgid ""
+#~ "Destroying wagon with inventory, but inventory is not found? Shouldn't "
+#~ "happen!"
+#~ msgstr "Desctruction d'un wagon avec inventaire introuvable ? Anomalie !"
+
+#~ 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é."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Locomotive à vapeur complexe"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Voie détectrice"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Croisement diagonal"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Canal Digiline"
+
+#~ msgid "Disable the advtrains globalstep temporarily"
+#~ msgstr "Désactive temporairement le pas global d'advtrains"
+
+#~ msgid "Disabled advtrains successfully"
+#~ msgstr "Succès de la désactivation d'advtrains"
+
+#~ msgid "Door Delay"
+#~ msgstr "Durée d'ouverture des portes"
+
+#~ msgid "Door Side"
+#~ msgstr "Ouv. des portes coté"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
+
+#~ 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 "Driver Stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Poste de pilotage (gauche)"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Poste de pilotage (droit)"
+
+#~ msgid "Driver stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Cabine de pilotage"
+
+#~ msgid "Freight Code:"
+#~ msgstr "Code de frêt :"
+
+#~ msgid "Get off"
+#~ msgstr "Débarquer"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Débarquer (de force)"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Locomotive industrielle"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Wagon-citerne industriel"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Wagon grumier industriel"
+
+#~ msgid "Instructed to save() but load() was never called!"
+#~ msgstr "Appel de save() requis sans appel préalable de load() !"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Motrice Japonaise"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Passage inter-voiture de train Japonais"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Japanese signal pole"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "Éjecter les passagers"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Sémaphore"
+
+#~ msgid "Left"
+#~ msgstr "Gauche"
+
+#~ msgid "Left,Right,Closed;"
+#~ msgstr "Gauche,Droit,Fermé;"
+
+#~ msgid "Line"
+#~ msgstr "Ligne"
+
+#~ msgid "Liquid: "
+#~ msgstr "Liquide : "
+
+#~ msgid "Liquid: empty"
+#~ msgstr "Liquide : vide"
+
+#~ msgid "Loading Track"
+#~ msgstr "Voie de Chargement"
+
+#~ msgid "Lock couples"
+#~ msgstr "Verrouiller l'accouplement"
+
+#~ msgid "LuaATC Environment"
+#~ msgstr "Environnement LuaATC"
+
+#~ msgid "LuaATC Mesecon Controller"
+#~ msgstr "Commande Mesecon de LuaATC"
+
+#~ msgid "LuaATC Operation Panel"
+#~ msgstr "Panneau de commande de LuaATC"
+
+#~ msgid "LuaATC component assigned to an invalid environment"
+#~ msgstr "Composant LuaATC assigné à un environnement invalide"
+
+#~ msgid "LuaATC component assigned to environment '@1'"
+#~ msgstr "Composant LuaATC assigné à l'environnement '@1'"
+
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "Erreur @1 du composant LuaATC"
+
+#~ msgid "Missing train_operator privilege"
+#~ msgstr "Privilège \"train_operator\" manquant"
+
+#~ msgid "Munich U-Bahn Main Signal ("
+#~ msgstr "Signal principal métro de Munich ("
+
+#~ msgid "Next FC:"
+#~ msgstr "Code de fret suivant :"
+
+#~ msgid "Next Stop:\n"
+#~ msgstr "Prochain arrêt :\n"
+
+#~ msgid "No callback to handle schedule"
+#~ msgstr "Absence de fonction de gestion de planning"
+
+#~ msgid "No such lua entity."
+#~ msgstr "Pas de telle entité lua."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Pas de tel train : @1."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Pas de tel wagon : @1."
+
+#~ msgid "Not a valid wagon id."
+#~ msgstr "Identificateur de wagon invalide."
+
+#~ msgid "Not allowed to do this."
+#~ msgstr "Vous n'êtes pas autorisé effectuer ceci."
+
+#~ msgid ""
+#~ "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#~ msgstr ""
+#~ "Franchissement de signal rouge : examinez la situation et inversez le "
+#~ "sens de marche du train."
+
+#~ msgid "Onboard Computer"
+#~ msgstr "Ordinateur embarqué"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Voiture passager"
+
+#~ msgid "Passenger area"
+#~ msgstr "Voiture Passager"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "Outil de nommage de composant passif\n"
+#~ "\n"
+#~ "Clic-Droit pour nommer un composant passif."
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculaire"
+
+#~ msgid "Please specify a player name to transfer ownership to."
+#~ msgstr ""
+#~ "Spécifiez le nom du joueur à qui la propriété doit être transférée, SVP."
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Cet emplacement est occupé par un train."
+
+#~ msgid "Prev FC"
+#~ msgstr "Code de fret précédent"
+
+#~ msgid "Print advtrains status info"
+#~ msgstr "Affiche les informations d'état d'advtrains"
+
+#~ msgid "Re-enabling advtrains globalstep..."
+#~ msgstr "Réacivation du pas global d'advtrains..."
+
+#~ msgid "Reduced speed"
+#~ msgstr "Vitesse réduite"
+
+#~ msgid "Reload successful!"
+#~ msgstr "Succès du rechargement !"
+
+#~ msgid "Removing unused wagon"
+#~ msgstr "Suppression d'un wagon inutilisé"
+
+#~ msgid "Restoring saved state in 1 second..."
+#~ msgstr "Restauration du l'état sauvegardé dans une seconde..."
+
+#~ msgid "Restricted speed"
+#~ msgstr "Vitesse limitée"
+
+#~ msgid "Returns the position of the train with the given id"
+#~ msgstr "Affiche la position du train identifié"
+
+#~ msgid "Right"
+#~ msgstr "Droit"
+
+#~ msgid "Routingcode"
+#~ msgstr "Code de routage"
+
+#~ msgid "Save"
+#~ msgstr "Sauvegarder"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Sauvegarder les propriétés du wagon"
+
+#~ msgid "Saving failed: "
+#~ msgstr "Échec de sauvegarde : "
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Attelage Scharfenberg"
+
+#~ msgid "Select seat:"
+#~ msgstr "Choisir le siège :"
+
+#~ msgid "Set name of component (empty to clear)"
+#~ msgstr "Nommer le composant (chaîne vide pour effacer)"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Montrer le stock"
+
+#~ msgid "Speed:"
+#~ msgstr "Vitesse : "
+
+#~ msgid "Station Code"
+#~ msgstr "Code de Station"
+
+#~ msgid "Station code \"@1\" already exists and is owned by @2."
+#~ msgstr "Le code de station \"@1\" existe et est possédé par @2."
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "Voie d'arrêt en station"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Locomotive à vapeur"
+
+#~ msgid "Stop Time"
+#~ msgstr "Durée d'arrêt"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "Voiture de Métropolitain"
+
+#~ msgid "Target:"
+#~ msgstr "Destination : "
+
+#~ msgid "Teleporting to train "
+#~ msgstr "Téléportation au train "
+
+#~ msgid "Teleports you to the position of the train with the given id"
+#~ msgstr "Vous téléporte à la position du train identifié"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Texte affiché à l'intérieur du train"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Texte affiché à l'extérieur du train"
+
+#~ msgid "That player does not exist!"
+#~ msgstr "Ce joueur n'existe pas !"
+
+#~ msgid "That wagon does not exist!"
+#~ msgstr "Ce wagon n'a pas de siège !"
+
+#~ 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 !"
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Le presse-papier est vide."
+
+#~ 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 !"
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Le stock de ce wagon n'est pas vide."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Il y a un \"Signal Influence Point\" ici."
+
+#~ msgid "This Wagon ID"
+#~ msgstr "Identificateur du wagon"
+
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !"
+
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#~ msgid "This position is protected!"
+#~ msgstr "Cet emplacement est protégé !"
+
+#~ 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."
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Cette voie ne peut pas être modifiée."
+
+#~ msgid "This track can not be removed!"
+#~ msgstr "Cette voie ne peut pas être enlevée !"
+
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Cette voie ne peut pas être tournée !"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "Ce wagon n'a pas de siège."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Ce wagon est plein."
+
+#~ 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."
+
+#~ msgid "Track"
+#~ msgstr "Voie"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Outil \"Trackworker\"\n"
+#~ "\n"
+#~ "Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n"
+#~ "\n"
+#~ "Clic-Droit : tourne l'objet"
+
+#~ msgid "Train"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train "
+#~ msgstr "Identificateur du train "
+
+#~ msgid "Train ID"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train copied."
+#~ msgstr "Train copié."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Outil de copie/collage de train\n"
+#~ "\n"
+#~ "Clic-Gauche : copie\n"
+#~ "\n"
+#~ "Clic-Droit : collage"
+
+#~ 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."
+
+#~ msgid "Train overview /coupling control:"
+#~ msgstr "Aperçu du train / commande d'accouplement :"
+
+#~ msgid "Trains stopping here (ARS rules)"
+#~ msgstr "Trains marquant l'arrêt (règles ARS)"
+
+#~ msgid "Unable to load wagon type"
+#~ msgstr "Impossible de charger le type du wagon"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Controlleur ATC, non-configuré"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Composant LuaATC non configuré"
+
+#~ msgid "Uninitialized init="
+#~ msgstr "Variable init non initialisée"
+
+#~ msgid "Uninitialized, removing"
+#~ msgstr "Non initialisé, retiré"
+
+#~ msgid "Unknown Station"
+#~ msgstr "Gare inconnue"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Voie de Déchargement"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les "
+#~ "portes closes !"
+
+#~ msgid "Wagon @1 ownership changed from @2 to @3"
+#~ msgstr "La propriété du wagon @1 a été transférée de @2 à @3"
+
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Outil de propriété du wagon"
+
+#~ msgid ""
+#~ "Wagon Properties Tool\n"
+#~ "Punch a wagon to view and edit the Wagon Properties"
+#~ msgstr ""
+#~ "Outil de propriété du wagon\n"
+#~ "Frappez un wagon pour voir et modifier ses propriétés"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Propriétés du wagon"
+
+#~ msgid "Wagon road number:"
+#~ msgstr "Immatriculation du wagon :"
+
+#~ msgid "Wait for signal to clear"
+#~ msgstr "En attente de signal d'autorisation"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "Signal mural (gauche)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "Signal mural (droit)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "Signal mural (plafond)"
+
+#~ 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."
+
+#~ msgid "Wheel"
+#~ msgstr "Roue"
+
+#~ msgid "Y-turnout"
+#~ msgstr "Embranchement en Y"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Accès interdit au poste de pilotage."
+
+#~ 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é."
+
+#~ 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\" (?)"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé."
+
+#~ 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\"."
+
+#~ 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."
+
+#~ 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\"."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
+#~ "\"railway_operator\" manquant)"
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Montée impossible dans ce wagon."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"@1\"."
+
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"train_operator\"."
+
+#~ msgid "You have been given ownership of wagon @1"
+#~ msgstr "La propriété du wagon @1 vous a été transférée"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer "
+#~ "cet attelage."
+
+#~ msgid "from wagon_save table."
+#~ msgstr "de la table wagon_save."
+
+#~ 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 !"
+
+#~ msgid "slowdown"
+#~ msgstr "ralentissement"
diff --git a/advtrains_interlocking/po/update-translations.sh b/advtrains_interlocking/po/update-translations.sh
new file mode 100644
index 0000000..5c42e7b
--- /dev/null
+++ b/advtrains_interlocking/po/update-translations.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+MODNAME="advtrains_interlocking"
+MSGID_BUGS_ADDR='advtrains-discuss@lists.sr.ht'
+
+PODIR=`dirname "$0"`
+ATDIR="$PODIR/.."
+POTFILE="$PODIR/$MODNAME.pot"
+
+xgettext \
+ -D "$ATDIR" \
+ -d "$MODNAME" \
+ -o "$POTFILE" \
+ -p . \
+ -L lua \
+ --add-location=file \
+ --from-code=UTF-8 \
+ --sort-by-file \
+ --keyword='S' \
+ --package-name="$MODNAME" \
+ --msgid-bugs-address="$MSGID_BUGS_ADDR" \
+ `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \
+ &&
+for i in "$PODIR"/*.po; do
+ msgmerge -U \
+ --sort-by-file \
+ $i "$POTFILE"
+done
diff --git a/advtrains_interlocking/po/zh_CN.po b/advtrains_interlocking/po/zh_CN.po
new file mode 100644
index 0000000..48c5805
--- /dev/null
+++ b/advtrains_interlocking/po/zh_CN.po
@@ -0,0 +1,1278 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:21+0200\n"
+"PO-Revision-Date: 2023-10-09 11:24+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Simplified)\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: autonaming.lua
+msgid "Prefix set, next signal name will be: @1"
+msgstr ""
+
+#: autonaming.lua
+msgid "Prefix unset, signals are not auto-named for you!"
+msgstr ""
+
+#: autonaming.lua
+msgid ""
+"Sets the current prefix for automatically naming interlocking components. "
+"Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"
+msgstr ""
+
+#: database.lua
+msgid "Created track section @1 from @2 TCBs"
+msgstr ""
+
+#: database.lua
+msgid "Track section inconsistent here, repairing..."
+msgstr ""
+
+#: database.lua
+msgid "Track section partition found, repairing..."
+msgstr ""
+
+#: init.lua
+msgid "Can set up track sections, routes and signals"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 Terminal @2"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is held in @2 position when this route is set and freed "
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is no longer affected when this route is set."
+msgstr ""
+
+#: route_prog.lua
+msgid "Added track section @1 to the route."
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance to next route section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance/Complete Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advancing over next section is"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel if you are unsure!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel route programming"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cannot program route without a target"
+msgstr ""
+
+#: route_prog.lua tcb_ts_ui.lua
+msgid "End of interlocking"
+msgstr ""
+
+#: route_prog.lua
+msgid "Enter Route Name"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish programming route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route HERE"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route at end of NEXT section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 (punch to unfix)"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 until segment #@3 is freed."
+msgstr ""
+
+#: route_prog.lua route_ui.lua signal_aspect_ui.lua tcb_ts_ui.lua tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Next section is diverging (>2 TCBs)"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route discarded."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route ends at signal:"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route leads into"
+msgstr ""
+
+#: route_prog.lua
+msgid ""
+"Route programming mode active. Punch TCBs to add route segments, punch "
+"turnouts to lock them."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route section @1 removed."
+msgstr ""
+
+#: route_prog.lua
+msgid "Routes should in most cases end at signals."
+msgstr ""
+
+#: route_prog.lua
+msgid "Save Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Step back one section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Successfully programmed route."
+msgstr ""
+
+#: route_prog.lua
+msgid "The origin TCB has become unknown during programming. Try again."
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is not suitable as"
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is unconfigured, you first need to assign it to a rail"
+msgstr ""
+
+#: route_prog.lua
+msgid "WARNING: Route does not end at a signal."
+msgstr ""
+
+#: route_prog.lua
+msgid "[Route programming] "
+msgstr ""
+
+#: route_prog.lua
+msgid "impossible at this place."
+msgstr ""
+
+#: route_prog.lua
+msgid "non-interlocked area"
+msgstr ""
+
+#: route_prog.lua
+msgid "route continuation."
+msgstr ""
+
+#: route_ui.lua
+msgid "<< Select a route part to edit options"
+msgstr ""
+
+#: route_ui.lua
+#, fuzzy
+msgid "<Default Aspect>"
+msgstr "默认座位"
+
+#: route_ui.lua
+msgid "ARS Rule List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Announce distant signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Back to signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Call-on (section may be occupied)"
+msgstr ""
+
+#: route_ui.lua
+msgid "Clone Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Delete Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Error:"
+msgstr ""
+
+#: route_ui.lua
+msgid "New From Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "No Signal at this TCB"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route name"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route overview"
+msgstr ""
+
+#: route_ui.lua
+msgid "Save ARS List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Section Options:"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Set"
+msgstr ""
+
+#: route_ui.lua signal_aspect_ui.lua
+#, fuzzy
+msgid "Signal Aspect:"
+msgstr "信号灯"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 has different section than previous TCB"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is not assigned to previous track section"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Track section after @1 missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Turnout/component missing at @1"
+msgstr ""
+
+#: routesetting.lua
+msgid "Lock conflict at @1, Held locked by:"
+msgstr ""
+
+#: routesetting.lua
+msgid "No TCB found at @1. Please update or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "No track section adjacent to @1. Please reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2, segment #@3"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' already has route set from @2:"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' is occupied!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' not found!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"TCB at @1 has different section than previous TCB. Please update track "
+"section or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"Turnout/component missing at @1. Please update track section or reconfigure "
+"route!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<assign distant>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<none>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned distant signal to the main signal at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned signal to the TCB at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua tool.lua
+msgid "Clear"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Influence point of another signal is already present!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Node is too far away. Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Please look in train's driving direction and punch rail "
+"to set influence point."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Successfully set influence point"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Dst: @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is not set."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is set at @1."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Modify"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set distant signal: Punch the main signal to assign!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set influence point"
+msgstr ""
+
+#: smartroute.lua
+msgid "Apply"
+msgstr ""
+
+#: smartroute.lua
+msgid "Route search: @1 found"
+msgstr ""
+
+#: smartroute.lua
+msgid "Search further"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: No track section directly ahead!"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: TCBS or routes don't exist here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid " (invalid)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "@1 locks in state @2"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "A route is requested from this signal:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Add locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Assign a signal"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic Working is active."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic routesetting"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Boundary TCBs:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove TCB: Both sides must have no signal assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove track, a train is here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Cannot delete route which has ARS rules, please review and then delete "
+"through edit dialog!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Clear locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Configuring TCB: Already existed at this position, it is now linked to this "
+"TCB marker"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Cannot use static signals for routesetting. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Internal error, TCBS doesn't exist. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Node is too far away. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Not a compatible signal. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the rail you want to assign this TCB to."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the signal to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully assigned signal."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully configured TCB"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Create Interlocked Track Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Delete this route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Disable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Distant signal triggers ARS"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Edit"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Enable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Error: TS modified, abort!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Final TCBS unset (legacy-style buffer route)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Fixed route locks (e.g. level crossings):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link: @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Multiple routes are requested (first available is set):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "NOTE: ARS is disabled."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "New (Manual)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No Link"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No routes are yet defined."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No trains on this section."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Punch components to add fixed locks. (punch anything else = end)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Remove Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Reset section state"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Reset track section"
+msgstr "改变行车方向"
+
+#: tcb_ts_ui.lua
+msgid "Reset track section @1!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route has been set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is re-set when a train passed."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set over this signal by:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set: "
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes are not automatically set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Section holds @1 route locks."
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Section name"
+msgstr "车站名称"
+
+#: tcb_ts_ui.lua
+msgid "Set ARS default route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Set Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Setting fixed locks finished!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show track section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Side @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal at @1"
+msgstr "信号灯"
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal name"
+msgstr "信号灯"
+
+#: tcb_ts_ui.lua
+msgid "Signal on B side already assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signalling"
+msgstr "信号灯"
+
+#: tcb_ts_ui.lua
+msgid "Smart Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB Link: Select linked TCB now!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB already existed at this position, now linked to this node"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB assigned to @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "This TCB has been removed. Please dig marker."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is a pure distant signal\n"
+"No route is currently set through."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is an always-halt signal (e.g. a buffer)\n"
+"No routes can be set from here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will clear the list of trains\n"
+"and the routesetting status of this section.\n"
+"Are you sure?"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will remove the track section and set all its end points to End Of "
+"Interlocking"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break Configuration"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Section Detail - @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Trains on this section:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Unconfigured Track Circuit Break, right-click to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Wait for this route to be cancelled in order to do anything here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Waiting for route to be set..."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Yes"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"You cannot modify track sections when a route is set or a train is on the "
+"section."
+msgstr ""
+
+#: tool.lua
+msgid "Emplace manual lock"
+msgstr ""
+
+#: tool.lua
+msgid ""
+"Interlocking tool\n"
+"Punch: Highlight track section\n"
+"Place: check route locks/show track section info"
+msgstr ""
+
+#: tool.lua
+msgid "No route locks set"
+msgstr ""
+
+#: tool.lua
+msgid "No track section at this location!"
+msgstr ""
+
+#: tool.lua
+msgid "Node is not a track!"
+msgstr ""
+
+#: tool.lua
+msgid "Route lock inspector"
+msgstr ""
+
+#: tool.lua
+msgid "Route locks currently put:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track without the @1 privilege."
+msgstr "您没有“@1”权限,不能调整这段轨道。"
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track."
+msgstr "您不能调整这段轨道。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(车门已关闭)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三开道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<没有车钩>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "较高的@1站台 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "较高的@1站台"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "较低的@1站台"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "较低的@1站台 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 语法错误:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 语法错误:“I”命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "频道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "铁路道口信号灯"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火车后部不在轨道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工业用火车头"
+
+#~ msgid "Boiler"
+#~ msgstr "锅炉"
+
+#~ msgid "Box Wagon"
+#~ msgstr "货运车厢"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "链式车钩"
+
+#~ msgid "Bumper"
+#~ msgstr "保险杠"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "无法上车:车门已关闭或车厢已满。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "无法放置斜坡:较高端没有支撑方块。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "无法放置斜坡:您没有选择任何方块。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "无法放置:此区域已被保护。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "无法放置斜坡:此区域已被占用。"
+
+#~ msgid "Chimney"
+#~ msgstr "烟囱"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (激活时)"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "默认座位 (司机座位)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "出发速度"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "请不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精细的蒸汽机车"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探测轨道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉轨道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 频道"
+
+#~ msgid "Door Delay"
+#~ msgstr "车门关闭时间"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "车门已关闭,请使用潜行+右键单击下车。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左侧司机座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右侧司机座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "驾驶室"
+
+#~ msgid "Get off"
+#~ msgstr "下车"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "强制下车"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工业用火车头"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液体运输车厢"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材运输车厢"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列车车头"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火车车钩"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列车车厢"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列车车厢"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂板信号机"
+
+#~ msgid "Line"
+#~ msgstr "火车线路"
+
+#~ msgid "Loading Track"
+#~ msgstr "装货轨道"
+
+#~ msgid "Lock couples"
+#~ msgstr "锁定连接处"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您没有指向一个可以用火车复制工具复制的物体。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 为“@1”的列车不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 为“@1”的车厢不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能调整这段轨道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客车"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客车"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "被动元件命名工具\n"
+#~ "\n"
+#~ "右键单击命名所选元件。"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉轨道"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由码"
+
+#~ msgid "Save"
+#~ msgstr "保存"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "保存车厢属性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式车钩"
+
+#~ msgid "Select seat:"
+#~ msgstr "请选择座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "显示物品栏"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Station Code"
+#~ msgstr "车站代码"
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "车站轨道"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽机车"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站时间"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地铁车厢"
+
+#~ msgid "Target:"
+#~ msgstr "目标速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "车厢内部显示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "车厢外部显示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "无法复制:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "无法粘贴:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪贴板是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "轨道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "轨道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "车厢已满。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具调整这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "这里已被保护。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能调整这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋转这段轨道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "车厢已满。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "这是 @1 的车厢,您不能摧毁它。"
+
+#~ msgid "Track"
+#~ msgstr "轨道"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "铁路调整工具\n"
+#~ "\n"
+#~ "左键单击:切换轨道类型\n"
+#~ "右键单击:旋转方块"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已复制列车。"
+
+#~ msgid "Train copied."
+#~ msgstr "已复制列车。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火车复制工具\n"
+#~ "\n"
+#~ "左键单击:复制\n"
+#~ "右键单击:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 部件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸货轨道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "请使用潜行+右键上车。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁挂式信号灯 (左侧)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁挂式信号灯 (右侧)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "悬挂式信号灯"
+
+#~ 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 ""
+#~ "警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请"
+#~ "按潜行键并左键单击此车厢。"
+
+#~ msgid "Wheel"
+#~ msgstr "车轮"
+
+#~ msgid "Y-turnout"
+#~ msgstr "对称道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您没有“train_operator”权限,不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您没有“train_operator”权限,不能连接这两节车厢。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能命名被动元件。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。"
diff --git a/advtrains_interlocking/po/zh_TW.po b/advtrains_interlocking/po/zh_TW.po
new file mode 100644
index 0000000..6f07afb
--- /dev/null
+++ b/advtrains_interlocking/po/zh_TW.po
@@ -0,0 +1,1278 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:21+0200\n"
+"PO-Revision-Date: 2023-10-09 11:31+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Traditional)\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: autonaming.lua
+msgid "Prefix set, next signal name will be: @1"
+msgstr ""
+
+#: autonaming.lua
+msgid "Prefix unset, signals are not auto-named for you!"
+msgstr ""
+
+#: autonaming.lua
+msgid ""
+"Sets the current prefix for automatically naming interlocking components. "
+"Example: '/at_nameprefix TEST' - signals will be named TEST1, TEST2 and so on"
+msgstr ""
+
+#: database.lua
+msgid "Created track section @1 from @2 TCBs"
+msgstr ""
+
+#: database.lua
+msgid "Track section inconsistent here, repairing..."
+msgstr ""
+
+#: database.lua
+msgid "Track section partition found, repairing..."
+msgstr ""
+
+#: init.lua
+msgid "Can set up track sections, routes and signals"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 Terminal @2"
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is held in @2 position when this route is set and freed "
+msgstr ""
+
+#: route_prog.lua
+msgid "@1 is no longer affected when this route is set."
+msgstr ""
+
+#: route_prog.lua
+msgid "Added track section @1 to the route."
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance to next route section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advance/Complete Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Advancing over next section is"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel if you are unsure!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cancel route programming"
+msgstr ""
+
+#: route_prog.lua
+msgid "Cannot program route without a target"
+msgstr ""
+
+#: route_prog.lua tcb_ts_ui.lua
+msgid "End of interlocking"
+msgstr ""
+
+#: route_prog.lua
+msgid "Enter Route Name"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish programming route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route HERE"
+msgstr ""
+
+#: route_prog.lua
+msgid "Finish route at end of NEXT section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 (punch to unfix)"
+msgstr ""
+
+#: route_prog.lua
+msgid "Fixed in state @1 by route @2 until segment #@3 is freed."
+msgstr ""
+
+#: route_prog.lua route_ui.lua signal_aspect_ui.lua tcb_ts_ui.lua tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
+
+#: route_prog.lua
+msgid "Next section is diverging (>2 TCBs)"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route discarded."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route ends at signal:"
+msgstr ""
+
+#: route_prog.lua
+msgid "Route leads into"
+msgstr ""
+
+#: route_prog.lua
+msgid ""
+"Route programming mode active. Punch TCBs to add route segments, punch "
+"turnouts to lock them."
+msgstr ""
+
+#: route_prog.lua
+msgid "Route section @1 removed."
+msgstr ""
+
+#: route_prog.lua
+msgid "Routes should in most cases end at signals."
+msgstr ""
+
+#: route_prog.lua
+msgid "Save Route"
+msgstr ""
+
+#: route_prog.lua
+msgid "Step back one section"
+msgstr ""
+
+#: route_prog.lua
+msgid "Successfully programmed route."
+msgstr ""
+
+#: route_prog.lua
+msgid "The origin TCB has become unknown during programming. Try again."
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is not suitable as"
+msgstr ""
+
+#: route_prog.lua
+msgid "This TCB is unconfigured, you first need to assign it to a rail"
+msgstr ""
+
+#: route_prog.lua
+msgid "WARNING: Route does not end at a signal."
+msgstr ""
+
+#: route_prog.lua
+msgid "[Route programming] "
+msgstr ""
+
+#: route_prog.lua
+msgid "impossible at this place."
+msgstr ""
+
+#: route_prog.lua
+msgid "non-interlocked area"
+msgstr ""
+
+#: route_prog.lua
+msgid "route continuation."
+msgstr ""
+
+#: route_ui.lua
+msgid "<< Select a route part to edit options"
+msgstr ""
+
+#: route_ui.lua
+#, fuzzy
+msgid "<Default Aspect>"
+msgstr "預設座位"
+
+#: route_ui.lua
+msgid "ARS Rule List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Announce distant signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Back to signal"
+msgstr ""
+
+#: route_ui.lua
+msgid "Call-on (section may be occupied)"
+msgstr ""
+
+#: route_ui.lua
+msgid "Clone Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Delete Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "Error:"
+msgstr ""
+
+#: route_ui.lua
+msgid "New From Route"
+msgstr ""
+
+#: route_ui.lua
+msgid "No Signal at this TCB"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route name"
+msgstr ""
+
+#: route_ui.lua
+msgid "Route overview"
+msgstr ""
+
+#: route_ui.lua
+msgid "Save ARS List"
+msgstr ""
+
+#: route_ui.lua
+msgid "Section Options:"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Set"
+msgstr ""
+
+#: route_ui.lua signal_aspect_ui.lua
+#, fuzzy
+msgid "Signal Aspect:"
+msgstr "色燈號誌機"
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 has different section than previous TCB"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "TCB at @1 is not assigned to previous track section"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Track section after @1 missing"
+msgstr ""
+
+#: route_ui.lua tcb_ts_ui.lua
+msgid "Turnout/component missing at @1"
+msgstr ""
+
+#: routesetting.lua
+msgid "Lock conflict at @1, Held locked by:"
+msgstr ""
+
+#: routesetting.lua
+msgid "No TCB found at @1. Please update or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "No track section adjacent to @1. Please reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2"
+msgstr ""
+
+#: routesetting.lua
+msgid "Route @1 from signal @2, segment #@3"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' already has route set from @2:"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' is occupied!"
+msgstr ""
+
+#: routesetting.lua
+msgid "Section '@1' not found!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"TCB at @1 has different section than previous TCB. Please update track "
+"section or reconfigure route!"
+msgstr ""
+
+#: routesetting.lua
+msgid ""
+"Turnout/component missing at @1. Please update track section or reconfigure "
+"route!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<assign distant>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "<none>"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned distant signal to the main signal at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Assigned signal to the TCB at @1"
+msgstr ""
+
+#: signal_aspect_ui.lua tool.lua
+msgid "Clear"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Influence point of another signal is already present!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Node is too far away. Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid ""
+"Configuring Signal: Please look in train's driving direction and punch rail "
+"to set influence point."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: Successfully set influence point"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Configuring Signal: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Dst: @1"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is not set."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Influence point is set at @1."
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Modify"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set distant signal: Punch the main signal to assign!"
+msgstr ""
+
+#: signal_aspect_ui.lua
+msgid "Set influence point"
+msgstr ""
+
+#: smartroute.lua
+msgid "Apply"
+msgstr ""
+
+#: smartroute.lua
+msgid "Route search: @1 found"
+msgstr ""
+
+#: smartroute.lua
+msgid "Search further"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: No track section directly ahead!"
+msgstr ""
+
+#: smartroute.lua
+msgid "Smartroute: TCBS or routes don't exist here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid " (invalid)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "@1 locks in state @2"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "A route is requested from this signal:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Add locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Assign a signal"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic Working is active."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Automatic routesetting"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Boundary TCBs:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove TCB: Both sides must have no signal assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Can't remove track, a train is here!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Cancel Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Cannot delete route which has ARS rules, please review and then delete "
+"through edit dialog!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Clear locks"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"Configuring TCB: Already existed at this position, it is now linked to this "
+"TCB marker"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Cannot use static signals for routesetting. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Internal error, TCBS doesn't exist. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Node is too far away. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Not a compatible signal. Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the rail you want to assign this TCB to."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Please punch the signal to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully assigned signal."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: Successfully configured TCB"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Configuring TCB: This is not a normal two-connection rail! Aborted."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Create Interlocked Track Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Delete this route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Disable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Distant signal triggers ARS"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Edit"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Enable Automatic Working"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Error: TS modified, abort!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Final TCBS unset (legacy-style buffer route)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Fixed route locks (e.g. level crossings):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Link: @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Multiple routes are requested (first available is set):"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "NOTE: ARS is disabled."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "New (Manual)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No Link"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No routes are yet defined."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "No trains on this section."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Punch components to add fixed locks. (punch anything else = end)"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Remove Section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Reset section state"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Reset track section"
+msgstr "改變行車方向"
+
+#: tcb_ts_ui.lua
+msgid "Reset track section @1!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route has been set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is re-set when a train passed."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set over this signal by:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Route is set: "
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes are not automatically set."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Routes:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Section holds @1 route locks."
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Section name"
+msgstr "車站名稱"
+
+#: tcb_ts_ui.lua
+msgid "Set ARS default route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Set Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Setting fixed locks finished!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Show track section"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Side @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal at @1"
+msgstr "色燈號誌機"
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signal name"
+msgstr "色燈號誌機"
+
+#: tcb_ts_ui.lua
+msgid "Signal on B side already assigned!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+#, fuzzy
+msgid "Signalling"
+msgstr "色燈號誌機"
+
+#: tcb_ts_ui.lua
+msgid "Smart Route"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB Link: Select linked TCB now!"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB already existed at this position, now linked to this node"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "TCB assigned to @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "This TCB has been removed. Please dig marker."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is a pure distant signal\n"
+"No route is currently set through."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This is an always-halt signal (e.g. a buffer)\n"
+"No routes can be set from here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will clear the list of trains\n"
+"and the routesetting status of this section.\n"
+"Are you sure?"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"This will remove the track section and set all its end points to End Of "
+"Interlocking"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Circuit Break Configuration"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Track Section Detail - @1"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Trains on this section:"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Unconfigured Track Circuit Break, right-click to assign."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Wait for this route to be cancelled in order to do anything here."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Waiting for route to be set..."
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid "Yes"
+msgstr ""
+
+#: tcb_ts_ui.lua
+msgid ""
+"You cannot modify track sections when a route is set or a train is on the "
+"section."
+msgstr ""
+
+#: tool.lua
+msgid "Emplace manual lock"
+msgstr ""
+
+#: tool.lua
+msgid ""
+"Interlocking tool\n"
+"Punch: Highlight track section\n"
+"Place: check route locks/show track section info"
+msgstr ""
+
+#: tool.lua
+msgid "No route locks set"
+msgstr ""
+
+#: tool.lua
+msgid "No track section at this location!"
+msgstr ""
+
+#: tool.lua
+msgid "Node is not a track!"
+msgstr ""
+
+#: tool.lua
+msgid "Route lock inspector"
+msgstr ""
+
+#: tool.lua
+msgid "Route locks currently put:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr ""
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track without the @1 privilege."
+msgstr "您沒有「@1」許可權,不能調整這段軌道。"
+
+#: tsr_rail.lua
+msgid "You are not allowed to configure this track."
+msgstr "您不能調整這段軌道。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(車門已關閉)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三開道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<無連結器>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "較高的@1月臺 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "較高的@1月臺"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "較低的@1月臺"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "較低的@1月臺 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 語法錯誤:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "頻道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "平交道號誌燈"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火車後部不在軌道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工業用火車頭"
+
+#~ msgid "Boiler"
+#~ msgstr "鍋爐"
+
+#~ msgid "Box Wagon"
+#~ msgstr "貨運車廂"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "鏈式連結器"
+
+#~ msgid "Bumper"
+#~ msgstr "保險槓"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "無法上車:車門已關閉或車廂已滿。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "無法放置斜坡:較高階沒有支撐方塊。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "無法放置斜坡:您沒有選擇任何方塊。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "無法放置:此區域已被保護。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "無法放置斜坡:此區域已被佔用。"
+
+#~ msgid "Chimney"
+#~ msgstr "煙囪"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (啟用時)"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "預設座位 (司機座位)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "出發速度"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "請不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精細的蒸汽機車"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探測軌道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉軌道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 頻道"
+
+#~ msgid "Door Delay"
+#~ msgstr "車門關閉時間"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左側司機座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右側司機座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "駕駛室"
+
+#~ msgid "Get off"
+#~ msgstr "下車"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "強制下車"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工業用火車頭"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液體運輸車廂"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材運輸車廂"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列車車頭"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火車連結器"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列車車廂"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列車車廂"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂木式號誌機"
+
+#~ msgid "Line"
+#~ msgstr "火車線路"
+
+#~ msgid "Loading Track"
+#~ msgstr "裝貨軌道"
+
+#~ msgid "Lock couples"
+#~ msgstr "鎖定連結處"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 為「@1」的列車不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 為「@1」的車廂不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能調整這段軌道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客車"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客車"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "被動元件命名工具\n"
+#~ "\n"
+#~ "右鍵單擊命名所選元件。"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉軌道"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由碼"
+
+#~ msgid "Save"
+#~ msgstr "儲存"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "儲存車廂屬性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式連結器"
+
+#~ msgid "Select seat:"
+#~ msgstr "請選擇座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "顯示物品欄"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Station Code"
+#~ msgstr "車站碼"
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "車站軌道"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽機車"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站時間"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地鐵車廂"
+
+#~ msgid "Target:"
+#~ msgstr "目標速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "車廂內部顯示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "車廂外部顯示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "無法複製:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "無法貼上:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪貼簿是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "軌道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "軌道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "車廂已滿。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具調整這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "這裡已被保護。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能調整這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋轉這段軌道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "車廂已滿。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "這是 @1 的車廂,您不能摧毀它。"
+
+#~ msgid "Track"
+#~ msgstr "軌道"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "鐵路調整工具\n"
+#~ "\n"
+#~ "左鍵單擊:切換軌道型別\n"
+#~ "右鍵單擊:旋轉方塊"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已複製火車。"
+
+#~ msgid "Train copied."
+#~ msgstr "已複製火車。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火車複製工具\n"
+#~ "\n"
+#~ "左鍵單擊:複製\n"
+#~ "右鍵單擊:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 元件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸貨軌道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "請使用潛行+右鍵上車。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁掛式色燈號誌機 (左側)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁掛式色燈號誌機 (右側)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "懸掛式色燈號誌機"
+
+#~ 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 ""
+#~ "警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請"
+#~ "按潛行鍵並左鍵單擊此車廂。"
+
+#~ msgid "Wheel"
+#~ msgstr "車輪"
+
+#~ msgid "Y-turnout"
+#~ msgstr "對稱道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能命名這個元件。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。"
diff --git a/advtrains_interlocking/route_prog.lua b/advtrains_interlocking/route_prog.lua
index 81aa133..b080945 100644
--- a/advtrains_interlocking/route_prog.lua
+++ b/advtrains_interlocking/route_prog.lua
@@ -19,6 +19,9 @@ C. punch a turnout (or some other passive component) to fix its state (toggle)
The route visualization will also be used to visualize routes after they have been programmed.
]]--
+-- Get current translator
+local S = advtrains.interlocking.translate
+
-- TODO duplicate
local lntrans = { "A", "B" }
local function sigd_to_string(sigd)
@@ -123,11 +126,11 @@ the distant signal aspect is determined as DANGER.
]]--
local function chat(pname, message)
- minetest.chat_send_player(pname, "[Route programming] "..message)
+ minetest.chat_send_player(pname, S("[Route programming] ")..message)
end
local function clear_lock(locks, pname, pts)
locks[pts] = nil
- chat(pname, pts.." is no longer affected when this route is set.")
+ chat(pname, S("@1 is no longer affected when this route is set.", pts))
end
local function otherside(s)
@@ -178,7 +181,9 @@ function advtrains.interlocking.visualize_route(origin, route, context, tmp_lcks
if not pos then
pos = advtrains.decode_pos(pts)
end
- routesprite(context, pos, "fix"..k..pts, "at_il_route_lock.png", "Fixed in state '"..state.."' by route "..route.name.." until segment #"..k.." is freed.")
+ routesprite(context, pos, "fix"..k..pts, "at_il_route_lock.png",
+ S("Fixed in state @1 by route @2 until segment #@3 is freed.", state, route.name, k)
+ )
end
end
@@ -197,7 +202,8 @@ function advtrains.interlocking.visualize_route(origin, route, context, tmp_lcks
if node_ok then
yaw = advtrains.dir_to_angle(conns[otherside(sigd.s)].c)
end
- routemarker(context, sigd.p, "rteterm"..i, "at_il_route_end.png", yaw, route.name.." Terminal "..i)
+ routemarker(context, sigd.p, "rteterm"..i, "at_il_route_end.png", yaw,
+ S("@1 Terminal @2", route.name, i))
end
end
end
@@ -205,7 +211,8 @@ function advtrains.interlocking.visualize_route(origin, route, context, tmp_lcks
-- display locks set by player
for pts, state in pairs(tmp_lcks) do
local pos = advtrains.decode_pos(pts)
- routesprite(context, pos, "fixp"..pts, "at_il_route_lock_edit.png", "Fixed in state '"..state.."' by route "..route.name.." (punch to unfix)",
+ routesprite(context, pos, "fixp"..pts, "at_il_route_lock_edit.png",
+ S("Fixed in state @1 by route @2 (punch to unfix)", state, route.name),
function() clear_lock(tmp_lcks, pname, pts) end)
end
end
@@ -216,7 +223,7 @@ local player_rte_prog = {}
function advtrains.interlocking.init_route_prog(pname, sigd, default_route)
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
local rp = {
@@ -240,7 +247,7 @@ function advtrains.interlocking.init_route_prog(pname, sigd, default_route)
end
player_rte_prog[pname] = rp
advtrains.interlocking.visualize_route(sigd, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
- minetest.chat_send_player(pname, "Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.")
+ minetest.chat_send_player(pname, S("Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them."))
end
local function get_last_route_item(origin, route)
@@ -253,33 +260,33 @@ end
local function do_advance_route(pname, rp, sigd, tsref)
table.insert(rp.route, {next = sigd, locks = rp.tmp_lcks})
rp.tmp_lcks = {}
- chat(pname, "Added track section '"..(tsref and (tsref.name or "") or "--EOI--").."' to the route.")
+ chat(pname, S("Added track section @1 to the route.", (tsref and (tsref.name or "") or "--EOI--")))
end
local function finishrpform(pname)
local rp = player_rte_prog[pname]
if not rp then return end
- local form = "size[7,6]label[0.5,0.5;Finish programming route]"
+ local form = "size[7,6]label[0.5,0.5;"..S("Finish programming route").."]"
local terminal = get_last_route_item(rp.origin, rp.route)
if terminal then
local term_tcbs = advtrains.interlocking.db.get_tcbs(terminal)
if term_tcbs.signal then
local signalname = (term_tcbs.signal_name or "") .. sigd_to_string(terminal)
- form = form .. "label[0.5,1.5;Route ends at signal:]"
+ form = form .. "label[0.5,1.5;"..S("Route ends at signal:").."]"
form = form .. "label[0.5,2 ;"..signalname.."]"
else
- form = form .. "label[0.5,1.5;WARNING: Route does not end at a signal.]"
- form = form .. "label[0.5,2 ;Routes should in most cases end at signals.]"
- form = form .. "label[0.5,2.5;Cancel if you are unsure!]"
+ form = form .. "label[0.5,1.5;"..S("WARNING: Route does not end at a signal.").."]"
+ form = form .. "label[0.5,2 ;"..S("Routes should in most cases end at signals.").."]"
+ form = form .. "label[0.5,2.5;"..S("Cancel if you are unsure!").."]"
end
else
- form = form .. "label[0.5,1.5;Route leads into]"
- form = form .. "label[0.5,2 ;non-interlocked area]"
+ form = form .. "label[0.5,1.5;"..S("Route leads into").."]"
+ form = form .. "label[0.5,2 ;"..S("non-interlocked area").."]"
end
- form = form.."field[0.8,3.5;5.2,1;name;Enter Route Name;]"
- form = form.."button_exit[0.5,4.5; 5,1;save;Save Route]"
+ form = form.."field[0.8,3.5;5.2,1;name;"..S("Enter Route Name")..";]"
+ form = form.."button_exit[0.5,4.5; 5,1;save;"..S("Save Route").."]"
minetest.show_formspec(pname, "at_il_routepf", form)
@@ -327,7 +334,7 @@ local function check_advance_valid(tcbpos, rp)
local adv_tcbs = advtrains.interlocking.db.get_tcbs(this_sigd)
local next_tsid = adv_tcbs.ts_id
local can_over, over_ts, next_tc_bs = false, nil, nil
- local cannotover_rsn = "Next section is diverging (>2 TCBs)"
+ local cannotover_rsn = S("Next section is diverging (>2 TCBs)")
if next_tsid then
-- you may not advance over EOI. While this is technically possible,
-- in practise this just enters an unnecessary extra empty route item.
@@ -335,7 +342,7 @@ local function check_advance_valid(tcbpos, rp)
next_tc_bs = over_ts.tc_breaks
can_over = #next_tc_bs <= 2
else
- cannotover_rsn = "End of interlocking"
+ cannotover_rsn = S("End of interlocking")
end
local over_sigd = nil
@@ -377,29 +384,29 @@ local function show_routing_form(pname, tcbpos, message)
-- show nothing at all
-- In all cases, Discard and Backtrack buttons needed.
- local form = "size[7,9.5]label[0.5,0.5;Advance/Complete Route]"
+ local form = "size[7,9.5]label[0.5,0.5;"..S("Advance/Complete Route").."]"
if message then
form = form .. "label[0.5,1;"..message.."]"
end
if advance_valid and not is_endpoint then
- form = form.. "label[0.5,1.8;Advance to next route section]"
+ form = form.. "label[0.5,1.8;"..S("Advance to next route section").."]"
form = form.."image_button[0.5,2.2; 5,1;at_il_routep_advance.png;advance;]"
form = form.. "label[0.5,3.5;-------------------------]"
else
- form = form.. "label[0.5,2.3;This TCB is not suitable as]"
- form = form.. "label[0.5,2.8;route continuation.]"
+ form = form.. "label[0.5,2.3;"..S("This TCB is not suitable as").."]"
+ form = form.. "label[0.5,2.8;"..S("route continuation.").."]"
end
if advance_valid or is_endpoint then
- form = form.. "label[0.5,3.8;Finish route HERE]"
+ form = form.. "label[0.5,3.8;"..S("Finish route HERE").."]"
form = form.."image_button[0.5, 4.2; 5,1;at_il_routep_end_here.png;endhere;]"
if can_over then
- form = form.. "label[0.5,5.3;Finish route at end of NEXT section]"
+ form = form.. "label[0.5,5.3;"..S("Finish route at end of NEXT section").."]"
form = form.."image_button[0.5,5.7; 5,1;at_il_routep_end_over.png;endover;]"
else
- form = form.. "label[0.5,5.3;Advancing over next section is]"
- form = form.. "label[0.5,5.8;impossible at this place.]"
+ form = form.. "label[0.5,5.3;"..S("Advancing over next section is").."]"
+ form = form.. "label[0.5,5.8;"..S("impossible at this place.").."]"
if cannotover_rsn then
form = form.. "label[0.5,6.3;"..cannotover_rsn.."]"
end
@@ -408,9 +415,9 @@ local function show_routing_form(pname, tcbpos, message)
form = form.. "label[0.5,7;-------------------------]"
if #rp.route > 0 then
- form = form.."button[0.5,7.4; 5,1;retract;Step back one section]"
+ form = form.."button[0.5,7.4; 5,1;retract;"..S("Step back one section").."]"
end
- form = form.."button[0.5,8.4; 5,1;cancel;Cancel route programming]"
+ form = form.."button[0.5,8.4; 5,1;cancel;"..S("Cancel route programming").."]"
minetest.show_formspec(pname, "at_il_rprog_"..minetest.pos_to_string(tcbpos), form)
end
@@ -461,12 +468,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
rp.tmp_locks = rp.route[#rp.route].locks
rp.route[#rp.route] = nil
- chat(pname, "Route section "..(#rp.route+1).." removed.")
+ chat(pname, S("Route section @1 removed.", (#rp.route+1)))
end
if fields.cancel then
player_rte_prog[pname] = nil
advtrains.interlocking.clear_visu_context("prog_"..pname)
- chat(pname, "Route discarded.")
+ chat(pname, S("Route discarded."))
minetest.close_formspec(pname, formname)
return
end
@@ -487,13 +494,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local rp = player_rte_prog[pname]
if rp then
if #rp.route <= 0 then
- chat(pname, "Cannot program route without a target")
+ chat(pname, S("Cannot program route without a target"))
return
end
local tcbs = advtrains.interlocking.db.get_tcbs(rp.origin)
if not tcbs then
- chat(pname, "The origin TCB has become unknown during programming. Try again.")
+ chat(pname, S("The origin TCB has become unknown during programming. Try again."))
return
end
@@ -507,7 +514,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
advtrains.interlocking.clear_visu_context("prog_"..pname)
player_rte_prog[pname] = nil
- chat(pname, "Successfully programmed route.")
+ chat(pname, S("Successfully programmed route."))
advtrains.interlocking.show_route_edit_form(pname, rp.origin, #tcbs.routes)
return
@@ -530,7 +537,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
local meta = minetest.get_meta(pos)
local tcbpts = meta:get_string("tcb_pos")
if tcbpts == "" then
- chat(pname, "This TCB is unconfigured, you first need to assign it to a rail")
+ chat(pname, S("This TCB is unconfigured, you first need to assign it to a rail"))
return
end
local tcbpos = minetest.string_to_pos(tcbpts)
@@ -553,7 +560,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
else
local state = advtrains.getstate(pos)
rp.tmp_lcks[pts] = state
- chat(pname, pts.." is held in "..state.." position when this route is set and freed ")
+ chat(pname, S("@1 is held in @2 position when this route is set and freed ", pts, state))
end
advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
return
diff --git a/advtrains_interlocking/route_ui.lua b/advtrains_interlocking/route_ui.lua
index 3c7bd64..d1bae63 100644
--- a/advtrains_interlocking/route_ui.lua
+++ b/advtrains_interlocking/route_ui.lua
@@ -1,6 +1,9 @@
-- route_ui.lua
-- User interface for showing and editing routes
+-- Get current translator
+local S = advtrains.interlocking.translate
+
local atil = advtrains.interlocking
local ildb = atil.db
local F = advtrains.formspec
@@ -17,7 +20,7 @@ local sel_rpartcache = {}
function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
if not minetest.check_player_privs(pname, {train_operator=true, interlocking=true}) then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
@@ -26,9 +29,9 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
local route = tcbs.routes[routeid]
if not route then return end
- local form = "size[9,11]label[0.5,0.2;Route overview]"
- form = form.."field[0.8,1.2;6.5,1;name;Route name;"..minetest.formspec_escape(route.name).."]"
- form = form.."button[7.0,0.9;1.5,1;setname;Set]"
+ local form = "size[9,11]label[0.5,0.2;"..S("Route overview").."]"
+ form = form.."field[0.8,1.2;6.5,1;name;"..S("Route name")..";"..minetest.formspec_escape(route.name).."]"
+ form = form.."button[7.0,0.9;1.5,1;setname;"..S("Set").."]"
-- construct textlist for route information
local tab = {}
@@ -47,12 +50,12 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
while c_sigd and i<=#route do
c_tcbs = ildb.get_tcbs(c_sigd)
if not c_tcbs then
- itab(i, "-!- No TCBS at "..sigd_to_string(c_sigd)..". Please reconfigure route!", "err", nil)
+ itab(i, "-!- "..S("TCB at @1 is missing", sigd_to_string(c_sigd)), "err", nil)
break
end
c_ts_id = c_tcbs.ts_id
if not c_ts_id then
- itab(i, "-!- No track section adjacent to "..sigd_to_string(c_sigd)..". Please reconfigure route!", "err", nil)
+ itab(i, "-!- "..S("Track section after @1 missing", sigd_to_string(c_sigd)), "err", nil)
break
end
c_ts = ildb.get_ts(c_ts_id)
@@ -70,7 +73,7 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
local pos = advtrains.decode_pos(pts)
itab(i, "L "..pts.." -> "..state, "lock", pos)
if not advtrains.is_passive(pos) then
- itab(i, "-!- No passive component at "..pts..". Please reconfigure route!", "err", nil)
+ itab(i, "-!- "..S("Turnout/component missing at @1", minetest.pos_to_string(pos)), "err", nil)
break
end
end
@@ -79,8 +82,14 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
local nvar = c_rseg.next
if nvar then
local re_tcbs = ildb.get_tcbs({p = nvar.p, s = (nvar.s==1) and 2 or 1})
- if not re_tcbs or not re_tcbs.ts_id or re_tcbs.ts_id~=c_ts_id then
- itab(i, "-!- At "..sigd_to_string(c_sigd)..".Section Start and End do not match!", "err", nil)
+ if not re_tcbs then
+ itab(i, "-!- "..S("TCB at @1 is missing", minetest.pos_to_string(nvar.p)), "err", nil)
+ break
+ elseif not re_tcbs.ts_id then
+ itab(i, "-!- "..S("TCB at @1 is not assigned to previous track section", minetest.pos_to_string(nvar.p)), "err", nil)
+ break
+ elseif re_tcbs.ts_id~=c_ts_id then
+ itab(i, "-!- "..S("TCB at @1 has different section than previous TCB", minetest.pos_to_string(nvar.p)), "err", nil)
break
end
end
@@ -113,10 +122,10 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
-- main aspect list
local signalpos = s_tcbs and s_tcbs.signal
if signalpos and rseg then
- form = form..F.label(4.5, 2, "Signal Aspect:")
+ form = form..F.label(4.5, 2, S("Signal Aspect:"))
local ndef = signalpos and advtrains.ndb.get_ndef(signalpos)
if ndef and ndef.advtrains and ndef.advtrains.main_aspects then
- local entries = { "<Default Aspect>" }
+ local entries = { S("<Default Aspect>") }
local sel = 1
for i, mae in ipairs(ndef.advtrains.main_aspects) do
entries[i+1] = mae.description
@@ -133,21 +142,21 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
-- defaults to false for the very first signal and true for all others (= minimal user configuration overhead)
-- Note: on save, the value will be fixed at either false or true
end
- form = form..string.format("checkbox[4.5,4.0;sa_distant;Announce distant signal;%s]", assign_dst)
+ form = form..string.format("checkbox[4.5,4.0;sa_distant;"..S("Announce distant signal")..";%s]", assign_dst)
else
- form = form..F.label(4.5, 2, "No Signal at this TCB")
+ form = form..F.label(4.5, 2, S("No Signal at this TCB"))
end
elseif sel_rpart and sel_rpart.section then
local rseg = route[sel_rpart.seg]
if rseg then
- form = form..F.label(4.5, 2, "Section Options:")
+ form = form..F.label(4.5, 2, S("Section Options:"))
-- checkbox for call-on
- form = form..string.format("checkbox[4.5,4.0;se_callon;Call-on (section may be occupied);%s]", rseg.call_on)
+ form = form..string.format("checkbox[4.5,4.0;se_callon;"..S("Call-on (section may be occupied)")..";%s]", rseg.call_on)
end
elseif sel_rpart and sel_rpart.err then
- form = form.."textarea[4.5,2.5;4,4;errorta;Error:;"..tab[sel_rpartidx].."]"
+ form = form.."textarea[4.5,2.5;4,4;errorta;"..S("Error:")..";"..tab[sel_rpartidx].."]"
else
- form = form..F.label(4.5, 2, "<< Select a route part to edit options")
+ form = form..F.label(4.5, 2, S("<< Select a route part to edit options"))
end
form = form.."button[0.5,6;1,1;prev;<<<]"
@@ -158,15 +167,15 @@ function atil.show_route_edit_form(pname, sigd, routeid, sel_rpartidx)
--if route.smartroute_generated or route.default_autoworking then
-- form = form.."button[3.5,6;2,1;noautogen;Clr Autogen]"
--end
- form = form.."button[5.5,6;3,1;delete;Delete Route]"
- form = form.."button[0.5,7;3,1;back;Back to signal]"
- form = form.."button[3.5,7;2,1;clone;Clone Route]"
- form = form.."button[5.5,7;3,1;newfrom;New From Route]"
+ form = form.."button[5.5,6;3,1;delete;"..S("Delete Route").."]"
+ form = form.."button[0.5,7;3,1;back;"..S("Back to signal").."]"
+ form = form.."button[3.5,7;2,1;clone;"..S("Clone Route").."]"
+ form = form.."button[5.5,7;3,1;newfrom;"..S("New From Route").."]"
--atdebug(route.ars)
form = form.."style[ars;font=mono]"
- form = form.."textarea[0.8,8.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]"
- form = form.."button[5.5,8.23;3,1;savears;Save ARS List]"
+ form = form.."textarea[0.8,8.3;5,3;ars;"..S("ARS Rule List")..";"..atil.ars_to_text(route.ars).."]"
+ form = form.."button[5.5,8.23;3,1;savears;"..S("Save ARS List").."]"
local formname = "at_il_routeedit_"..minetest.pos_to_string(sigd.p).."_"..sigd.s.."_"..routeid
minetest.show_formspec(pname, formname, form)
diff --git a/advtrains_interlocking/routesetting.lua b/advtrains_interlocking/routesetting.lua
index 9901d23..353b521 100644
--- a/advtrains_interlocking/routesetting.lua
+++ b/advtrains_interlocking/routesetting.lua
@@ -1,5 +1,8 @@
-- Setting and clearing routes
+-- Get current translator
+local S = advtrains.interlocking.translate
+
-- TODO duplicate
local lntrans = { "A", "B" }
local function sigd_to_string(sigd)
@@ -52,7 +55,7 @@ function ilrs.set_route(signal, route, try)
c_tcbs = ildb.get_tcbs(c_sigd)
if not c_tcbs then
if not try then atwarn("Did not find TCBS",c_sigd,"while setting route",rtename,"of",signal) end
- return false, "No TCB found at "..sigd_to_string(c_sigd)..". Please update or reconfigure route!"
+ return false, S("No TCB found at @1. Please update or reconfigure route!", sigd_to_string(c_sigd))
end
if i == 1 then
nodst = c_tcbs.nodst
@@ -60,7 +63,7 @@ function ilrs.set_route(signal, route, try)
c_ts_id = c_tcbs.ts_id
if not c_ts_id then
if not try then atwarn("Encountered End-Of-Interlocking while setting route",rtename,"of",signal) end
- return false, "No track section adjacent to "..sigd_to_string(c_sigd)..". Please reconfigure route!"
+ return false, S("No track section adjacent to @1. Please reconfigure route!", sigd_to_string(c_sigd))
end
c_ts = ildb.get_ts(c_ts_id)
c_rseg = route[i]
@@ -68,17 +71,18 @@ function ilrs.set_route(signal, route, try)
if not c_ts then
if not try then atwarn("Encountered ts missing during a real run of routesetting routine, at ts=",c_ts_id,"while setting route",rtename,"of",signal) end
- return false, "Section '"..(c_ts_id).."' not found!", c_ts_id, nil
+ return false, S("Section '@1' not found!", c_ts_id), c_ts_id, nil
elseif c_ts.route then
if not try then atwarn("Encountered ts lock during a real run of routesetting routine, at ts=",c_ts_id,"while setting route",rtename,"of",signal) end
- return false, "Section '"..(c_ts.name or c_ts_id).."' already has route set from "..sigd_to_string(c_ts.route.origin)..":\n"..c_ts.route.rsn, c_ts_id, nil
+ return false, S("Section '@1' already has route set from @2:", (c_ts.name or c_ts_id), sigd_to_string(c_ts.route.origin))
+ .."\n"..c_ts.route.rsn, c_ts_id, nil
end
if c_ts.trains and #c_ts.trains>0 then
if c_rseg.call_on then
--atdebug("Routesetting: Call-on situation in", c_ts_id)
else
if not try then atwarn("Encountered ts occupied during a real run of routesetting routine, at ts=",c_ts_id,"while setting route",rtename,"of",signal) end
- return false, "Section '"..(c_ts.name or c_ts_id).."' is occupied!", c_ts_id, nil
+ return false, S("Section '@1' is occupied!", (c_ts.name or c_ts_id)), c_ts_id, nil
end
end
@@ -113,18 +117,18 @@ function ilrs.set_route(signal, route, try)
local confl = ilrs.has_route_lock(lp)
if confl then
if not try then atwarn("Encountered route lock while a real run of routesetting routine, at position",pos,"while setting route",rtename,"of",signal) end
- return false, "Lock conflict at "..minetest.pos_to_string(pos)..", Held locked by:\n"..confl, nil, lp
+ return false, S("Lock conflict at @1, Held locked by:", minetest.pos_to_string(pos)).."\n"..confl, nil, lp
elseif not try then
advtrains.setstate(pos, state)
end
end
if not try then
- ilrs.add_route_lock(lp, c_ts_id, "Route '"..rtename.."' from signal '"..signalname.."'", signal)
+ ilrs.add_route_lock(lp, c_ts_id, S("Route @1 from signal @2", rtename, signalname), signal)
c_lckp[#c_lckp+1] = lp
end
else
if not try then atwarn("Encountered route lock misconfiguration (no passive component) while a real run of routesetting routine, at position",pts,"while setting route",rtename,"of",signal) end
- return false, "No passive component at "..minetest.pos_to_string(pos)..". Please update track section or reconfigure route!"
+ return false, S("Turnout/component missing at @1. Please update track section or reconfigure route!", minetest.pos_to_string(pos))
end
end
-- sanity check, is section at next the same as the current?
@@ -134,7 +138,7 @@ function ilrs.set_route(signal, route, try)
if (not re_tcbs or not re_tcbs.ts_id or re_tcbs.ts_id~=c_ts_id)
and route[i+1] then --FIX 2025-01-08: in old worlds the final TCB may be wrong (it didn't matter back then), don't error out here (route still shown invalid in UI)
if not try then atwarn("Encountered inconsistent ts (front~=back) while a real run of routesetting routine, at position",pts,"while setting route",rtename,"of",signal) end
- return false, "TCB at "..minetest.pos_to_string(nvar.p).." has different section than previous TCB. Please update track section or reconfigure route!"
+ return false, S("TCB at @1 has different section than previous TCB. Please update track section or reconfigure route!", minetest.pos_to_string(nvar.p))
end
end
-- reserve ts and write locks
@@ -146,7 +150,7 @@ function ilrs.set_route(signal, route, try)
c_ts.route = {
origin = signal,
entry = c_sigd,
- rsn = "Route '"..rtename.."' from signal '"..signalname.."', segment #"..i,
+ rsn = S("Route @1 from signal @2, segment #@3", rtename, signalname, i),
first = first,
}
c_ts.route_post = {
diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua
index f624f7a..e7c2248 100644
--- a/advtrains_interlocking/signal_api.lua
+++ b/advtrains_interlocking/signal_api.lua
@@ -460,7 +460,7 @@ function signal.after_dig(pos, oldnode, oldmetadata, player)
local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
if sigd then
advtrains.interlocking.db.unassign_signal_for_tcbs(sigd)
- minetest.chat_send_player(player:get_player_name(), "Signal has been unassigned. Name and routes are kept for reuse.")
+ --minetest.chat_send_player(player:get_player_name(), "Signal has been unassigned. Name and routes are kept for reuse.")
end
-- clear influence point
local ipts,iconnid = advtrains.interlocking.db.get_ip_by_signalpos(pos)
diff --git a/advtrains_interlocking/signal_aspect_ui.lua b/advtrains_interlocking/signal_aspect_ui.lua
index 49e7d8b..6ba1f7a 100644
--- a/advtrains_interlocking/signal_aspect_ui.lua
+++ b/advtrains_interlocking/signal_aspect_ui.lua
@@ -1,5 +1,8 @@
local F = advtrains.formspec
+-- Get current translator
+local S = advtrains.interlocking.translate
+
function advtrains.interlocking.show_signal_form(pos, node, pname, aux_key)
local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
if sigd and not aux_key then
@@ -38,14 +41,14 @@ function advtrains.interlocking.make_ip_formspec_component(pos, x, y, w)
local ipos = minetest.string_to_pos(pts)
ipmarker(ipos, connid)
return table.concat {
- F.S_label(x, y, "Influence point is set at @1.", string.format("%s/%s", pts, connid)),
- F.S_button_exit(x, y+0.5, w/2-0.125, "ip_set", "Modify"),
- F.S_button_exit(x+w/2+0.125, y+0.5, w/2-0.125, "ip_clear", "Clear"),
+ F.label(x, y, S("Influence point is set at @1.", string.format("%s/%s", pts, connid))),
+ F.button_exit(x, y+0.5, w/2-0.125, "ip_set", S("Modify")),
+ F.button_exit(x+w/2+0.125, y+0.5, w/2-0.125, "ip_clear", S("Clear")),
}
else
return table.concat {
- F.S_label(x, y, "Influence point is not set."),
- F.S_button_exit(x, y+0.5, w, "ip_set", "Set influence point"),
+ F.label(x, y, S("Influence point is not set.")),
+ F.button_exit(x, y+0.5, w, "ip_set", S("Set influence point")),
}
end
end
@@ -83,10 +86,10 @@ function advtrains.interlocking.show_ip_sa_form(pos, pname)
-- Create Signal aspect formspec elements
local ndef = advtrains.ndb.get_ndef(pos)
if ndef and ndef.advtrains then
- form[#form+1] = F.label(0.5, 2, "Signal Aspect:")
+ form[#form+1] = F.label(0.5, 2, S("Signal Aspect:"))
-- main aspect list
if ndef.advtrains.main_aspects then
- local entries = { "<none>" }
+ local entries = { S("<none>") }
local sel = 1
for i, mae in ipairs(ndef.advtrains.main_aspects) do
entries[i+1] = mae.description
@@ -98,9 +101,9 @@ function advtrains.interlocking.show_ip_sa_form(pos, pname)
end
-- distant signal assign (is shown either when main_aspect is not none, or when pure distant signal)
if rpos then
- form[#form+1] = F.button_exit(0.5, 3.5, 4, "sa_undistant", "Dst: " .. minetest.pos_to_string(rpos))
+ form[#form+1] = F.button_exit(0.5, 3.5, 4, "sa_undistant", S("Dst: @1", minetest.pos_to_string(rpos)) )
elseif (ma and not ma.halt) or not ndef.advtrains.main_aspects then
- form[#form+1] = F.button_exit(0.5, 3.5, 4, "sa_distant", "<assign distant>")
+ form[#form+1] = F.button_exit(0.5, 3.5, 4, "sa_distant", S("<assign distant>"))
end
end
@@ -165,12 +168,12 @@ end)
-- inits the signal IP assignment process
function advtrains.interlocking.init_ip_assign(pos, pname)
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
--remove old IP
--advtrains.interlocking.db.clear_ip_by_signalpos(pos)
- minetest.chat_send_player(pname, "Configuring Signal: Please look in train's driving direction and punch rail to set influence point.")
+ minetest.chat_send_player(pname, S("Configuring Signal: Please look in train's driving direction and punch rail to set influence point."))
players_assign_ip[pname] = pos
end
@@ -178,10 +181,10 @@ end
-- inits the distant signal assignment process
function advtrains.interlocking.init_distant_assign(pos, pname)
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
- minetest.chat_send_player(pname, "Set distant signal: Punch the main signal to assign!")
+ minetest.chat_send_player(pname, S("Set distant signal: Punch the main signal to assign!"))
players_assign_distant[pname] = pos
end
@@ -203,7 +206,7 @@ local function try_auto_assign_to_tcb(signalpos, pos, connid, pname)
advtrains.interlocking.db.assign_signal_to_tcbs(signalpos, sigd)
-- use auto-naming
advtrains.interlocking.add_autoname_to_tcbs(tcb[aconnid], pname)
- minetest.chat_send_player(pname, "Assigned signal to the TCB at "..core.pos_to_string(apos))
+ minetest.chat_send_player(pname, S("Assigned signal to the TCB at @1", core.pos_to_string(apos)) )
advtrains.interlocking.show_tcb_marker(apos)
advtrains.interlocking.show_signalling_form(sigd, pname)
end
@@ -215,7 +218,7 @@ local function try_auto_assign_to_tcb(signalpos, pos, connid, pname)
local mainsig = advtrains.interlocking.db.get_ip_signal(pts, aconnid)
if mainsig and advtrains.interlocking.signal.get_signal_cap_level(mainsig) >= 3 then
advtrains.interlocking.signal.set_aspect(signalpos, "_default", mainsig)
- minetest.chat_send_player(pname, "Assigned distant signal to the main signal at "..core.pos_to_string(mainsig))
+ minetest.chat_send_player(pname, S("Assigned distant signal to the main signal at @1", core.pos_to_string(mainsig)) )
return
end
end
@@ -245,7 +248,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
if not advtrains.interlocking.db.get_ip_signal_asp(pts, plconnid) then
advtrains.interlocking.db.set_ip_signal(pts, plconnid, signalpos)
ipmarker(pos, plconnid)
- minetest.chat_send_player(pname, "Configuring Signal: Successfully set influence point")
+ minetest.chat_send_player(pname, S("Configuring Signal: Successfully set influence point"))
-- Try to find a TCB ahead and auto assign this signal there
local pc = player:get_player_control()
local no_auto_assign = pc.aux1
@@ -253,13 +256,13 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
try_auto_assign_to_tcb(signalpos, pos, plconnid, pname)
end
else
- minetest.chat_send_player(pname, "Configuring Signal: Influence point of another signal is already present!")
+ minetest.chat_send_player(pname, S("Configuring Signal: Influence point of another signal is already present!"))
end
else
- minetest.chat_send_player(pname, "Configuring Signal: This is not a normal two-connection rail! Aborted.")
+ minetest.chat_send_player(pname, S("Configuring Signal: This is not a normal two-connection rail! Aborted."))
end
else
- minetest.chat_send_player(pname, "Configuring Signal: Node is too far away. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring Signal: Node is too far away. Aborted."))
end
players_assign_ip[pname] = nil
end
diff --git a/advtrains_interlocking/smartroute.lua b/advtrains_interlocking/smartroute.lua
index 76c7814..2b9138c 100644
--- a/advtrains_interlocking/smartroute.lua
+++ b/advtrains_interlocking/smartroute.lua
@@ -1,6 +1,9 @@
-- smartroute.lua
-- Implementation of the advtrains auto-route search
+-- Get current translator
+local S = advtrains.interlocking.translate
+
local atil = advtrains.interlocking
local ildb = atil.db
local sr = {}
@@ -143,10 +146,10 @@ local players_smartroute_actions = {}
function sr.propose_next(pname, sigd, find_more_than, searching_shunt)
local tcbs = ildb.get_tcbs(sigd)
if not tcbs or not tcbs.routes then
- minetest.chat_send_player(pname, "Smartroute: TCBS or routes don't exist here!")
+ minetest.chat_send_player(pname, S("Smartroute: TCBS or routes don't exist here!"))
return
elseif not tcbs.ts_id then
- minetest.chat_send_player(pname, "Smartroute: No track section directly ahead!")
+ minetest.chat_send_player(pname, S("Smartroute: No track section directly ahead!"))
return
end
-- Step 1: search for routes using the current settings
@@ -158,7 +161,7 @@ function sr.propose_next(pname, sigd, find_more_than, searching_shunt)
found_routes = found_routes
}
-- step 3: build form
- local form = "size[8,5]label[0,0;Route search: "..#found_routes.." found]"
+ local form = "size[8,5]label[0,0;"..S("Route search: @1 found", #found_routes).."]"
local tab = {}
for idx, froute in ipairs(found_routes) do
local secfl = table.copy(froute.secseq)
@@ -172,8 +175,8 @@ function sr.propose_next(pname, sigd, find_more_than, searching_shunt)
tab[idx] = minetest.formspec_escape(froute.name..viatext)
end
form=form.."textlist[0.5,1;7,3;rtelist;"..table.concat(tab, ",").."]"
- form=form.."button[0.5,4;2,1;continue;Search further]"
- form=form.."button[2.5,4;2,1;apply;Apply]"
+ form=form.."button[0.5,4;2,1;continue;"..S("Search further").."]"
+ form=form.."button[2.5,4;2,1;apply;"..S("Apply").."]"
minetest.show_formspec(pname, "at_il_smartroute_propose", form)
end
diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua
index 0be943a..0111f5e 100755
--- a/advtrains_interlocking/tcb_ts_ui.lua
+++ b/advtrains_interlocking/tcb_ts_ui.lua
@@ -1,5 +1,8 @@
-- Track Circuit Breaks and Track Sections - Player interaction
+-- Get current translator
+local S = advtrains.interlocking.translate
+
local players_assign_tcb = {}
local players_assign_signal = {}
local players_assign_xlink = {}
@@ -30,7 +33,7 @@ minetest.register_node("advtrains_interlocking:tcb_node", {
},
mesh = "at_il_tcb_node.obj",
tiles = {"at_il_tcb_node.png"},
- description="Track Circuit Break",
+ description=S("Track Circuit Break"),
sunlight_propagates=true,
groups = {
cracky=3,
@@ -40,12 +43,12 @@ minetest.register_node("advtrains_interlocking:tcb_node", {
},
after_place_node = function(pos, node, player)
local meta = minetest.get_meta(pos)
- meta:set_string("infotext", "Unconfigured Track Circuit Break, right-click to assign.")
+ meta:set_string("infotext", S("Unconfigured Track Circuit Break, right-click to assign."))
end,
on_rightclick = function(pos, node, player)
local pname = player:get_player_name()
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
@@ -57,11 +60,11 @@ minetest.register_node("advtrains_interlocking:tcb_node", {
if tcb then
advtrains.interlocking.show_tcb_form(tcbpos, pname)
else
- minetest.chat_send_player(pname, "This TCB has been removed. Please dig marker.")
+ minetest.chat_send_player(pname, S("This TCB has been removed. Please dig marker."))
end
else
--unconfigured
- minetest.chat_send_player(pname, "Configuring TCB: Please punch the rail you want to assign this TCB to.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Please punch the rail you want to assign this TCB to."))
players_assign_tcb[pname] = pos
end
@@ -85,7 +88,7 @@ minetest.register_node("advtrains_interlocking:tcb_node", {
local tcbpts = meta:get_string("tcb_pos")
if tcbpts ~= "" then
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
local tcbpos = minetest.string_to_pos(tcbpts)
@@ -93,7 +96,7 @@ minetest.register_node("advtrains_interlocking:tcb_node", {
if not tcb then return true end
for connid=1,2 do
if tcb[connid].signal then
- minetest.chat_send_player(pname, "Can't remove TCB: Both sides must have no signal assigned!")
+ minetest.chat_send_player(pname, S("Can't remove TCB: Both sides must have no signal assigned!"))
return false
end
end
@@ -162,21 +165,21 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
if node_ok and #conns == 2 then
-- if there is already a tcb here, reassign it
if ildb.get_tcb(pos) then
- minetest.chat_send_player(pname, "Configuring TCB: Already existed at this position, it is now linked to this TCB marker")
+ minetest.chat_send_player(pname, S("Configuring TCB: Already existed at this position, it is now linked to this TCB marker"))
else
ildb.create_tcb_at(pos, pname)
end
local meta = minetest.get_meta(tcbnpos)
meta:set_string("tcb_pos", minetest.pos_to_string(pos))
- meta:set_string("infotext", "TCB assigned to "..minetest.pos_to_string(pos))
- minetest.chat_send_player(pname, "Configuring TCB: Successfully configured TCB")
+ meta:set_string("infotext", S("TCB assigned to @1", minetest.pos_to_string(pos)))
+ minetest.chat_send_player(pname, S("Configuring TCB: Successfully configured TCB"))
advtrains.interlocking.show_tcb_marker(pos)
else
- minetest.chat_send_player(pname, "Configuring TCB: This is not a normal two-connection rail! Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: This is not a normal two-connection rail! Aborted."))
end
else
- minetest.chat_send_player(pname, "Configuring TCB: Node is too far away. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Node is too far away. Aborted."))
end
players_assign_tcb[pname] = nil
end
@@ -194,19 +197,19 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
ildb.assign_signal_to_tcbs(pos, sigd)
-- use auto-naming
advtrains.interlocking.add_autoname_to_tcbs(tcbs, pname)
- minetest.chat_send_player(pname, "Configuring TCB: Successfully assigned signal.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Successfully assigned signal."))
advtrains.interlocking.show_ip_form(pos, pname, true)
else
- minetest.chat_send_player(pname, "Configuring TCB: Internal error, TCBS doesn't exist. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Internal error, TCBS doesn't exist. Aborted."))
end
else
- minetest.chat_send_player(pname, "Configuring TCB: Cannot use static signals for routesetting. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Cannot use static signals for routesetting. Aborted."))
end
else
- minetest.chat_send_player(pname, "Configuring TCB: Not a compatible signal. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Not a compatible signal. Aborted."))
end
else
- minetest.chat_send_player(pname, "Configuring TCB: Node is too far away. Aborted.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Node is too far away. Aborted."))
end
players_assign_signal[pname] = nil
end
@@ -219,14 +222,14 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
local state = advtrains.getstate(pos)
local ts = ildb.get_ts(ts_id)
if ts and ts.fixed_locks then
- minetest.chat_send_player(pname, minetest.pos_to_string(pos).." locks in state "..state)
+ minetest.chat_send_player(pname, S("@1 locks in state @2", minetest.pos_to_string(pos), state))
ts.fixed_locks[pts] = state
else
- minetest.chat_send_player(pname, "Error: TS modified, abort!")
+ minetest.chat_send_player(pname, S("Error: TS modified, abort!"))
players_assign_fixedlocks[pname] = nil
end
else
- minetest.chat_send_player(pname, "Setting fixed locks finished!")
+ minetest.chat_send_player(pname, S("Setting fixed locks finished!"))
players_assign_fixedlocks[pname] = nil
ildb.update_rs_cache(ts_id)
advtrains.interlocking.show_ts_form(ts_id, pname)
@@ -247,12 +250,12 @@ function advtrains.interlocking.self_tcb_make_after_place_callback(fail_silently
local pname = player:get_player_name()
if not minetest.check_player_privs(pname, "interlocking") then
if not fail_silently_on_noprivs then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
end
return
end
if ildb.get_tcb(pos) then
- minetest.chat_send_player(pname, "TCB already existed at this position, now linked to this node")
+ minetest.chat_send_player(pname, S("TCB already existed at this position, now linked to this node"))
else
ildb.create_tcb_at(pos, pname)
end
@@ -261,7 +264,7 @@ function advtrains.interlocking.self_tcb_make_after_place_callback(fail_silently
local tcbs = ildb.get_tcbs(sigd)
-- make sure signal doesn't already exist
if tcbs.signal then
- minetest.chat_send_player(pname, "Signal on B side already assigned!")
+ minetest.chat_send_player(pname, S("Signal on B side already assigned!"))
return
end
ildb.assign_signal_to_tcbs(pos, sigd)
@@ -281,7 +284,7 @@ function advtrains.interlocking.self_tcb_make_can_dig_callback(is_signal)
local pname = player and player:get_player_name() or ""
-- need to duplicate logic of the regular "can_dig_or_modify_track()" function in core/tracks.lua
if advtrains.get_train_at_pos(pos) then
- minetest.chat_send_player(pname, "Can't remove track, a train is here!")
+ minetest.chat_send_player(pname, S("Can't remove track, a train is here!"))
return false
end
-- end of standard checks
@@ -335,7 +338,7 @@ function advtrains.interlocking.self_tcb_make_on_rightclick_callback(fail_silent
local pname = player:get_player_name()
if not minetest.check_player_privs(pname, "interlocking") then
if not fail_silently_on_noprivs then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
end
return
end
@@ -383,30 +386,30 @@ local function mktcbformspec(pos, side, tcbs, offset, pname)
ts = ildb.get_ts(tcbs.ts_id)
end
if ts then
- form = form.."label[0.5,"..offset..";Side "..btnpref..": "..minetest.formspec_escape(ts.name or tcbs.ts_id).."]"
- form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_gotots;Show track section]"
+ form = form.."label[0.5,"..offset..";"..S("Side @1", btnpref)..": "..minetest.formspec_escape(ts.name or tcbs.ts_id).."]"
+ form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_gotots;"..S("Show track section").."]"
else
tcbs.ts_id = nil
- form = form.."label[0.5,"..offset..";Side "..btnpref..": ".."End of interlocking]"
- form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_makeil;Create Interlocked Track Section]"
+ form = form.."label[0.5,"..offset..";Side "..btnpref..": "..S("End of interlocking").."]"
+ form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_makeil;"..S("Create Interlocked Track Section").."]"
end
-- xlink
if tcbs.xlink then
- form = form.."label[0.5,"..(offset+1.5)..";Link:"..ildb.sigd_to_string(tcbs.xlink).."]"
+ form = form.."label[0.5,"..(offset+1.5)..";"..S("Link: @1", ildb.sigd_to_string(tcbs.xlink)).."]"
form = form.."button[4.5,"..(offset+1.5)..";1,1;"..btnpref.."_xlinkdel;X]"
else
if players_assign_xlink[pname] then
- form = form.."button[0.5,"..(offset+1.5)..";4,1;"..btnpref.."_xlinklink;Link "..ildb.sigd_to_string(players_assign_xlink[pname]).."]"
+ form = form.."button[0.5,"..(offset+1.5)..";4,1;"..btnpref.."_xlinklink;"..S("Link @1", ildb.sigd_to_string(players_assign_xlink[pname])).."]"
form = form.."button[4.5,"..(offset+1.5)..";1,1;"..btnpref.."_xlinkabrt;X]"
else
- form = form.."label[0.5,"..(offset+1.5)..";No Link]"
+ form = form.."label[0.5,"..(offset+1.5)..";"..S("No Link").."]"
form = form.."button[4.5,"..(offset+1.5)..";1,1;"..btnpref.."_xlinkadd;+]"
end
end
if tcbs.signal then
- form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_sigdia;Signalling]"
+ form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_sigdia;"..S("Signalling").."]"
else
- form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_asnsig;Assign a signal]"
+ form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_asnsig;"..S("Assign a signal").."]"
end
return form
end
@@ -414,13 +417,13 @@ end
function advtrains.interlocking.show_tcb_form(pos, pname)
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
local tcb = ildb.get_tcb(pos)
if not tcb then return end
- local form = "size[6,9] label[0.5,0.5;Track Circuit Break Configuration]"
+ local form = "size[6,9] label[0.5,0.5;"..S("Track Circuit Break Configuration").."]"
form = form .. mktcbformspec(pos, 1, tcb[1], 1, pname)
form = form .. mktcbformspec(pos, 2, tcb[2], 5, pname)
@@ -487,14 +490,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
else
if f_xlinkadd[connid] then
players_assign_xlink[pname] = {p=pos, s=connid}
- minetest.chat_send_player(pname, "TCB Link: Select linked TCB now!")
+ minetest.chat_send_player(pname, S("TCB Link: Select linked TCB now!"))
minetest.close_formspec(pname, formname)
return -- to not reopen form
end
end
end
if f_asnsig[connid] and not tcbs.signal then
- minetest.chat_send_player(pname, "Configuring TCB: Please punch the signal to assign.")
+ minetest.chat_send_player(pname, S("Configuring TCB: Please punch the signal to assign."))
players_assign_signal[pname] = {p=pos, s=connid}
minetest.close_formspec(pname, formname)
return
@@ -516,15 +519,15 @@ end)
function advtrains.interlocking.show_ts_form(ts_id, pname)
if not minetest.check_player_privs(pname, "interlocking") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
local ts = ildb.get_ts(ts_id)
if not ts_id then return end
- local form = "size[10.5,10]label[0.5,0.5;Track Section Detail - "..ts_id.."]"
- form = form.."field[0.8,2;5.2,1;name;Section name;"..minetest.formspec_escape(ts.name or "").."]"
- form = form.."button[5.5,1.7;1,1;setname;Set]"
+ local form = "size[10.5,10]label[0.5,0.5;"..S("Track Section Detail - @1", ts_id).."]"
+ form = form.."field[0.8,2;5.2,1;name;"..S("Section name")..";"..minetest.formspec_escape(ts.name or "").."]"
+ form = form.."button[5.5,1.7;1,1;setname;"..S("Set").."]"
local hint
local strtab = {}
@@ -533,7 +536,7 @@ function advtrains.interlocking.show_ts_form(ts_id, pname)
advtrains.interlocking.show_tcb_marker(sigd.p)
end
- form = form.."label[0.5,2.5;Boundary TCBs:]"
+ form = form.."label[0.5,2.5;"..S("Boundary TCBs:").."]"
form = form.."textlist[0.5,3;4,3;tcblist;"..table.concat(strtab, ",").."]"
-- additional route locks (e.g. for level crossings)
@@ -545,36 +548,36 @@ function advtrains.interlocking.show_ts_form(ts_id, pname)
minetest.pos_to_string(advtrains.decode_pos(pts)).." = "..state)
end
end
- form = form.."label[5.5,2.5;Fixed route locks (e.g. level crossings):]"
+ form = form.."label[5.5,2.5;"..S("Fixed route locks (e.g. level crossings):").."]"
form = form.."textlist[5.5,3;4,3;fixedlocks;"..table.concat(strtab, ",").."]"
if ildb.may_modify_ts(ts) then
- form = form.."button[5.5,6;2,1;flk_add;Add locks]"
- form = form.."button[7.5,6;2,1;flk_clear;Clear locks]"
+ form = form.."button[5.5,6;2,1;flk_add;"..S("Add locks").."]"
+ form = form.."button[7.5,6;2,1;flk_clear;"..S("Clear locks").."]"
- form = form.."button[5.5,8;4,1;remove;Remove Section]"
- form = form.."tooltip[remove;This will remove the track section and set all its end points to End Of Interlocking]"
+ form = form.."button[5.5,8;4,1;remove;"..S("Remove Section").."]"
+ form = form.."tooltip[remove;"..S("This will remove the track section and set all its end points to End Of Interlocking").."]"
else
hint=3
end
if ts.route then
- form = form.."label[0.5,6.1;Route is set: "..ts.route.rsn.."]"
+ form = form.."label[0.5,6.1;"..S("Route is set: ")..ts.route.rsn.."]"
elseif ts.route_post then
- form = form.."label[0.5,6.1;Section holds "..#(ts.route_post.lcks or {}).." route locks.]"
+ form = form.."label[0.5,6.1;"..S("Section holds @1 route locks.", #(ts.route_post.lcks or {})).."]"
end
-- occupying trains
if ts.trains and #ts.trains>0 then
- form = form.."label[0.5,7.1;Trains on this section:]"
+ form = form.."label[0.5,7.1;"..S("Trains on this section:").."]"
form = form.."textlist[0.5,7.7;3,2;trnlist;"..table.concat(ts.trains, ",").."]"
else
- form = form.."label[0.5,7.1;No trains on this section.]"
+ form = form.."label[0.5,7.1;"..S("No trains on this section.").."]"
end
- form = form.."button[5.5,7;4,1;reset;Reset section state]"
+ form = form.."button[5.5,7;4,1;reset;"..S("Reset section state").."]"
if hint == 3 then
- form = form.."label[0.5,0.75;You cannot modify track sections when a route is set or a train is on the section.]"
+ form = form.."label[0.5,0.75;"..S("You cannot modify track sections when a route is set or a train is on the section.").."]"
--form = form.."label[0.5,1;Trying to unlink a TCB directly connected to this track will not work.]"
end
@@ -615,7 +618,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
ts.fixed_locks = {}
end
players_assign_fixedlocks[pname] = ts_id
- minetest.chat_send_player(pname, "Punch components to add fixed locks. (punch anything else = end)")
+ minetest.chat_send_player(pname, S("Punch components to add fixed locks. (punch anything else = end)"))
minetest.close_formspec(pname, formname)
return
elseif fields.flk_clear then
@@ -625,10 +628,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.reset then
-- User requested resetting the section
-- Show him what this means...
- local form = "size[7,5]label[0.5,0.5;Reset track section]"
- form = form.."label[0.5,1;This will clear the list of trains\nand the routesetting status of this section.\nAre you sure?]"
- form = form.."button_exit[0.5,2.5; 5,1;reset;Yes]"
- form = form.."button_exit[0.5,3.5; 5,1;cancel;Cancel]"
+ local form = "size[7,5]label[0.5,0.5;"..S("Reset track section").."]"
+ form = form.."label[0.5,1;"..S("This will clear the list of trains\nand the routesetting status of this section.\nAre you sure?").."]"
+ form = form.."button_exit[0.5,2.5; 5,1;reset;"..S("Yes").."]"
+ form = form.."button_exit[0.5,3.5; 5,1;cancel;"..S("Cancel").."]"
minetest.show_formspec(pname, "at_il_tsreset_"..ts_id, form)
return
end
@@ -651,7 +654,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local tcbs = ildb.get_tcbs(sigd)
advtrains.interlocking.signal.update_route_aspect(tcbs)
end
- minetest.chat_send_player(pname, "Reset track section "..ts_id.."!")
+ minetest.chat_send_player(pname, S("Reset track section @1!", ts_id))
end
end)
@@ -764,11 +767,11 @@ function advtrains.interlocking.check_route_valid(route, sigd)
while c_sigd and i<=#route do
c_tcbs = ildb.get_tcbs(c_sigd)
if not c_tcbs then
- return false, "No TCBS at "..sigd_to_string(c_sigd)
+ return false, S("TCB at @1 is missing", sigd_to_string(c_sigd))
end
c_ts_id = c_tcbs.ts_id
if not c_ts_id then
- return false, "No track section adjacent to "..sigd_to_string(c_sigd)
+ return false, S("Track section after @1 missing", sigd_to_string(c_sigd))
end
c_ts = ildb.get_ts(c_ts_id)
@@ -778,7 +781,7 @@ function advtrains.interlocking.check_route_valid(route, sigd)
for pts, state in pairs(c_rseg.locks) do
local pos = advtrains.decode_pos(pts)
if not advtrains.is_passive(pos) then
- return false, "No passive component for lock at "..pts
+ return false, S("Turnout/component missing at @1", minetest.pos_to_string(pos))
end
end
end
@@ -786,8 +789,12 @@ function advtrains.interlocking.check_route_valid(route, sigd)
local nvar = c_rseg.next
if nvar then
local re_tcbs = ildb.get_tcbs({p = nvar.p, s = (nvar.s==1) and 2 or 1})
- if not re_tcbs or not re_tcbs.ts_id or re_tcbs.ts_id~=c_ts_id then
- return false, "TCB at "..minetest.pos_to_string(nvar.p).." has different section than previous TCB."
+ if not re_tcbs then
+ return false, S("TCB at @1 is missing", minetest.pos_to_string(nvar.p))
+ elseif not re_tcbs.ts_id then
+ return false, S("TCB at @1 is not assigned to previous track section", minetest.pos_to_string(nvar.p))
+ elseif re_tcbs.ts_id~=c_ts_id then
+ return false, S("TCB at @1 has different section than previous TCB", minetest.pos_to_string(nvar.p))
end
end
-- advance
@@ -796,11 +803,11 @@ function advtrains.interlocking.check_route_valid(route, sigd)
end
-- check end TCB
if not c_sigd then
- return false, "Final TCBS unset (legacy-style buffer route)"
+ return false, S("Final TCBS unset (legacy-style buffer route)")
end
c_tcbs = ildb.get_tcbs(c_sigd)
if not c_tcbs then
- return false, "Final TCBS missing at "..sigd_to_string(c_sigd)
+ return false, S("TCB at @1 is missing", sigd_to_string(c_sigd))
end
return true, nil, c_sigd
end
@@ -814,7 +821,7 @@ local p_open_sig_form = {}
function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, called_from_form_update)
if not minetest.check_player_privs(pname, "train_operator") then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
local hasprivs = minetest.check_player_privs(pname, "interlocking")
@@ -823,9 +830,9 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
if not tcbs.signal then return end
if not tcbs.routes then tcbs.routes = {} end
- local form = "size[7,10.25]label[0.5,0.5;Signal at "..minetest.pos_to_string(sigd.p).."]"
- form = form.."field[0.8,1.5;5.2,1;name;Signal name;"..minetest.formspec_escape(tcbs.signal_name or "").."]"
- form = form.."button[5.5,1.2;1,1;setname;Set]"
+ local form = "size[7,10.25]label[0.5,0.5;"..S("Signal at @1", minetest.pos_to_string(sigd.p)).."]"
+ form = form.."field[0.8,1.5;5.2,1;name;"..S("Signal name")..";"..minetest.formspec_escape(tcbs.signal_name or "").."]"
+ form = form.."button[5.5,1.2;1,1;setname;"..S("Set").."]"
if tcbs.routeset then
if type(tcbs.routeset)=="table" then
@@ -839,7 +846,7 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
end
rtenames[midx] = rte.name
end
- form = form.."label[0.5,2.5;Multiple routes are requested (first available is set):]"
+ form = form.."label[0.5,2.5;"..S("Multiple routes are requested (first available is set):").."]"
form = form.."label[0.5,3.0;"..minetest.formspec_escape(table.concat(rtenames,", ")).."]"
else
local rte = tcbs.routes[tcbs.routeset]
@@ -848,26 +855,26 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
tcbs.routeset = nil
return
end
- form = form.."label[0.5,2.5;A route is requested from this signal:]"
+ form = form.."label[0.5,2.5;"..S("A route is requested from this signal:").."]"
form = form.."label[0.5,3.0;"..minetest.formspec_escape(rte.name).."]"
end
if tcbs.route_committed then
- form = form.."label[0.5,3.5;Route has been set.]"
+ form = form.."label[0.5,3.5;"..S("Route has been set.").."]"
else
- form = form.."label[0.5,3.5;Waiting for route to be set...]"
+ form = form.."label[0.5,3.5;"..S("Waiting for route to be set...").."]"
if tcbs.route_rsn then
form = form.."label[0.5,4;"..minetest.formspec_escape(tcbs.route_rsn).."]"
end
end
if not tcbs.route_auto then
- form = form.."button[0.5,7; 5,1;auto;Enable Automatic Working]"
+ form = form.."button[0.5,7; 5,1;auto;"..S("Enable Automatic Working").."]"
else
- form = form.."label[0.5,7 ;Automatic Working is active.]"
- form = form.."label[0.5,7.3;Route is re-set when a train passed.]"
- form = form.."button[0.5,7.7; 5,1;noauto;Disable Automatic Working]"
+ form = form.."label[0.5,7 ;"..S("Automatic Working is active.").."]"
+ form = form.."label[0.5,7.3;"..S("Route is re-set when a train passed.").."]"
+ form = form.."button[0.5,7.7; 5,1;noauto;"..S("Disable Automatic Working").."]"
end
- form = form.."button[0.5,6; 5,1;cancelroute;Cancel Route]"
+ form = form.."button[0.5,6; 5,1;cancelroute;"..S("Cancel Route").."]"
else
if not tcbs.route_origin then
if #tcbs.routes > 0 then
@@ -879,7 +886,7 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
local clr = ""
if not valid then
clr = "#FF5555"
- rname = rname.." (invalid)"
+ rname = rname..S(" (invalid)")
elseif route.ars then
clr = "#FFFF55"
if route.ars.default then
@@ -888,35 +895,35 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
end
strtab[#strtab+1] = clr .. minetest.formspec_escape(rname)
end
- form = form.."label[0.5,2.5;Routes:]"
+ form = form.."label[0.5,2.5;"..S("Routes:").."]"
form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",")
if sel_rte then
form = form .. ";" .. sel_rte .."]"
- form = form.."button[0.5,6; 5,1;setroute;Set Route]"
- form = form.."button[0.5,7;2,1;dsproute;Show]"
+ form = form.."button[0.5,6; 5,1;setroute;"..S("Set Route").."]"
+ form = form.."button[0.5,7;2,1;dsproute;"..S("Show").."]"
if hasprivs then
- form = form.."button[5.5,3.3;1,0.3;setarsdefault;D]tooltip[setarsdefault;Set ARS default route]"
- form = form.."button[3.5,7;2,1;editroute;Edit]"
+ form = form.."button[5.5,3.3;1,0.3;setarsdefault;D]tooltip[setarsdefault;"..S("Set ARS default route").."]"
+ form = form.."button[3.5,7;2,1;editroute;"..S("Edit").."]"
if sel_rte > 1 then
form = form .. "button[5.5,4;1,0.3;moveup;↑]"
end
if sel_rte < #strtab then
form = form .. "button[5.5,4.7;1,0.3;movedown;↓]"
end
- form = form.."button[5.5,5.4;1,0.3;delroute;X]tooltip[delroute;Delete this route]"
+ form = form.."button[5.5,5.4;1,0.3;delroute;X]tooltip[delroute;"..S("Delete this route").."]"
end
else
form = form .. "]"
if tcbs.ars_disabled then
- form = form.."label[0.5,6 ;NOTE: ARS is disabled.]"
- form = form.."label[0.5,6.5;Routes are not automatically set.]"
+ form = form.."label[0.5,6 ;"..S("NOTE: ARS is disabled.").."]"
+ form = form.."label[0.5,6.5;"..S("Routes are not automatically set.").."]"
end
end
if hasprivs then
- form = form.."button[0.5,8;2.5,1;smartroute;Smart Route]"
- form = form.."button[ 3,8;2.5,1;newroute;New (Manual)]"
- form = form..string.format("checkbox[0.5,8.75;ars;Automatic routesetting;%s]", not tcbs.ars_disabled)
- form = form..string.format("checkbox[0.5,9.25;dstarstrig;Distant signal triggers ARS;%s]", not tcbs.no_dst_ars_trig)
+ form = form.."button[0.5,8;2.5,1;smartroute;"..S("Smart Route").."]"
+ form = form.."button[ 3,8;2.5,1;newroute;"..S("New (Manual)").."]"
+ form = form..string.format("checkbox[0.5,8.75;ars;"..S("Automatic routesetting")..";%s]", not tcbs.ars_disabled)
+ form = form..string.format("checkbox[0.5,9.25;dstarstrig;"..S("Distant signal triggers ARS")..";%s]", not tcbs.no_dst_ars_trig)
end
else
-- no route is active, and no route is so far defined
@@ -924,29 +931,27 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
local caps = advtrains.interlocking.signal.get_signal_cap_level(tcbs.signal)
if caps >= 4 then
-- offer user the "block signal mode"
- form = form.."label[0.5,2.5;No routes are yet defined.]"
+ form = form.."label[0.5,2.5;"..S("No routes are yet defined.").."]"
if hasprivs then
- form = form.."button[0.5,4;2.5,1;smartroute;Smart Route]"
- form = form.."button[ 3,4;2.5,1;newroute;New (Manual)]"
+ form = form.."button[0.5,4;2.5,1;smartroute;"..S("Smart Route").."]"
+ form = form.."button[ 3,4;2.5,1;newroute;"..S("New (Manual)").."]"
end
elseif caps >= 3 then
-- it's a buffer!
- form = form.."label[0.5,2.5;This is an always-halt signal (e.g. a buffer)\n"
- .."No routes can be set from here.]"
+ form = form.."label[0.5,2.5;"..S("This is an always-halt signal (e.g. a buffer)\nNo routes can be set from here.").."]"
else
-- signal caps say it cannot be route start/end
- form = form.."label[0.5,2.5;This is a pure distant signal\n"
- .."No route is currently set through.]"
+ form = form.."label[0.5,2.5;"..S("This is a pure distant signal\nNo route is currently set through.").."]"
end
end
elseif sigd_equal(tcbs.route_origin, sigd) then
-- something has gone wrong: tcbs.routeset should have been set...
- form = form.."label[0.5,2.5;Inconsistent state: route_origin is same TCBS but no route set. Try again.]"
+ form = form.."label[0.5,2.5;".."Inconsistent state: route_origin is same TCBS but no route set. Try again.".."]"
ilrs.cancel_route_from(sigd)
else
- form = form.."label[0.5,2.5;Route is set over this signal by:\n"..sigd_to_string(tcbs.route_origin).."]"
- form = form.."label[0.5,4;Wait for this route to be cancelled in order to do anything here.]"
+ form = form.."label[0.5,2.5;"..S("Route is set over this signal by:").."\n"..sigd_to_string(tcbs.route_origin).."]"
+ form = form.."label[0.5,4;"..S("Wait for this route to be cancelled in order to do anything here.").."]"
end
end
sig_pselidx[pname] = sel_rte
@@ -1024,11 +1029,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
advtrains.interlocking.init_route_prog(pname, sigd)
minetest.close_formspec(pname, formname)
tcbs.ars_ignore_next = nil
+ p_open_sig_form[pname] = nil -- form is closed/left, do not reopen
return
end
if fields.smartroute and hasprivs then
advtrains.interlocking.smartroute.start(pname, sigd)
tcbs.ars_ignore_next = nil
+ p_open_sig_form[pname] = nil -- form is closed/left, do not reopen
return
end
if sel_rte and tcbs.routes[sel_rte] then
@@ -1042,6 +1049,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
if fields.editroute and hasprivs then
advtrains.interlocking.show_route_edit_form(pname, sigd, sel_rte)
+ p_open_sig_form[pname] = nil -- form is closed/left, do not reopen
return
end
if fields.setarsdefault and hasprivs then
@@ -1067,7 +1075,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
if fields.delroute and hasprivs then
if tcbs.routes[sel_rte] and tcbs.routes[sel_rte].ars then
- minetest.chat_send_player(pname, "Cannot delete route which has ARS rules, please review and then delete through edit dialog!")
+ minetest.chat_send_player(pname, S("Cannot delete route which has ARS rules, please review and then delete through edit dialog!"))
else
table.remove(tcbs.routes,sel_rte)
end
diff --git a/advtrains_interlocking/tool.lua b/advtrains_interlocking/tool.lua
index 5ceae04..d7a42b4 100644
--- a/advtrains_interlocking/tool.lua
+++ b/advtrains_interlocking/tool.lua
@@ -1,21 +1,24 @@
-- tool.lua
-- Interlocking tool
+-- Get current translator
+local S = advtrains.interlocking.translate
+
local ilrs = advtrains.interlocking.route
local function node_right_click(pos, pname, player)
if advtrains.is_passive(pos) then
- local form = "size[7,5]label[0.5,0.5;Route lock inspector]"
+ local form = "size[7,5]label[0.5,0.5;"..S("Route lock inspector").."]"
local pts = advtrains.encode_pos(pos)
local rtl = ilrs.has_route_lock(pts)
if rtl then
- form = form.."label[0.5,1;Route locks currently put:\n"..rtl.."]"
- form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]"
+ form = form.."label[0.5,1;"..S("Route locks currently put:").."\n"..rtl.."]"
+ form = form.."button_exit[0.5,3.5; 5,1;clear;"..S("Clear").."]"
else
- form = form.."label[0.5,1;No route locks set]"
- form = form.."button_exit[0.5,3.5; 5,1;emplace;Emplace manual lock]"
+ form = form.."label[0.5,1;"..S("No route locks set").."]"
+ form = form.."button_exit[0.5,3.5; 5,1;emplace;"..S("Emplace manual lock").."]"
end
minetest.show_formspec(pname, "at_il_rtool_"..pts, form)
@@ -25,7 +28,7 @@ local function node_right_click(pos, pname, player)
-- If not a turnout, check the track section and show a form
local node_ok, conns, rail_y=advtrains.get_rail_info_at(pos)
if not node_ok then
- minetest.chat_send_player(pname, "Node is not a track!")
+ minetest.chat_send_player(pname, S("Node is not a track!"))
return
end
if advtrains.interlocking.db.get_tcb(pos) then
@@ -37,14 +40,14 @@ local function node_right_click(pos, pname, player)
if ts_id then
advtrains.interlocking.show_ts_form(ts_id, pname)
else
- minetest.chat_send_player(pname, "No track section at this location!")
+ minetest.chat_send_player(pname, S("No track section at this location!"))
end
end
local function node_left_click(pos, pname, player)
local node_ok, conns, rail_y=advtrains.get_rail_info_at(pos)
if not node_ok then
- minetest.chat_send_player(pname, "Node is not a track!")
+ minetest.chat_send_player(pname, S("Node is not a track!"))
return
end
@@ -62,13 +65,13 @@ local function node_left_click(pos, pname, player)
advtrains.interlocking.db.update_rs_cache(ts_id)
advtrains.interlocking.highlight_track_section(pos)
else
- minetest.chat_send_player(pname, "No track section at this location!")
+ minetest.chat_send_player(pname, S("No track section at this location!"))
end
end
minetest.register_craftitem("advtrains_interlocking:tool",{
- description = "Interlocking tool\nPunch: Highlight track section\nPlace: check route locks/show track section info",
+ description = S("Interlocking tool\nPunch: Highlight track section\nPlace: check route locks/show track section info"),
groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
inventory_image = "at_il_tool.png",
wield_image = "at_il_tool.png",
@@ -79,7 +82,7 @@ minetest.register_craftitem("advtrains_interlocking:tool",{
return
end
if not minetest.check_player_privs(pname, {interlocking=true}) then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
if pointed_thing.type=="node" then
@@ -93,7 +96,7 @@ minetest.register_craftitem("advtrains_interlocking:tool",{
return
end
if not minetest.check_player_privs(pname, {interlocking=true}) then
- minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ minetest.chat_send_player(pname, S("Insufficient privileges to use this!"))
return
end
if pointed_thing.type=="node" then
@@ -129,4 +132,4 @@ minetest.register_craft({
output = "advtrains_interlocking:tool",
type = "shapeless",
recipe = {"dye:green","advtrains:trackworker", "advtrains_interlocking:tcb_node"}
-}) \ No newline at end of file
+})
diff --git a/advtrains_interlocking/tsr_rail.lua b/advtrains_interlocking/tsr_rail.lua
index c1e3c1c..5a808fc 100644
--- a/advtrains_interlocking/tsr_rail.lua
+++ b/advtrains_interlocking/tsr_rail.lua
@@ -3,7 +3,8 @@
-- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything.
-- This code resembles the code in lines/stoprail.lua
-local S = attrans
+-- Get current translator
+local S = advtrains.interlocking.translate
local function updateform(pos)
local meta = minetest.get_meta(pos)
diff --git a/advtrains_line_automation/init.lua b/advtrains_line_automation/init.lua
index e7d0ea6..4c5cbf4 100644
--- a/advtrains_line_automation/init.lua
+++ b/advtrains_line_automation/init.lua
@@ -18,6 +18,14 @@ advtrains.lines = {
local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELIM
+-- Initialize internationalization (using ywang's poconvert)
+advtrains.poconvert.from_flat("advtrains_line_automation")
+-- ask engine for translator instance, this will load the translation files
+advtrains.lines.translate = core.get_translator("advtrains_line_automation")
+
+-- Get current translator
+local S = advtrains.lines.translate
+
dofile(modpath.."railwaytime.lua")
dofile(modpath.."scheduler.lua")
diff --git a/advtrains_line_automation/locale/advtrains_line_automation.de.tr b/advtrains_line_automation/locale/advtrains_line_automation.de.tr
new file mode 100644
index 0000000..e020dca
--- /dev/null
+++ b/advtrains_line_automation/locale/advtrains_line_automation.de.tr
@@ -0,0 +1,22 @@
+# textdomain: advtrains_line_automation
+Closed=Geschlossen
+Dep. Speed=Zielgeschwindigkeit bei Abfahrt
+Door Delay=Zeit für die Türschließung
+Door Side=Türseite
+Kick out passengers=Fahrgäste zum Ausstieg zwingen
+Left=Links
+Next Stop:@n=Nächste Haltestelle:@n
+Reverse train=Zug Umkehren
+Right=Rechts
+Save=Speichern
+Station Code=Kennzeichen der Haltestelle
+Station Name=Name der Haltestelle
+Station code "@1" already exists and is owned by @2.=Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird von @2 verwaltet.
+Station/Stop Track=Gleis zur Kennzeichnung einer Haltestelle
+Stop Time=Wartezeit
+This station is owned by @1. You are not allowed to edit its name.=Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen.
+Track=Gleis
+Trains stopping here (ARS rules)=Züge, die hier halten (ARS-Regeln)
+Unknown Station=Unbekannte Station
+Wait for signal to clear=Warte bis Signal Fahrt zeigt
+You are not allowed to configure this track.=Sie dürfen dieses Gleis nicht konfigurieren. \ No newline at end of file
diff --git a/advtrains_line_automation/locale/advtrains_line_automation.fr.tr b/advtrains_line_automation/locale/advtrains_line_automation.fr.tr
new file mode 100644
index 0000000..2db6333
--- /dev/null
+++ b/advtrains_line_automation/locale/advtrains_line_automation.fr.tr
@@ -0,0 +1,22 @@
+# textdomain: advtrains_line_automation
+Closed=Fermé
+Dep. Speed=Vit. de départ
+Door Delay=Durée d'ouverture des portes
+Door Side=Ouv. des portes coté
+Kick out passengers=Éjecter les passagers
+Left=Gauche
+Next Stop:@n=Prochain arrêt :@n
+Reverse train=Inversion du sens de marche
+Right=Droit
+Save=Sauvegarder
+Station Code=Code de Station
+Station Name=Nom de Station
+Station code "@1" already exists and is owned by @2.=Le code de station "@1" existe et est possédé par @2.
+Station/Stop Track=Voie d'arrêt en station
+Stop Time=Durée d'arrêt
+This station is owned by @1. You are not allowed to edit its name.=Cette station est la propriété de @1. Vous n'êtes pas autorisé à modifier son nom.
+Track=Voie
+Trains stopping here (ARS rules)=Trains marquant l'arrêt (règles ARS)
+Unknown Station=Gare inconnue
+Wait for signal to clear=En attente de signal d'autorisation
+You are not allowed to configure this track.=Vous n'êtes pas autorisé à configurer cette voie. \ No newline at end of file
diff --git a/advtrains_line_automation/locale/advtrains_line_automation.zh_CN.tr b/advtrains_line_automation/locale/advtrains_line_automation.zh_CN.tr
new file mode 100644
index 0000000..252515c
--- /dev/null
+++ b/advtrains_line_automation/locale/advtrains_line_automation.zh_CN.tr
@@ -0,0 +1,22 @@
+# textdomain: advtrains_line_automation
+Closed=
+Dep. Speed=出发速度
+Door Delay=车门关闭时间
+Door Side=
+Kick out passengers=踢出乘客
+Left=
+Next Stop:@n=
+Reverse train=改变行车方向
+Right=
+Save=保存
+Station Code=车站代码
+Station Name=车站名称
+Station code "@1" already exists and is owned by @2.=
+Station/Stop Track=车站轨道
+Stop Time=停站时间
+This station is owned by @1. You are not allowed to edit its name.=
+Track=轨道
+Trains stopping here (ARS rules)=
+Unknown Station=
+Wait for signal to clear=
+You are not allowed to configure this track.=您不能调整这段轨道。 \ No newline at end of file
diff --git a/advtrains_line_automation/locale/advtrains_line_automation.zh_TW.tr b/advtrains_line_automation/locale/advtrains_line_automation.zh_TW.tr
new file mode 100644
index 0000000..2d580dc
--- /dev/null
+++ b/advtrains_line_automation/locale/advtrains_line_automation.zh_TW.tr
@@ -0,0 +1,22 @@
+# textdomain: advtrains_line_automation
+Closed=
+Dep. Speed=出發速度
+Door Delay=車門關閉時間
+Door Side=
+Kick out passengers=踢出乘客
+Left=
+Next Stop:@n=
+Reverse train=改變行車方向
+Right=
+Save=儲存
+Station Code=車站碼
+Station Name=車站名稱
+Station code "@1" already exists and is owned by @2.=
+Station/Stop Track=車站軌道
+Stop Time=停站時間
+This station is owned by @1. You are not allowed to edit its name.=
+Track=軌道
+Trains stopping here (ARS rules)=
+Unknown Station=
+Wait for signal to clear=
+You are not allowed to configure this track.=您不能調整這段軌道。 \ No newline at end of file
diff --git a/advtrains_line_automation/po/README.md b/advtrains_line_automation/po/README.md
new file mode 100644
index 0000000..3e94682
--- /dev/null
+++ b/advtrains_line_automation/po/README.md
@@ -0,0 +1,70 @@
+# Translations
+Please read this document before working on any translations.
+
+Unlike many other mods, Advtrains uses `.po` files for localization,
+which are then automatically converted to `.tr` files when the mod is
+loaded. Therefore, please submit patches that edit the `.po` files.
+
+## Getting Started
+The translation files can be edited like any other `.po` file.
+
+If the translation file for your language does not exist, create it by
+copying `template.txt` to `advtrains.XX.tr`, where `XX` is replaced by
+the language code.
+
+Feel free to use the [discussion mailing list][srht-discuss] if you
+have any questions regarding localization.
+
+You can share your `.po` file directly or [as a patch][gsm] to the [dev
+mailing list][srht-devel]. The latter is encouraged, but, unlike code
+changes, translation files sent directly are also accepted.
+
+[tr-format]: https://minetest.gitlab.io/minetest/translations/#translation-file-format
+[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss
+[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel
+[gsm]: https://git-send-email.io
+
+## Translation Notes
+* Translations should be consistent. You can use other entries or the
+translations in Minetest as a reference.
+* Translations do not have to fully correspond to the original text -
+they only need to provide the same information. In particular,
+translations do not need to have the same linguistical structure as the
+original text.
+* Replacement sequences (`@1`, `@2`, etc) should not be translated.
+* Certain abbreviations or names, such as "Ks" or "Zs 3", should
+generally not be translated.
+
+### (de) German
+* Verwenden Sie die neue Rechtschreibung und die Sie-Form.
+* Mit der deutschen Tastaturbelegung unter Linux können die
+Anführungszeichen „“ mit AltGr-V bzw. AltGr-B eingegeben werden.
+
+### (zh) Chinese
+(This section is written in English to avoid writing the note twice or
+using only one of the variants, as most of this section applies to both
+the traditional and simplified variants.)
+
+* Please use the 「」 quotation marks for Traditional Chinese and “”
+for Simplified Chinese.
+* Please use the fullwidth variants of: , 、 。 ? ! : ;
+* Please use the halfwidth variants of: ( ) [ ] / \ |
+* Please do not leave any space between Han characters (including
+fullwidth punctuation marks).
+* Please leave a space between Han characters (excluding fullwidth
+punctuation marks) and characters from other scripts (including
+halfwidth punctuation marks). However, do not leave any space between
+Han characters and Arabic numerals.
+
+## Notes for developers
+* The `update-translations.sh` script can be used to update the
+translation files. However, please make sure to install the
+`basic_trains` mod before running the script.
+* Please make sure that the first argument to `S` (or `attrans`) _only_
+includes string literals without formatting or concatenation. This is
+unfortunately a limitation of the `xgettext` utility.
+* Avoid word-by-word translations.
+* Avoid manipulating translated strings (except for concatenation). Use
+server-side translations if you have to modify the text sent to users.
+* Avoid truncating strings unless multibyte characters are handled
+properly.
diff --git a/advtrains_line_automation/po/advtrains_line_automation.pot b/advtrains_line_automation/po/advtrains_line_automation.pot
new file mode 100644
index 0000000..b7405b6
--- /dev/null
+++ b/advtrains_line_automation/po/advtrains_line_automation.pot
@@ -0,0 +1,102 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the advtrains_line_automation package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains_line_automation\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:01+0200\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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr ""
+
+#: stoprail.lua
+msgid "Station Code"
+msgstr ""
+
+#: stoprail.lua
+msgid "Station Name"
+msgstr ""
+
+#: stoprail.lua
+msgid "Door Delay"
+msgstr ""
+
+#: stoprail.lua
+msgid "Dep. Speed"
+msgstr ""
+
+#: stoprail.lua
+msgid "Track"
+msgstr ""
+
+#: stoprail.lua
+msgid "Stop Time"
+msgstr ""
+
+#: stoprail.lua
+msgid "Door Side"
+msgstr ""
+
+#: stoprail.lua
+msgid "Closed"
+msgstr ""
+
+#: stoprail.lua
+msgid "Left"
+msgstr ""
+
+#: stoprail.lua
+msgid "Right"
+msgstr ""
+
+#: stoprail.lua
+msgid "Reverse train"
+msgstr ""
+
+#: stoprail.lua
+msgid "Kick out passengers"
+msgstr ""
+
+#: stoprail.lua
+msgid "Wait for signal to clear"
+msgstr ""
+
+#: stoprail.lua
+msgid "Trains stopping here (ARS rules)"
+msgstr ""
+
+#: stoprail.lua
+msgid "Save"
+msgstr ""
+
+#: stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
+msgstr ""
+
+#: stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
+msgstr ""
+
+#: stoprail.lua
+msgid "Unknown Station"
+msgstr ""
+
+#: stoprail.lua
+msgid "Next Stop:\n"
+msgstr ""
+
+#: stoprail.lua
+msgid "Station/Stop Track"
+msgstr ""
diff --git a/advtrains_line_automation/po/de.po b/advtrains_line_automation/po/de.po
new file mode 100644
index 0000000..b83156c
--- /dev/null
+++ b/advtrains_line_automation/po/de.po
@@ -0,0 +1,610 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:01+0200\n"
+"PO-Revision-Date: 2025-06-11 23:02+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: stoprail.lua
+msgid "Closed"
+msgstr "Geschlossen"
+
+#: stoprail.lua
+msgid "Dep. Speed"
+msgstr "Zielgeschwindigkeit bei Abfahrt"
+
+#: stoprail.lua
+msgid "Door Delay"
+msgstr "Zeit für die Türschließung"
+
+#: stoprail.lua
+msgid "Door Side"
+msgstr "Türseite"
+
+#: stoprail.lua
+msgid "Kick out passengers"
+msgstr "Fahrgäste zum Ausstieg zwingen"
+
+#: stoprail.lua
+msgid "Left"
+msgstr "Links"
+
+#: stoprail.lua
+msgid "Next Stop:\n"
+msgstr "Nächste Haltestelle:\n"
+
+#: stoprail.lua
+msgid "Reverse train"
+msgstr "Zug Umkehren"
+
+#: stoprail.lua
+msgid "Right"
+msgstr "Rechts"
+
+#: stoprail.lua
+msgid "Save"
+msgstr "Speichern"
+
+#: stoprail.lua
+msgid "Station Code"
+msgstr "Kennzeichen der Haltestelle"
+
+#: stoprail.lua
+msgid "Station Name"
+msgstr "Name der Haltestelle"
+
+#: 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."
+
+#: stoprail.lua
+msgid "Station/Stop Track"
+msgstr "Gleis zur Kennzeichnung einer Haltestelle"
+
+#: stoprail.lua
+msgid "Stop Time"
+msgstr "Wartezeit"
+
+#: 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."
+
+#: stoprail.lua
+msgid "Track"
+msgstr "Gleis"
+
+#: stoprail.lua
+msgid "Trains stopping here (ARS rules)"
+msgstr "Züge, die hier halten (ARS-Regeln)"
+
+#: stoprail.lua
+msgid "Unknown Station"
+msgstr "Unbekannte Station"
+
+#: stoprail.lua
+msgid "Wait for signal to clear"
+msgstr "Warte bis Signal Fahrt zeigt"
+
+#: stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Türen geschlossen)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Dreiwegweiche"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Kreuzung mit einem achsenparallelen Gleis"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Keine Kupplung vorhanden>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Hoher @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Hoher @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Niedriger @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Niedriger @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1 Steigung"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
+#~ "Ausstieg gezwungen."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden "
+#~ "nicht zum Ausstieg gezwungen."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht "
+#~ "umgekehrt werden."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Zugbeeinflussungsgleis"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Kanal: @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Befehl: @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Zugang zu @1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Andreaskreuz"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Große Industrielle Lokomotive"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Güterwaggon"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Schraubenkupplung"
+
+#~ msgid "Bumper"
+#~ msgstr "Prellbock"
+
+#~ 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)."
+
+#~ msgid ""
+#~ "Can place and configure LuaATC components, including execute potentially "
+#~ "harmful Lua code"
+#~ msgstr ""
+#~ "Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
+#~ "Programme ausführen)"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind "
+#~ "geschlossen."
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es "
+#~ "werden insgesamt @1 benötigt."
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht "
+#~ "definiert."
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: es gibt keinen unterstützenden Block am "
+#~ "Ende der Steigung."
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt."
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
+
+#~ msgid "Command"
+#~ msgstr "Befehl"
+
+#~ msgid "Command (on)"
+#~ msgstr "Befehl (wenn aktiviert)"
+
+#~ msgid "Default Seat"
+#~ msgstr "Standardsitzplatz"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Standardsitzplatz (Führerstand)"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "ausrangiertes Gleis, nicht verwenden."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Detaillierte Dampflokomotive"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Detektorgleis"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Diagonale Gleiskreuzung"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline-Kanal"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Die Türen sind geschlossen."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Führerstand Links"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Führerstand Rechts"
+
+#~ msgid "Driver stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Führerstand"
+
+#~ msgid "Get off"
+#~ msgstr "Aussteigen"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Ausstieg zwingen"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Industrielle Lokomotive"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Tankwaggon"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Holztransportwaggon"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Japanische Personenzug-Lokomotive"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Mechanisches Signal"
+
+#~ msgid "Line"
+#~ msgstr "Linie"
+
+#~ msgid "Loading Track"
+#~ msgstr "Beladungsgleis"
+
+#~ msgid "Lock couples"
+#~ msgstr "Kupplungen sperren"
+
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
+
+#~ msgid "No such lua entity."
+#~ msgstr ""
+#~ "Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
+#~ "kann."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "Passagierwaggon"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "PC-Benennungswerkzeug\n"
+#~ "\n"
+#~ "Rechtsklick zur Benennung der passiven Komponente."
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Geschwindigkeitskontrollgleis"
+
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Geschwindigkeitskontrolle: @1"
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Ein Zug steht an dieser Position."
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Waggon-Einstellungen speichern"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenbergkupplung"
+
+#~ msgid "Select seat:"
+#~ msgstr "Wählen Sie einen Sitzplatz aus:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Inventar Zeigen"
+
+#~ msgid "Signal"
+#~ msgstr "Lichtsignal"
+
+#~ msgid "Speed:"
+#~ msgstr "Geschw.:"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Dampflokomotive"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "U-Bahn-Waggon"
+
+#~ msgid "Target:"
+#~ msgstr "Zielges.:"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Innere Anzeige"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Äußere Anzeige"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr ""
+#~ "Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug "
+#~ "nicht kopiert werden."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Das Clipboard ist leer."
+
+#, 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."
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Das Inventar dieses Waggons ist nicht leer."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Hier ist ein Signal-Beeinflussungspunkt."
+
+#~ msgid "There's a Track Circuit Break here."
+#~ msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "Der Waggon ist voll."
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
+
+#~ msgid "This position is protected!"
+#~ msgstr "Diese Position ist geschützt!"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Dieses Gleis kann nicht geändert werden."
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "Dieses Gleis kann nicht entfernt werden."
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Dieses Gleis kann nicht gedreht werden."
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Der Waggon ist voll."
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Gleiswerkzeug\n"
+#~ "\n"
+#~ "Linksklick: Gleistyp ändern\n"
+#~ "Rechtsklick: Objekt drehen"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid "Train copied."
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Werkzeug zur Erstellung von Zugkopien\n"
+#~ "\n"
+#~ "Linksklick: Zug ins Clipboard kopieren\n"
+#~ "Right-click: Kopierten Zug einfügen"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Abladungsgleis"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen "
+#~ "einzusteigen."
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "An der linken Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "An der rechten Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "An der Decke montiertes Signal"
+
+#~ msgid ""
+#~ "Warning: If you destroy this wagon, you only get some steel back! If you "
+#~ "are sure, hold Sneak and left-click the wagon."
+#~ msgstr ""
+#~ "Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
+#~ "Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
+
+#~ msgid "Y-turnout"
+#~ msgstr "Y-Weiche"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Sie haben keinen Zugang zum Führerstand."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ 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."
+
+#~ 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."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Sie können nicht in diesen Waggon einsteigen."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln."
diff --git a/advtrains_line_automation/po/fr.po b/advtrains_line_automation/po/fr.po
new file mode 100644
index 0000000..1322e89
--- /dev/null
+++ b/advtrains_line_automation/po/fr.po
@@ -0,0 +1,896 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:01+0200\n"
+"PO-Revision-Date: 2025-03-25 15:06+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"
+
+#: stoprail.lua
+msgid "Closed"
+msgstr "Fermé"
+
+#: stoprail.lua
+msgid "Dep. Speed"
+msgstr "Vit. de départ"
+
+#: stoprail.lua
+msgid "Door Delay"
+msgstr "Durée d'ouverture des portes"
+
+#: stoprail.lua
+msgid "Door Side"
+msgstr "Ouv. des portes coté"
+
+#: stoprail.lua
+msgid "Kick out passengers"
+msgstr "Éjecter les passagers"
+
+#: stoprail.lua
+msgid "Left"
+msgstr "Gauche"
+
+#: stoprail.lua
+msgid "Next Stop:\n"
+msgstr "Prochain arrêt :\n"
+
+#: stoprail.lua
+msgid "Reverse train"
+msgstr "Inversion du sens de marche"
+
+#: stoprail.lua
+msgid "Right"
+msgstr "Droit"
+
+#: stoprail.lua
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: stoprail.lua
+msgid "Station Code"
+msgstr "Code de Station"
+
+#: stoprail.lua
+msgid "Station Name"
+msgstr "Nom de Station"
+
+#: 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."
+
+#: stoprail.lua
+msgid "Station/Stop Track"
+msgstr "Voie d'arrêt en station"
+
+#: stoprail.lua
+msgid "Stop Time"
+msgstr "Durée d'arrêt"
+
+#: 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."
+
+#: stoprail.lua
+msgid "Track"
+msgstr "Voie"
+
+#: stoprail.lua
+msgid "Trains stopping here (ARS rules)"
+msgstr "Trains marquant l'arrêt (règles ARS)"
+
+#: stoprail.lua
+msgid "Unknown Station"
+msgstr "Gare inconnue"
+
+#: stoprail.lua
+msgid "Wait for signal to clear"
+msgstr "En attente de signal d'autorisation"
+
+#: stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
+#~ msgid " does not exist or is invalid"
+#~ msgstr " n'existe pas ou est invalide"
+
+#~ msgid " is at "
+#~ msgstr " est à la position "
+
+#~ msgid " units"
+#~ msgstr " Unités"
+
+#~ msgid " wagon:destroy(): data is not set!"
+#~ msgstr " Appel de wagon:destroy() : données non définies !"
+
+#~ msgid "!!! Train off track !!!"
+#~ msgstr "!!! Train hors voie !!!"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Portes closes)"
+
+#~ msgid "(log"
+#~ msgstr "(log"
+
+#~ msgid ", using placeholder"
+#~ msgstr ", dans un espace réservé"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Embranchement triple"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculo-diagonal"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Pas de coupleur>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Quai @1 (haut, 45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Quai @1 (haut)"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Quai @1 (bas)"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Quai @1 (bas, 45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "Pente @1"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "Avertissement commande ATC Éjecter : portes closes."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "Avertissement commande ATC Éjecter : train en mouvement."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Attention : Commande ATC de renversement impossible car le train se "
+#~ "déplace."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr ""
+#~ "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Controlleur ATC"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Canal : @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Commande : @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Accès à @1"
+
+#~ msgid "Advtrains Status: no_action"
+#~ msgstr "État d'advtrains : aucune action"
+
+#~ msgid "Advtrains is already running normally!"
+#~ msgstr "Advtrains fonctionne déjà correctement !"
+
+#~ msgid "Allow these players to access your wagon:"
+#~ msgstr "Autoriser ces joueurs à embarquer :"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Croix de Saint André"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "La fin du train serait hors voie : annulation."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Grosse locomotive industrielle"
+
+#~ msgid "Boiler"
+#~ msgstr "Chaudière à vapeur"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Wagon de frêt"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Attelage à tampon et vis"
+
+#~ msgid "Bumper"
+#~ msgstr "Heurtoir"
+
+#~ 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)."
+
+#~ 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"
+
+#~ 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"
+
+#~ msgid "Can place and dig tracks in unprotected areas"
+#~ msgstr ""
+#~ "Possibilité de poser ou retirer des voies dans les zones non protégées"
+
+#~ 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"
+
+#~ msgid "Can place, remove and operate trains"
+#~ msgstr "Possibilité de poser, retirer ou opérer les trains"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !"
+
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
+
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1"
+
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Placement impossible : pas de nœud d'appui à l'extrémité supérieure."
+
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Placement impossible : ne pointe pas un nœud"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Placement impossible : emplacement protégé"
+
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Placement impossible : espace occupé !"
+
+#~ msgid "Caution"
+#~ msgstr "Attention"
+
+#~ msgid "Chimney"
+#~ msgstr "Cheminée"
+
+#~ msgid "Clear 'Disable ARS' flag"
+#~ msgstr "Effacer le drapeau \"Désactiver l'ARS\""
+
+#~ msgid "Clear (proceed)"
+#~ msgstr "Autorisation (procédez)"
+
+#~ msgid "Clear Local Environment"
+#~ msgstr "Effacer l'environnement LuaATC"
+
+#~ msgid "Code"
+#~ msgstr "Code"
+
+#~ msgid "Command"
+#~ msgstr "Commande"
+
+#~ msgid "Command (on)"
+#~ msgstr "Commande (marche)"
+
+#~ 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 !"
+
+#~ msgid "Current FC: "
+#~ msgstr "Code de fret courant: "
+
+#~ msgid "Danger (halt)"
+#~ msgstr "Danger (stop)"
+
+#~ 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 !"
+
+#~ msgid "Default Seat"
+#~ msgstr "Siège par défaut"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Siège par défaut (poste de pilotage)"
+
+# Routage est il le bon terme ?
+#~ msgid "Delete all train routes, force them to recalculate"
+#~ msgstr "Suppression et recalcul de tous les routages"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "Voie déconseillée"
+
+#~ msgid ""
+#~ "Destroying wagon with inventory, but inventory is not found? Shouldn't "
+#~ "happen!"
+#~ msgstr "Desctruction d'un wagon avec inventaire introuvable ? Anomalie !"
+
+#~ 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é."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Locomotive à vapeur complexe"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Voie détectrice"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Croisement diagonal"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Canal Digiline"
+
+#~ msgid "Disable the advtrains globalstep temporarily"
+#~ msgstr "Désactive temporairement le pas global d'advtrains"
+
+#~ msgid "Disabled advtrains successfully"
+#~ msgstr "Succès de la désactivation d'advtrains"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
+
+#~ 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 "Driver Stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Poste de pilotage (gauche)"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Poste de pilotage (droit)"
+
+#~ msgid "Driver stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Cabine de pilotage"
+
+#~ msgid "Freight Code:"
+#~ msgstr "Code de frêt :"
+
+#~ msgid "Get off"
+#~ msgstr "Débarquer"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Débarquer (de force)"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Locomotive industrielle"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Wagon-citerne industriel"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Wagon grumier industriel"
+
+#~ msgid "Instructed to save() but load() was never called!"
+#~ msgstr "Appel de save() requis sans appel préalable de load() !"
+
+#~ msgid "Insufficient privileges to use this!"
+#~ msgstr "Privilèges insuffisants pour utiliser ceci !"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Motrice Japonaise"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Passage inter-voiture de train Japonais"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Japanese signal pole"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Sémaphore"
+
+#~ msgid "Left,Right,Closed;"
+#~ msgstr "Gauche,Droit,Fermé;"
+
+#~ msgid "Line"
+#~ msgstr "Ligne"
+
+#~ msgid "Liquid: "
+#~ msgstr "Liquide : "
+
+#~ msgid "Liquid: empty"
+#~ msgstr "Liquide : vide"
+
+#~ msgid "Loading Track"
+#~ msgstr "Voie de Chargement"
+
+#~ msgid "Lock couples"
+#~ msgstr "Verrouiller l'accouplement"
+
+#~ msgid "LuaATC Environment"
+#~ msgstr "Environnement LuaATC"
+
+#~ msgid "LuaATC Mesecon Controller"
+#~ msgstr "Commande Mesecon de LuaATC"
+
+#~ msgid "LuaATC Operation Panel"
+#~ msgstr "Panneau de commande de LuaATC"
+
+#~ msgid "LuaATC component assigned to an invalid environment"
+#~ msgstr "Composant LuaATC assigné à un environnement invalide"
+
+#~ msgid "LuaATC component assigned to environment '@1'"
+#~ msgstr "Composant LuaATC assigné à l'environnement '@1'"
+
+#~ msgid "LuaATC component with error: @1"
+#~ msgstr "Erreur @1 du composant LuaATC"
+
+#~ msgid "Missing train_operator privilege"
+#~ msgstr "Privilège \"train_operator\" manquant"
+
+#~ msgid "Munich U-Bahn Distant Signal ("
+#~ msgstr "Signal distant métro de Munich ("
+
+#~ msgid "Munich U-Bahn Main Signal ("
+#~ msgstr "Signal principal métro de Munich ("
+
+#~ msgid "Next FC:"
+#~ msgstr "Code de fret suivant :"
+
+#~ msgid "No callback to handle schedule"
+#~ msgstr "Absence de fonction de gestion de planning"
+
+#~ msgid "No such lua entity."
+#~ msgstr "Pas de telle entité lua."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Pas de tel train : @1."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Pas de tel wagon : @1."
+
+#~ msgid "Not a valid wagon id."
+#~ msgstr "Identificateur de wagon invalide."
+
+#~ msgid "Not allowed to do this."
+#~ msgstr "Vous n'êtes pas autorisé effectuer ceci."
+
+#~ msgid ""
+#~ "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#~ msgstr ""
+#~ "Franchissement de signal rouge : examinez la situation et inversez le "
+#~ "sens de marche du train."
+
+#~ msgid "Onboard Computer"
+#~ msgstr "Ordinateur embarqué"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Voiture passager"
+
+#~ msgid "Passenger area"
+#~ msgstr "Voiture Passager"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "Outil de nommage de composant passif\n"
+#~ "\n"
+#~ "Clic-Droit pour nommer un composant passif."
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculaire"
+
+#~ msgid "Please specify a player name to transfer ownership to."
+#~ msgstr ""
+#~ "Spécifiez le nom du joueur à qui la propriété doit être transférée, SVP."
+
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Voie de point de limitation de vitesse"
+
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Point de limitation de vitesse : @1"
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Cet emplacement est occupé par un train."
+
+#~ msgid "Prev FC"
+#~ msgstr "Code de fret précédent"
+
+#~ msgid "Print advtrains status info"
+#~ msgstr "Affiche les informations d'état d'advtrains"
+
+#~ msgid "Re-enabling advtrains globalstep..."
+#~ msgstr "Réacivation du pas global d'advtrains..."
+
+#~ msgid "Reduced speed"
+#~ msgstr "Vitesse réduite"
+
+#~ msgid "Reload successful!"
+#~ msgstr "Succès du rechargement !"
+
+#~ msgid "Remote Routesetting"
+#~ msgstr "Routage à distance"
+
+#~ msgid "Removing unused wagon"
+#~ msgstr "Suppression d'un wagon inutilisé"
+
+#~ msgid "Restoring saved state in 1 second..."
+#~ msgstr "Restauration du l'état sauvegardé dans une seconde..."
+
+#~ msgid "Restricted speed"
+#~ msgstr "Vitesse limitée"
+
+#~ msgid "Returns the position of the train with the given id"
+#~ msgstr "Affiche la position du train identifié"
+
+#~ msgid "Route state changed."
+#~ msgstr "Changement d'état de l'itinéraire."
+
+#~ msgid "Routingcode"
+#~ msgstr "Code de routage"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Sauvegarder les propriétés du wagon"
+
+#~ msgid "Saving failed: "
+#~ msgstr "Échec de sauvegarde : "
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Attelage Scharfenberg"
+
+#~ msgid "Select seat:"
+#~ msgstr "Choisir le siège :"
+
+#~ msgid "Set name of component (empty to clear)"
+#~ msgstr "Nommer le composant (chaîne vide pour effacer)"
+
+#~ msgid "Set point speed restriction:"
+#~ msgstr "Placez un point de limitation de vitesse :"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Montrer le stock"
+
+#~ msgid "Signal"
+#~ msgstr "Signal"
+
+#~ msgid "Speed:"
+#~ msgstr "Vitesse : "
+
+#~ msgid "Steam Engine"
+#~ msgstr "Locomotive à vapeur"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "Voiture de Métropolitain"
+
+# Routage est il le bon terme ?
+#~ msgid "Successfully invalidated train routes"
+#~ msgstr "Succès d'invalidation des routages des trains"
+
+#~ msgid "Target:"
+#~ msgstr "Destination : "
+
+#~ msgid "Teleporting to train "
+#~ msgstr "Téléportation au train "
+
+#~ msgid "Teleports you to the position of the train with the given id"
+#~ msgstr "Vous téléporte à la position du train identifié"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Texte affiché à l'intérieur du train"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Texte affiché à l'extérieur du train"
+
+#~ msgid "That player does not exist!"
+#~ msgstr "Ce joueur n'existe pas !"
+
+#~ msgid "That wagon does not exist!"
+#~ msgstr "Ce wagon n'a pas de siège !"
+
+#~ 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 !"
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Le presse-papier est vide."
+
+#~ 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 !"
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Le stock de ce wagon n'est pas vide."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Il y a un \"Signal Influence Point\" ici."
+
+#~ msgid "There's a Track Circuit Break here."
+#~ msgstr "Il y a un \"Track Circuit Break\" ici."
+
+#~ msgid "This Wagon ID"
+#~ msgstr "Identificateur du wagon"
+
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !"
+
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#~ msgid "This position is protected!"
+#~ msgstr "Cet emplacement est protégé !"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Cette voie ne peut pas être modifiée."
+
+#~ msgid "This track can not be removed!"
+#~ msgstr "Cette voie ne peut pas être enlevée !"
+
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Cette voie ne peut pas être tournée !"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "Ce wagon n'a pas de siège."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Ce wagon est plein."
+
+#~ 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."
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Outil \"Trackworker\"\n"
+#~ "\n"
+#~ "Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n"
+#~ "\n"
+#~ "Clic-Droit : tourne l'objet"
+
+#~ msgid "Train"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train "
+#~ msgstr "Identificateur du train "
+
+#~ msgid "Train ID"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train copied."
+#~ msgstr "Train copié."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Outil de copie/collage de train\n"
+#~ "\n"
+#~ "Clic-Gauche : copie\n"
+#~ "\n"
+#~ "Clic-Droit : collage"
+
+#~ 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."
+
+#~ msgid "Train overview /coupling control:"
+#~ msgstr "Aperçu du train / commande d'accouplement :"
+
+#~ msgid "Unable to load wagon type"
+#~ msgstr "Impossible de charger le type du wagon"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Controlleur ATC, non-configuré"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "Composant LuaATC non configuré"
+
+#~ msgid "Uninitialized init="
+#~ msgstr "Variable init non initialisée"
+
+#~ msgid "Uninitialized, removing"
+#~ msgstr "Non initialisé, retiré"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Voie de Déchargement"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les "
+#~ "portes closes !"
+
+#~ msgid "Wagon @1 ownership changed from @2 to @3"
+#~ msgstr "La propriété du wagon @1 a été transférée de @2 à @3"
+
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Outil de propriété du wagon"
+
+#~ msgid ""
+#~ "Wagon Properties Tool\n"
+#~ "Punch a wagon to view and edit the Wagon Properties"
+#~ msgstr ""
+#~ "Outil de propriété du wagon\n"
+#~ "Frappez un wagon pour voir et modifier ses propriétés"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Propriétés du wagon"
+
+#~ msgid "Wagon road number:"
+#~ msgstr "Immatriculation du wagon :"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "Signal mural (gauche)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "Signal mural (droit)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "Signal mural (plafond)"
+
+#~ 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."
+
+#~ msgid "Wheel"
+#~ msgstr "Roue"
+
+#~ msgid "Y-turnout"
+#~ msgstr "Embranchement en Y"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Accès interdit au poste de pilotage."
+
+#~ 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é."
+
+#~ 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\" (?)"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé."
+
+#~ 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\"."
+
+#~ 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."
+
+#~ 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."
+
+#~ 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\"."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
+#~ "\"railway_operator\" manquant)"
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Montée impossible dans ce wagon."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"@1\"."
+
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"train_operator\"."
+
+#~ msgid "You have been given ownership of wagon @1"
+#~ msgstr "La propriété du wagon @1 vous a été transférée"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer "
+#~ "cet attelage."
+
+#~ msgid "from wagon_save table."
+#~ msgstr "de la table wagon_save."
+
+#~ 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 !"
+
+#~ msgid "slowdown"
+#~ msgstr "ralentissement"
diff --git a/advtrains_line_automation/po/update-translations.sh b/advtrains_line_automation/po/update-translations.sh
new file mode 100644
index 0000000..9fb7596
--- /dev/null
+++ b/advtrains_line_automation/po/update-translations.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+MODNAME="advtrains_line_automation"
+MSGID_BUGS_ADDR='advtrains-discuss@lists.sr.ht'
+
+PODIR=`dirname "$0"`
+ATDIR="$PODIR/.."
+POTFILE="$PODIR/$MODNAME.pot"
+
+xgettext \
+ -D "$ATDIR" \
+ -d "$MODNAME" \
+ -o "$POTFILE" \
+ -p . \
+ -L lua \
+ --add-location=file \
+ --from-code=UTF-8 \
+ --sort-by-file \
+ --keyword='S' \
+ --package-name="$MODNAME" \
+ --msgid-bugs-address="$MSGID_BUGS_ADDR" \
+ `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \
+ &&
+for i in "$PODIR"/*.po; do
+ msgmerge -U \
+ --sort-by-file \
+ $i "$POTFILE"
+done
diff --git a/advtrains_line_automation/po/zh_CN.po b/advtrains_line_automation/po/zh_CN.po
new file mode 100644
index 0000000..a4ea048
--- /dev/null
+++ b/advtrains_line_automation/po/zh_CN.po
@@ -0,0 +1,552 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:01+0200\n"
+"PO-Revision-Date: 2023-10-09 11:24+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Simplified)\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: stoprail.lua
+msgid "Closed"
+msgstr ""
+
+#: stoprail.lua
+msgid "Dep. Speed"
+msgstr "出发速度"
+
+#: stoprail.lua
+msgid "Door Delay"
+msgstr "车门关闭时间"
+
+#: stoprail.lua
+msgid "Door Side"
+msgstr ""
+
+#: stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: stoprail.lua
+msgid "Left"
+msgstr ""
+
+#: stoprail.lua
+msgid "Next Stop:\n"
+msgstr ""
+
+#: stoprail.lua
+msgid "Reverse train"
+msgstr "改变行车方向"
+
+#: stoprail.lua
+msgid "Right"
+msgstr ""
+
+#: stoprail.lua
+msgid "Save"
+msgstr "保存"
+
+#: stoprail.lua
+msgid "Station Code"
+msgstr "车站代码"
+
+#: stoprail.lua
+msgid "Station Name"
+msgstr "车站名称"
+
+#: stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
+msgstr ""
+
+#: stoprail.lua
+msgid "Station/Stop Track"
+msgstr "车站轨道"
+
+#: stoprail.lua
+msgid "Stop Time"
+msgstr "停站时间"
+
+#: stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
+msgstr ""
+
+#: stoprail.lua
+msgid "Track"
+msgstr "轨道"
+
+#: stoprail.lua
+msgid "Trains stopping here (ARS rules)"
+msgstr ""
+
+#: stoprail.lua
+msgid "Unknown Station"
+msgstr ""
+
+#: stoprail.lua
+msgid "Wait for signal to clear"
+msgstr ""
+
+#: stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "您不能调整这段轨道。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(车门已关闭)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三开道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<没有车钩>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "较高的@1站台 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "较高的@1站台"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "较低的@1站台"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "较低的@1站台 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 语法错误:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 语法错误:“I”命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "频道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "铁路道口信号灯"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火车后部不在轨道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工业用火车头"
+
+#~ msgid "Boiler"
+#~ msgstr "锅炉"
+
+#~ msgid "Box Wagon"
+#~ msgstr "货运车厢"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "链式车钩"
+
+#~ msgid "Bumper"
+#~ msgstr "保险杠"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "无法上车:车门已关闭或车厢已满。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "无法放置斜坡:较高端没有支撑方块。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "无法放置斜坡:您没有选择任何方块。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "无法放置:此区域已被保护。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "无法放置斜坡:此区域已被占用。"
+
+#~ msgid "Chimney"
+#~ msgstr "烟囱"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (激活时)"
+
+#~ msgid "Default Seat"
+#~ msgstr "默认座位"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "默认座位 (司机座位)"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "请不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精细的蒸汽机车"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探测轨道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉轨道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 频道"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "车门已关闭,请使用潜行+右键单击下车。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左侧司机座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右侧司机座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "驾驶室"
+
+#~ msgid "Get off"
+#~ msgstr "下车"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "强制下车"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工业用火车头"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液体运输车厢"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材运输车厢"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列车车头"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火车车钩"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列车车厢"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列车车厢"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂板信号机"
+
+#~ msgid "Line"
+#~ msgstr "火车线路"
+
+#~ msgid "Loading Track"
+#~ msgstr "装货轨道"
+
+#~ msgid "Lock couples"
+#~ msgstr "锁定连接处"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您没有指向一个可以用火车复制工具复制的物体。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 为“@1”的列车不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 为“@1”的车厢不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能调整这段轨道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客车"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客车"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "被动元件命名工具\n"
+#~ "\n"
+#~ "右键单击命名所选元件。"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉轨道"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由码"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "保存车厢属性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式车钩"
+
+#~ msgid "Select seat:"
+#~ msgstr "请选择座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "显示物品栏"
+
+#~ msgid "Signal"
+#~ msgstr "信号灯"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽机车"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地铁车厢"
+
+#~ msgid "Target:"
+#~ msgstr "目标速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "车厢内部显示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "车厢外部显示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "无法复制:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "无法粘贴:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪贴板是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "轨道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "轨道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "车厢已满。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具调整这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "这里已被保护。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能调整这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋转这段轨道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "车厢已满。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "这是 @1 的车厢,您不能摧毁它。"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "铁路调整工具\n"
+#~ "\n"
+#~ "左键单击:切换轨道类型\n"
+#~ "右键单击:旋转方块"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已复制列车。"
+
+#~ msgid "Train copied."
+#~ msgstr "已复制列车。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火车复制工具\n"
+#~ "\n"
+#~ "左键单击:复制\n"
+#~ "右键单击:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 部件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸货轨道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "请使用潜行+右键上车。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁挂式信号灯 (左侧)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁挂式信号灯 (右侧)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "悬挂式信号灯"
+
+#~ 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 ""
+#~ "警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请"
+#~ "按潜行键并左键单击此车厢。"
+
+#~ msgid "Wheel"
+#~ msgstr "车轮"
+
+#~ msgid "Y-turnout"
+#~ msgstr "对称道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您没有“train_operator”权限,不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您没有“@1”权限,不能调整这段轨道。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您没有“train_operator”权限,不能连接这两节车厢。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您没有“@1”权限,不能命名被动元件。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。"
diff --git a/advtrains_line_automation/po/zh_TW.po b/advtrains_line_automation/po/zh_TW.po
new file mode 100644
index 0000000..ddf1b3f
--- /dev/null
+++ b/advtrains_line_automation/po/zh_TW.po
@@ -0,0 +1,552 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:01+0200\n"
+"PO-Revision-Date: 2023-10-09 11:31+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Traditional)\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: stoprail.lua
+msgid "Closed"
+msgstr ""
+
+#: stoprail.lua
+msgid "Dep. Speed"
+msgstr "出發速度"
+
+#: stoprail.lua
+msgid "Door Delay"
+msgstr "車門關閉時間"
+
+#: stoprail.lua
+msgid "Door Side"
+msgstr ""
+
+#: stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: stoprail.lua
+msgid "Left"
+msgstr ""
+
+#: stoprail.lua
+msgid "Next Stop:\n"
+msgstr ""
+
+#: stoprail.lua
+msgid "Reverse train"
+msgstr "改變行車方向"
+
+#: stoprail.lua
+msgid "Right"
+msgstr ""
+
+#: stoprail.lua
+msgid "Save"
+msgstr "儲存"
+
+#: stoprail.lua
+msgid "Station Code"
+msgstr "車站碼"
+
+#: stoprail.lua
+msgid "Station Name"
+msgstr "車站名稱"
+
+#: stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
+msgstr ""
+
+#: stoprail.lua
+msgid "Station/Stop Track"
+msgstr "車站軌道"
+
+#: stoprail.lua
+msgid "Stop Time"
+msgstr "停站時間"
+
+#: stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
+msgstr ""
+
+#: stoprail.lua
+msgid "Track"
+msgstr "軌道"
+
+#: stoprail.lua
+msgid "Trains stopping here (ARS rules)"
+msgstr ""
+
+#: stoprail.lua
+msgid "Unknown Station"
+msgstr ""
+
+#: stoprail.lua
+msgid "Wait for signal to clear"
+msgstr ""
+
+#: stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "您不能調整這段軌道。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(車門已關閉)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三開道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<無連結器>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "較高的@1月臺 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "較高的@1月臺"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "較低的@1月臺"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "較低的@1月臺 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 語法錯誤:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "頻道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "平交道號誌燈"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火車後部不在軌道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工業用火車頭"
+
+#~ msgid "Boiler"
+#~ msgstr "鍋爐"
+
+#~ msgid "Box Wagon"
+#~ msgstr "貨運車廂"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "鏈式連結器"
+
+#~ msgid "Bumper"
+#~ msgstr "保險槓"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "無法上車:車門已關閉或車廂已滿。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "無法放置斜坡:較高階沒有支撐方塊。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "無法放置斜坡:您沒有選擇任何方塊。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "無法放置:此區域已被保護。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "無法放置斜坡:此區域已被佔用。"
+
+#~ msgid "Chimney"
+#~ msgstr "煙囪"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (啟用時)"
+
+#~ msgid "Default Seat"
+#~ msgstr "預設座位"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "預設座位 (司機座位)"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "請不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精細的蒸汽機車"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探測軌道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉軌道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 頻道"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左側司機座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右側司機座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "駕駛室"
+
+#~ msgid "Get off"
+#~ msgstr "下車"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "強制下車"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工業用火車頭"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液體運輸車廂"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材運輸車廂"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列車車頭"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火車連結器"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列車車廂"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列車車廂"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂木式號誌機"
+
+#~ msgid "Line"
+#~ msgstr "火車線路"
+
+#~ msgid "Loading Track"
+#~ msgstr "裝貨軌道"
+
+#~ msgid "Lock couples"
+#~ msgstr "鎖定連結處"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 為「@1」的列車不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 為「@1」的車廂不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能調整這段軌道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客車"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客車"
+
+#~ msgid ""
+#~ "Passive Component Naming Tool\n"
+#~ "\n"
+#~ "Right-click to name a passive component."
+#~ msgstr ""
+#~ "被動元件命名工具\n"
+#~ "\n"
+#~ "右鍵單擊命名所選元件。"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉軌道"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由碼"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "儲存車廂屬性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式連結器"
+
+#~ msgid "Select seat:"
+#~ msgstr "請選擇座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "顯示物品欄"
+
+#~ msgid "Signal"
+#~ msgstr "色燈號誌機"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽機車"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地鐵車廂"
+
+#~ msgid "Target:"
+#~ msgstr "目標速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "車廂內部顯示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "車廂外部顯示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "無法複製:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "無法貼上:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪貼簿是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "軌道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "軌道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "車廂已滿。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具調整這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "這裡已被保護。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能調整這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋轉這段軌道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "車廂已滿。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "這是 @1 的車廂,您不能摧毀它。"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "鐵路調整工具\n"
+#~ "\n"
+#~ "左鍵單擊:切換軌道型別\n"
+#~ "右鍵單擊:旋轉方塊"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已複製火車。"
+
+#~ msgid "Train copied."
+#~ msgstr "已複製火車。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火車複製工具\n"
+#~ "\n"
+#~ "左鍵單擊:複製\n"
+#~ "右鍵單擊:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unconfigured LuaATC component"
+#~ msgstr "LuaATC 元件 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸貨軌道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "請使用潛行+右鍵上車。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁掛式色燈號誌機 (左側)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁掛式色燈號誌機 (右側)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "懸掛式色燈號誌機"
+
+#~ 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 ""
+#~ "警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請"
+#~ "按潛行鍵並左鍵單擊此車廂。"
+
+#~ msgid "Wheel"
+#~ msgstr "車輪"
+
+#~ msgid "Y-turnout"
+#~ msgstr "對稱道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this LuaATC component without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您沒有「@1」許可權,不能調整這段軌道。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to name LuaATC passive components without the @1 "
+#~ "privilege."
+#~ msgstr "您沒有「@1」許可權,不能命名這個元件。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。"
diff --git a/advtrains_line_automation/scheduler.lua b/advtrains_line_automation/scheduler.lua
index 5cba0a0..6025b02 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] "..S("No callback to handle schedule"),elem)
+ atwarn("[lines][scheduler] 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 aa8dfdd..a0e4442 100644
--- a/advtrains_line_automation/stoprail.lua
+++ b/advtrains_line_automation/stoprail.lua
@@ -1,8 +1,8 @@
-- stoprail.lua
-- adds "stop rail". Recognized by lzb. (part of behavior is implemented there)
--- Translation
-S = attrans
+-- Get current translator
+local S = advtrains.lines.translate
local function to_int(n)
--- Disallow floating-point numbers
diff --git a/advtrains_luaautomation/active_common.lua b/advtrains_luaautomation/active_common.lua
index 074d3b3..d0ae2a4 100644
--- a/advtrains_luaautomation/active_common.lua
+++ b/advtrains_luaautomation/active_common.lua
@@ -1,4 +1,5 @@
-local S = atltrans
+-- Get current translator
+local S = atlatc.translate
local ac = {nodes={}}
diff --git a/advtrains_luaautomation/atc_rail.lua b/advtrains_luaautomation/atc_rail.lua
index c98f62b..594de5c 100644
--- a/advtrains_luaautomation/atc_rail.lua
+++ b/advtrains_luaautomation/atc_rail.lua
@@ -2,6 +2,9 @@
-- registers and handles the ATC rail. Active component.
-- This is the only component that can interface with trains, so train interface goes here too.
+-- Get current translator
+local S = atlatc.translate
+
--Using subtable
local r={}
@@ -229,7 +232,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_atc.png",
- description=atltrans("LuaATC Track"),
+ description=S("LuaATC Track"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
return {
diff --git a/advtrains_luaautomation/chatcmds.lua b/advtrains_luaautomation/chatcmds.lua
index b6ffaee..7691013 100644
--- a/advtrains_luaautomation/chatcmds.lua
+++ b/advtrains_luaautomation/chatcmds.lua
@@ -1,28 +1,31 @@
--chatcmds.lua
--Registers commands to modify the init and step code for LuaAutomation
+-- Get current translator
+local S = atlatc.translate
+
local function get_init_form(env, pname)
local err = env.init_err or ""
local code = env.init_code or ""
local form = "size["..atlatc.CODE_FORM_SIZE.."]"
.."style[code;font=mono]"
- .."button[0.0,0.2;2.5,1;run;Run Init Code]"
- .."button[2.5,0.2;2.5,1;cls;Clear S]"
- .."button[5.0,0.2;2.5,1;save;Save]"
- .."button[7.5,0.2;2.5,1;del;Delete Env.]"
- .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Environment initialization code;"..minetest.formspec_escape(code).."]"
+ .."button[0.0,0.2;2.5,1;run;"..S("Run Init Code").."]"
+ .."button[2.5,0.2;2.5,1;cls;"..S("Clear S").."]"
+ .."button[5.0,0.2;2.5,1;save;"..S("Save").."]"
+ .."button[7.5,0.2;2.5,1;del;"..S("Delete Env.").."]"
+ .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;"..S("Environment initialization code")..";"..minetest.formspec_escape(code).."]"
.."label[0.0,9.7;"..err.."]"
return form
end
core.register_chatcommand("env_setup", {
params = "<environment name>",
- description = "Set up and modify AdvTrains LuaAutomation environment",
+ description = S("Set up and modify AdvTrains LuaAutomation environment"),
privs = {atlatc=true},
func = function(name, param)
local env=atlatc.envs[param]
- if not env then return false,"Invalid environment name!" end
+ if not env then return false,S("Invalid environment name!") end
minetest.show_formspec(name, "atlatc_envsetup_"..param, get_init_form(env, name))
return true
end,
@@ -30,52 +33,52 @@ core.register_chatcommand("env_setup", {
core.register_chatcommand("env_create", {
params = "<environment name>",
- description = "Create an AdvTrains LuaAutomation environment",
+ description = S("Create an AdvTrains LuaAutomation environment"),
privs = {atlatc=true},
func = function(name, param)
- if not param or param=="" then return false, "Name required!" end
- if string.find(param, "[^a-zA-Z0-9-_]") then return false, "Invalid name (only common characters)" end
- if atlatc.envs[param] then return false, "Environment already exists!" end
+ if not param or param=="" then return false, S("Name required!") end
+ if string.find(param, "[^a-zA-Z0-9-_]") then return false, S("Invalid name (only common characters)") end
+ if atlatc.envs[param] then return false, S("Environment already exists!") end
atlatc.envs[param] = atlatc.env_new(param)
atlatc.envs[param].subscribers = {name}
- return true, "Created environment '"..param.."'. Use '/env_setup "..param.."' to define global initialization code, or start building LuaATC components!"
+ return true, S("Created environment '@1'. Use '/env_setup @2' to define global initialization code, or start building LuaATC components!", param, param)
end,
})
core.register_chatcommand("env_subscribe", {
params = "<environment name>",
- description = "Subscribe to the log of an Advtrains LuaATC environment",
+ description = S("Subscribe to the log of an Advtrains LuaATC environment"),
privs = {atlatc=true},
func = function(name, param)
local env=atlatc.envs[param]
- if not env then return false,"Invalid environment name!" end
+ if not env then return false,S("Invalid environment name!") end
for _,pname in ipairs(env.subscribers) do
if pname==name then
- return false, "Already subscribed!"
+ return false, S("Already subscribed!")
end
end
table.insert(env.subscribers, name)
- return true, "Subscribed to environment '"..param.."'."
+ return true, S("Subscribed to environment '@1'.", param)
end,
})
core.register_chatcommand("env_unsubscribe", {
params = "<environment name>",
- description = "Unubscribe to the log of an Advtrains LuaATC environment",
+ description = S("Unubscribe to the log of an Advtrains LuaATC environment"),
privs = {atlatc=true},
func = function(name, param)
local env=atlatc.envs[param]
- if not env then return false,"Invalid environment name!" end
+ if not env then return false,S("Invalid environment name!") end
for index,pname in ipairs(env.subscribers) do
if pname==name then
table.remove(env.subscribers, index)
- return true, "Successfully unsubscribed!"
+ return true, S("Successfully unsubscribed!")
end
end
- return false, "Not subscribed to environment '"..param.."'."
+ return false, S("Not subscribed!")
end,
})
core.register_chatcommand("env_subscriptions", {
params = "[environment name]",
- description = "List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name).",
+ description = S("List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name)."),
privs = {atlatc=true},
func = function(name, param)
if not param or param=="" then
@@ -89,19 +92,19 @@ core.register_chatcommand("env_subscriptions", {
end
end
if none then
- return false, "Not subscribed to any!"
+ return false, S("Not subscribed to any!")
end
return true
end
local env=atlatc.envs[param]
- if not env then return false,"Invalid environment name!" end
+ if not env then return false,S("Invalid environment name!") end
local none=true
for index,pname in ipairs(env.subscribers) do
none=false
minetest.chat_send_player(name, pname)
end
if none then
- return false, "No subscribers!"
+ return false, S("No subscribers!")
end
return true
end,
@@ -115,7 +118,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local envname=string.match(formname, "^atlatc_delconfirm_(.+)$")
if envname and fields.sure=="YES" then
atlatc.envs[envname]=nil
- minetest.chat_send_player(pname, "Environment deleted!")
+ minetest.chat_send_player(pname, S("Environment deleted!"))
return
end
@@ -126,7 +129,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if not env then return end
if fields.del then
- minetest.show_formspec(pname, "atlatc_delconfirm_"..envname, "field[sure;"..minetest.formspec_escape("SURE TO DELETE ENVIRONMENT "..envname.."? Type YES (all uppercase) to continue or just quit form to cancel.")..";]")
+ minetest.show_formspec(pname, "atlatc_delconfirm_"..envname, "field[sure;"
+ ..minetest.formspec_escape(S("SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just quit form to cancel.", envname))..";]")
return
end
diff --git a/advtrains_luaautomation/init.lua b/advtrains_luaautomation/init.lua
index a2f4eb9..753340d 100644
--- a/advtrains_luaautomation/init.lua
+++ b/advtrains_luaautomation/init.lua
@@ -2,14 +2,20 @@
-- Lua automation features for advtrains
-- Uses global table 'atlatc' (AdvTrains_LuaATC)
-atltrans = attrans
-local S = atltrans
---Privilege
---Only trusted players should be enabled to build stuff which can break the server.
atlatc = { envs = {}}
+-- Initialize internationalization (using ywang's poconvert)
+advtrains.poconvert.from_flat("advtrains_luaautomation")
+-- ask engine for translator instance, this will load the translation files
+atlatc.translate = core.get_translator("advtrains_luaautomation")
+
+-- Get current translator
+local S = atlatc.translate
+
+--Privilege
+--Only trusted players should be enabled to build stuff which can break the server.
minetest.register_privilege("atlatc", { description = S("Can place and configure LuaATC components, including execute potentially harmful Lua code"), give_to_singleplayer = false, default= false })
--Size of code input forms in X,Y notation. Must be at least 10x10
diff --git a/advtrains_luaautomation/locale/advtrains_luaautomation.de.tr b/advtrains_luaautomation/locale/advtrains_luaautomation.de.tr
new file mode 100644
index 0000000..8927753
--- /dev/null
+++ b/advtrains_luaautomation/locale/advtrains_luaautomation.de.tr
@@ -0,0 +1,39 @@
+# textdomain: advtrains_luaautomation
+Clear Local Environment=Lokale Umgebung leeren
+Code=Quellcode
+LuaATC Environment=LuaATC-Umgebung
+LuaATC component assigned to an invalid environment=LuaATC-Komponente zugewiesen an ungültige Umgebung
+LuaATC component assigned to environment '@1'=LuaATC-Komponente zugewiesen an Umgebung '@1'
+LuaATC component with error: @1=LuaATC-Bauteil mit Fehlermeldung: @1
+Save=Speichern
+Unconfigured LuaATC component=Nicht konfiguierter LuaATC-Bauteil
+You are not allowed to configure this LuaATC component without the @1 privilege.=Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren.
+LuaATC Track=LuaATC-Gleis
+Already subscribed!=Bereits abonniert!
+Clear S=S leeren
+Create an AdvTrains LuaAutomation environment=Eine LuaATC-Umgebung erstellen
+Created environment '@1'. Use '/env_setup @2' to define global initialization code, or start building LuaATC components!=Umgebung '@1' erstellt. Nutze '/env_setup @2' um Initialisierungscode zu definieren, oder beginne, LuaATC-Komponenten einzubauen!
+Delete Env.=Umg. löschen
+Environment already exists!=Umgebung existiert bereits!
+Environment deleted!=Umgebung gelöscht!
+Environment initialization code=Umgebungs-Initialisierungscode
+Invalid environment name!=Ungültiger Umgebungsname!
+Invalid name (only common characters)=Ungültiger Name (nur Standardzeichen)
+List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name).=Abonnierte LuaATC-Umgebungen auflisten (ohne Parameter) oder Abonnenten einer bestimmten Umgebung anzeigen (Name angeben)
+Name required!=Name benötigt!
+No subscribers!=Keine Abonnenten!
+Not subscribed to any!=Zu keiner Umgebung abonniert!
+Not subscribed!=Nicht abonniert!
+Run Init Code=Init.-Code ausführen
+SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just quit form to cancel.=UMGEBUNG @1 WIRKLICH LÖSCHEN? Geben Sie YES (in Großbuchstaben) ein. Um abzubrechen einfach das Formular schließen.
+Set up and modify AdvTrains LuaAutomation environment=LuaATC-Umgebung einstellen und bearbeiten
+Subscribe to the log of an Advtrains LuaATC environment=Meldungen aus LuaATC-Umgebung abonnieren
+Subscribed to environment '@1'.=Meldungen von '@1' abonniert.
+Successfully unsubscribed!=Erfolgreich abgemeldet!
+Unubscribe to the log of an Advtrains LuaATC environment=Meldungen aus LuaATC-Umgebung nicht mehr empfangen
+Can place and configure LuaATC components, including execute potentially harmful Lua code=Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche Programme ausführen)
+LuaATC Mesecon Controller=LuaATC Mesecon-Steuerung
+LuaATC Operation Panel=LuaATC-Steuerpanel
+Passive Component Naming Tool@n@nRight-click to name a passive component.=PC-Benennungswerkzeug@n@nRechtsklick zur Benennung der passiven Komponente.
+Set name of component (empty to clear)=Name der Komponente setzen (leer lassen um zu löschen)
+You are not allowed to name LuaATC passive components without the @1 privilege.=Sie dürfen ohne das „@1“ Privileg keinen passiven LuaATC-Bauteil benennen. \ No newline at end of file
diff --git a/advtrains_luaautomation/locale/advtrains_luaautomation.fr.tr b/advtrains_luaautomation/locale/advtrains_luaautomation.fr.tr
new file mode 100644
index 0000000..6f82d40
--- /dev/null
+++ b/advtrains_luaautomation/locale/advtrains_luaautomation.fr.tr
@@ -0,0 +1,39 @@
+# textdomain: advtrains_luaautomation
+Clear Local Environment=Effacer l'environnement LuaATC
+Code=Code
+LuaATC Environment=Environnement LuaATC
+LuaATC component assigned to an invalid environment=Composant LuaATC assigné à un environnement invalide
+LuaATC component assigned to environment '@1'=Composant LuaATC assigné à l'environnement '@1'
+LuaATC component with error: @1=Erreur @1 du composant LuaATC
+Save=Sauvegarder
+Unconfigured LuaATC component=Composant LuaATC non configuré
+You are not allowed to configure this LuaATC component without the @1 privilege.=Vous ne pouvez configurer ce composant LuaATC sans le privilege @1.
+#LuaATC Track=Voie de Chargement
+Already subscribed!=
+Clear S=
+Create an AdvTrains LuaAutomation environment=
+Created environment '@1'. Use '/env_setup @2' to define global initialization code, or start building LuaATC components!=
+Delete Env.=
+Environment already exists!=
+Environment deleted!=
+Environment initialization code=
+Invalid environment name!=
+Invalid name (only common characters)=
+List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name).=
+Name required!=
+No subscribers!=
+Not subscribed to any!=
+Not subscribed!=
+Run Init Code=
+SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just quit form to cancel.=
+Set up and modify AdvTrains LuaAutomation environment=
+Subscribe to the log of an Advtrains LuaATC environment=
+#Subscribed to environment '@1'.=Composant LuaATC assigné à l'environnement '@1'
+Successfully unsubscribed!=
+Unubscribe to the log of an Advtrains LuaATC environment=
+Can place and configure LuaATC components, including execute potentially harmful Lua code=Permet le placement et la configuration de composants LuaATC avec risque d'exécution de code Lua dangereux
+LuaATC Mesecon Controller=Commande Mesecon de LuaATC
+LuaATC Operation Panel=Panneau de commande de LuaATC
+Passive Component Naming Tool@n@nRight-click to name a passive component.=Outil de nommage de composant passif@n@nClic-Droit pour nommer un composant passif.
+Set name of component (empty to clear)=Nommer le composant (chaîne vide pour effacer)
+You are not allowed to name LuaATC passive components without the @1 privilege.=Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1. \ No newline at end of file
diff --git a/advtrains_luaautomation/locale/advtrains_luaautomation.zh_CN.tr b/advtrains_luaautomation/locale/advtrains_luaautomation.zh_CN.tr
new file mode 100644
index 0000000..558907f
--- /dev/null
+++ b/advtrains_luaautomation/locale/advtrains_luaautomation.zh_CN.tr
@@ -0,0 +1,39 @@
+# textdomain: advtrains_luaautomation
+Clear Local Environment=
+Code=
+LuaATC Environment=
+LuaATC component assigned to an invalid environment=
+LuaATC component assigned to environment '@1'=
+LuaATC component with error: @1=
+Save=保存
+Unconfigured LuaATC component=LuaATC 部件 (未配置)
+You are not allowed to configure this LuaATC component without the @1 privilege.=您没有“@1”权限,不能配置这个 LuaATC 部件。
+#LuaATC Track=装货轨道
+Already subscribed!=
+Clear S=
+Create an AdvTrains LuaAutomation environment=
+Created environment '@1'. Use '/env_setup @2' to define global initialization code, or start building LuaATC components!=
+Delete Env.=
+Environment already exists!=
+Environment deleted!=
+Environment initialization code=
+Invalid environment name!=
+Invalid name (only common characters)=
+List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name).=
+Name required!=
+No subscribers!=
+Not subscribed to any!=
+Not subscribed!=
+Run Init Code=
+SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just quit form to cancel.=
+Set up and modify AdvTrains LuaAutomation environment=
+Subscribe to the log of an Advtrains LuaATC environment=
+Subscribed to environment '@1'.=
+Successfully unsubscribed!=
+Unubscribe to the log of an Advtrains LuaATC environment=
+Can place and configure LuaATC components, including execute potentially harmful Lua code=
+LuaATC Mesecon Controller=
+LuaATC Operation Panel=
+Passive Component Naming Tool@n@nRight-click to name a passive component.=被动元件命名工具@n@n右键单击命名所选元件。
+Set name of component (empty to clear)=
+You are not allowed to name LuaATC passive components without the @1 privilege.=您没有“@1”权限,不能命名被动元件。 \ No newline at end of file
diff --git a/advtrains_luaautomation/locale/advtrains_luaautomation.zh_TW.tr b/advtrains_luaautomation/locale/advtrains_luaautomation.zh_TW.tr
new file mode 100644
index 0000000..9743b79
--- /dev/null
+++ b/advtrains_luaautomation/locale/advtrains_luaautomation.zh_TW.tr
@@ -0,0 +1,39 @@
+# textdomain: advtrains_luaautomation
+Clear Local Environment=
+Code=
+LuaATC Environment=
+LuaATC component assigned to an invalid environment=
+LuaATC component assigned to environment '@1'=
+LuaATC component with error: @1=
+Save=儲存
+Unconfigured LuaATC component=LuaATC 元件 (未配置)
+You are not allowed to configure this LuaATC component without the @1 privilege.=您沒有「@1」許可權,不能配置這個 LuaATC 元件。
+#LuaATC Track=裝貨軌道
+Already subscribed!=
+Clear S=
+Create an AdvTrains LuaAutomation environment=
+Created environment '@1'. Use '/env_setup @2' to define global initialization code, or start building LuaATC components!=
+Delete Env.=
+Environment already exists!=
+Environment deleted!=
+Environment initialization code=
+Invalid environment name!=
+Invalid name (only common characters)=
+List Advtrains LuaATC environments you are subscribed to (no parameters) or subscribers of an environment (giving an env name).=
+Name required!=
+No subscribers!=
+Not subscribed to any!=
+Not subscribed!=
+Run Init Code=
+SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just quit form to cancel.=
+Set up and modify AdvTrains LuaAutomation environment=
+Subscribe to the log of an Advtrains LuaATC environment=
+Subscribed to environment '@1'.=
+Successfully unsubscribed!=
+Unubscribe to the log of an Advtrains LuaATC environment=
+Can place and configure LuaATC components, including execute potentially harmful Lua code=
+LuaATC Mesecon Controller=
+LuaATC Operation Panel=
+Passive Component Naming Tool@n@nRight-click to name a passive component.=被動元件命名工具@n@n右鍵單擊命名所選元件。
+Set name of component (empty to clear)=
+You are not allowed to name LuaATC passive components without the @1 privilege.=您沒有「@1」許可權,不能命名這個元件。 \ No newline at end of file
diff --git a/advtrains_luaautomation/mesecon_controller.lua b/advtrains_luaautomation/mesecon_controller.lua
index 6981839..9f1a931 100644
--- a/advtrains_luaautomation/mesecon_controller.lua
+++ b/advtrains_luaautomation/mesecon_controller.lua
@@ -6,7 +6,8 @@
-- From Mesecons mod https://mesecons.net/
-- (c) Jeija and Contributors
-local S = atltrans
+-- Get current translator
+local S = atlatc.translate
local BASENAME = "advtrains_luaautomation:mesecon_controller"
local rules = {
diff --git a/advtrains_luaautomation/operation_panel.lua b/advtrains_luaautomation/operation_panel.lua
index 8e12651..adfaf09 100644
--- a/advtrains_luaautomation/operation_panel.lua
+++ b/advtrains_luaautomation/operation_panel.lua
@@ -1,4 +1,5 @@
-local S = atltrans
+-- Get current translator
+local S = atlatc.translate
local function on_punch(pos,node,player)
atlatc.interrupt.add(0, pos, {type="punch", punch=true, name=player:get_player_name()})
diff --git a/advtrains_luaautomation/pcnaming.lua b/advtrains_luaautomation/pcnaming.lua
index ba8048d..7c7f0c9 100644
--- a/advtrains_luaautomation/pcnaming.lua
+++ b/advtrains_luaautomation/pcnaming.lua
@@ -2,7 +2,8 @@
--a.k.a Passive component naming
--Allows to assign names to passive components, so they can be called like:
--setstate("iamasignal", "green")
-local S = atltrans
+-- Get current translator
+local S = atlatc.translate
atlatc.pcnaming={name_map={}}
function atlatc.pcnaming.load(stuff)
@@ -90,4 +91,4 @@ minetest.register_craft({
output = "advtrains_luaautomation:pcnaming",
type = "shapeless",
recipe = {"dye:red","advtrains:trackworker"}
-}) \ No newline at end of file
+})
diff --git a/advtrains_luaautomation/po/README.md b/advtrains_luaautomation/po/README.md
new file mode 100644
index 0000000..3e94682
--- /dev/null
+++ b/advtrains_luaautomation/po/README.md
@@ -0,0 +1,70 @@
+# Translations
+Please read this document before working on any translations.
+
+Unlike many other mods, Advtrains uses `.po` files for localization,
+which are then automatically converted to `.tr` files when the mod is
+loaded. Therefore, please submit patches that edit the `.po` files.
+
+## Getting Started
+The translation files can be edited like any other `.po` file.
+
+If the translation file for your language does not exist, create it by
+copying `template.txt` to `advtrains.XX.tr`, where `XX` is replaced by
+the language code.
+
+Feel free to use the [discussion mailing list][srht-discuss] if you
+have any questions regarding localization.
+
+You can share your `.po` file directly or [as a patch][gsm] to the [dev
+mailing list][srht-devel]. The latter is encouraged, but, unlike code
+changes, translation files sent directly are also accepted.
+
+[tr-format]: https://minetest.gitlab.io/minetest/translations/#translation-file-format
+[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss
+[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel
+[gsm]: https://git-send-email.io
+
+## Translation Notes
+* Translations should be consistent. You can use other entries or the
+translations in Minetest as a reference.
+* Translations do not have to fully correspond to the original text -
+they only need to provide the same information. In particular,
+translations do not need to have the same linguistical structure as the
+original text.
+* Replacement sequences (`@1`, `@2`, etc) should not be translated.
+* Certain abbreviations or names, such as "Ks" or "Zs 3", should
+generally not be translated.
+
+### (de) German
+* Verwenden Sie die neue Rechtschreibung und die Sie-Form.
+* Mit der deutschen Tastaturbelegung unter Linux können die
+Anführungszeichen „“ mit AltGr-V bzw. AltGr-B eingegeben werden.
+
+### (zh) Chinese
+(This section is written in English to avoid writing the note twice or
+using only one of the variants, as most of this section applies to both
+the traditional and simplified variants.)
+
+* Please use the 「」 quotation marks for Traditional Chinese and “”
+for Simplified Chinese.
+* Please use the fullwidth variants of: , 、 。 ? ! : ;
+* Please use the halfwidth variants of: ( ) [ ] / \ |
+* Please do not leave any space between Han characters (including
+fullwidth punctuation marks).
+* Please leave a space between Han characters (excluding fullwidth
+punctuation marks) and characters from other scripts (including
+halfwidth punctuation marks). However, do not leave any space between
+Han characters and Arabic numerals.
+
+## Notes for developers
+* The `update-translations.sh` script can be used to update the
+translation files. However, please make sure to install the
+`basic_trains` mod before running the script.
+* Please make sure that the first argument to `S` (or `attrans`) _only_
+includes string literals without formatting or concatenation. This is
+unfortunately a limitation of the `xgettext` utility.
+* Avoid word-by-word translations.
+* Avoid manipulating translated strings (except for concatenation). Use
+server-side translations if you have to modify the text sent to users.
+* Avoid truncating strings unless multibyte characters are handled
+properly.
diff --git a/advtrains_luaautomation/po/advtrains_luaautomation.pot b/advtrains_luaautomation/po/advtrains_luaautomation.pot
new file mode 100644
index 0000000..b0adf58
--- /dev/null
+++ b/advtrains_luaautomation/po/advtrains_luaautomation.pot
@@ -0,0 +1,185 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the advtrains_luaautomation package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains_luaautomation\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:03+0200\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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC Environment"
+msgstr ""
+
+#: active_common.lua chatcmds.lua
+msgid "Save"
+msgstr ""
+
+#: active_common.lua
+msgid "Clear Local Environment"
+msgstr ""
+
+#: active_common.lua
+msgid "Code"
+msgstr ""
+
+#: active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component with error: @1"
+msgstr ""
+
+#: atc_rail.lua
+msgid "LuaATC Track"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Run Init Code"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Clear S"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Delete Env."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment initialization code"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Set up and modify AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid environment name!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Create an AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Name required!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid name (only common characters)"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment already exists!"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"Created environment '@1'. Use '/env_setup @2' to define global "
+"initialization code, or start building LuaATC components!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Already subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribed to environment '@1'."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Unubscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Successfully unsubscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"List Advtrains LuaATC environments you are subscribed to (no parameters) or "
+"subscribers of an environment (giving an env name)."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed to any!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "No subscribers!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment deleted!"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just "
+"quit form to cancel."
+msgstr ""
+
+#: init.lua
+msgid ""
+"Can place and configure LuaATC components, including execute potentially "
+"harmful Lua code"
+msgstr ""
+
+#: mesecon_controller.lua
+msgid "LuaATC Mesecon Controller"
+msgstr ""
+
+#: operation_panel.lua
+msgid "LuaATC Operation Panel"
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"Passive Component Naming Tool\n"
+"\n"
+"Right-click to name a passive component."
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"You are not allowed to name LuaATC passive components without the @1 "
+"privilege."
+msgstr ""
+
+#: pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
diff --git a/advtrains_luaautomation/po/de.po b/advtrains_luaautomation/po/de.po
new file mode 100644
index 0000000..7327c77
--- /dev/null
+++ b/advtrains_luaautomation/po/de.po
@@ -0,0 +1,708 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:03+0200\n"
+"PO-Revision-Date: 2025-06-11 23:13+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: active_common.lua
+msgid "Clear Local Environment"
+msgstr "Lokale Umgebung leeren"
+
+#: active_common.lua
+msgid "Code"
+msgstr "Quellcode"
+
+#: active_common.lua
+msgid "LuaATC Environment"
+msgstr "LuaATC-Umgebung"
+
+#: active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
+msgstr "LuaATC-Komponente zugewiesen an ungültige Umgebung"
+
+#: active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr "LuaATC-Komponente zugewiesen an Umgebung '@1'"
+
+#: active_common.lua
+msgid "LuaATC component with error: @1"
+msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
+
+#: active_common.lua chatcmds.lua
+msgid "Save"
+msgstr "Speichern"
+
+#: active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#: 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."
+
+#: atc_rail.lua
+msgid "LuaATC Track"
+msgstr "LuaATC-Gleis"
+
+#: chatcmds.lua
+msgid "Already subscribed!"
+msgstr "Bereits abonniert!"
+
+#: chatcmds.lua
+msgid "Clear S"
+msgstr "S leeren"
+
+#: chatcmds.lua
+msgid "Create an AdvTrains LuaAutomation environment"
+msgstr "Eine LuaATC-Umgebung erstellen"
+
+#: chatcmds.lua
+msgid ""
+"Created environment '@1'. Use '/env_setup @2' to define global "
+"initialization code, or start building LuaATC components!"
+msgstr ""
+"Umgebung '@1' erstellt. Nutze '/env_setup @2' um Initialisierungscode zu "
+"definieren, oder beginne, LuaATC-Komponenten einzubauen!"
+
+#: chatcmds.lua
+msgid "Delete Env."
+msgstr "Umg. löschen"
+
+#: chatcmds.lua
+msgid "Environment already exists!"
+msgstr "Umgebung existiert bereits!"
+
+#: chatcmds.lua
+msgid "Environment deleted!"
+msgstr "Umgebung gelöscht!"
+
+#: chatcmds.lua
+msgid "Environment initialization code"
+msgstr "Umgebungs-Initialisierungscode"
+
+#: chatcmds.lua
+msgid "Invalid environment name!"
+msgstr "Ungültiger Umgebungsname!"
+
+#: chatcmds.lua
+msgid "Invalid name (only common characters)"
+msgstr "Ungültiger Name (nur Standardzeichen)"
+
+#: chatcmds.lua
+msgid ""
+"List Advtrains LuaATC environments you are subscribed to (no parameters) or "
+"subscribers of an environment (giving an env name)."
+msgstr ""
+"Abonnierte LuaATC-Umgebungen auflisten (ohne Parameter) oder Abonnenten "
+"einer bestimmten Umgebung anzeigen (Name angeben)"
+
+#: chatcmds.lua
+msgid "Name required!"
+msgstr "Name benötigt!"
+
+#: chatcmds.lua
+msgid "No subscribers!"
+msgstr "Keine Abonnenten!"
+
+#: chatcmds.lua
+msgid "Not subscribed to any!"
+msgstr "Zu keiner Umgebung abonniert!"
+
+#: chatcmds.lua
+msgid "Not subscribed!"
+msgstr "Nicht abonniert!"
+
+#: chatcmds.lua
+msgid "Run Init Code"
+msgstr "Init.-Code ausführen"
+
+#: chatcmds.lua
+msgid ""
+"SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just "
+"quit form to cancel."
+msgstr ""
+"UMGEBUNG @1 WIRKLICH LÖSCHEN? Geben Sie YES (in Großbuchstaben) ein. Um "
+"abzubrechen einfach das Formular schließen."
+
+#: chatcmds.lua
+msgid "Set up and modify AdvTrains LuaAutomation environment"
+msgstr "LuaATC-Umgebung einstellen und bearbeiten"
+
+#: chatcmds.lua
+msgid "Subscribe to the log of an Advtrains LuaATC environment"
+msgstr "Meldungen aus LuaATC-Umgebung abonnieren"
+
+#: chatcmds.lua
+msgid "Subscribed to environment '@1'."
+msgstr "Meldungen von '@1' abonniert."
+
+#: chatcmds.lua
+msgid "Successfully unsubscribed!"
+msgstr "Erfolgreich abgemeldet!"
+
+#: chatcmds.lua
+msgid "Unubscribe to the log of an Advtrains LuaATC environment"
+msgstr "Meldungen aus LuaATC-Umgebung nicht mehr empfangen"
+
+#: init.lua
+msgid ""
+"Can place and configure LuaATC components, including execute potentially "
+"harmful Lua code"
+msgstr ""
+"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
+"Programme ausführen)"
+
+#: mesecon_controller.lua
+msgid "LuaATC Mesecon Controller"
+msgstr "LuaATC Mesecon-Steuerung"
+
+#: operation_panel.lua
+msgid "LuaATC Operation Panel"
+msgstr "LuaATC-Steuerpanel"
+
+#: pcnaming.lua
+msgid ""
+"Passive Component Naming Tool\n"
+"\n"
+"Right-click to name a passive component."
+msgstr ""
+"PC-Benennungswerkzeug\n"
+"\n"
+"Rechtsklick zur Benennung der passiven Komponente."
+
+#: pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr "Name der Komponente setzen (leer lassen um zu löschen)"
+
+#: pcnaming.lua
+msgid ""
+"You are not allowed to name LuaATC passive components without the @1 "
+"privilege."
+msgstr ""
+"Sie dürfen ohne das „@1“ Privileg keinen passiven LuaATC-Bauteil benennen."
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Türen geschlossen)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Dreiwegweiche"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Kreuzung mit einem achsenparallelen Gleis"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Keine Kupplung vorhanden>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Hoher @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Hoher @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Niedriger @1-Bahnsteig"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Niedriger @1-Bahnsteig (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1 Steigung"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
+#~ "Ausstieg gezwungen."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden "
+#~ "nicht zum Ausstieg gezwungen."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht "
+#~ "umgekehrt werden."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Zugbeeinflussungsgleis"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Kanal: @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n"
+#~ "Befehl: @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Zugang zu @1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Andreaskreuz"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Große Industrielle Lokomotive"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Güterwaggon"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Schraubenkupplung"
+
+#~ msgid "Bumper"
+#~ msgstr "Prellbock"
+
+#~ 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)."
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind "
+#~ "geschlossen."
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es "
+#~ "werden insgesamt @1 benötigt."
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht "
+#~ "definiert."
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Es kann nicht platziert werden: es gibt keinen unterstützenden Block am "
+#~ "Ende der Steigung."
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt."
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
+
+#~ msgid "Command"
+#~ msgstr "Befehl"
+
+#~ msgid "Command (on)"
+#~ msgstr "Befehl (wenn aktiviert)"
+
+#~ msgid "Default Seat"
+#~ msgstr "Standardsitzplatz"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Standardsitzplatz (Führerstand)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "Zielgeschwindigkeit bei Abfahrt"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "ausrangiertes Gleis, nicht verwenden."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Detaillierte Dampflokomotive"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Detektorgleis"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Diagonale Gleiskreuzung"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline-Kanal"
+
+#~ msgid "Door Delay"
+#~ msgstr "Zeit für die Türschließung"
+
+#~ msgid "Door Side"
+#~ msgstr "Türseite"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Die Türen sind geschlossen."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Führerstand Links"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Führerstand Rechts"
+
+#~ msgid "Driver stand"
+#~ msgstr "Führerstand"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Führerstand"
+
+#~ msgid "Get off"
+#~ msgstr "Aussteigen"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Ausstieg zwingen"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Industrielle Lokomotive"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Tankwaggon"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Holztransportwaggon"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Japanische Personenzug-Lokomotive"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "Japanischer Personenzug-Passagierwaggon"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "Fahrgäste zum Ausstieg zwingen"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Mechanisches Signal"
+
+#~ msgid "Line"
+#~ msgstr "Linie"
+
+#~ msgid "Lock couples"
+#~ msgstr "Kupplungen sperren"
+
+#~ msgid "No such lua entity."
+#~ msgstr ""
+#~ "Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
+#~ "kann."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Passagierwaggon"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "Passagierwaggon"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Geschwindigkeitskontrollgleis"
+
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Geschwindigkeitskontrolle: @1"
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Ein Zug steht an dieser Position."
+
+#~ msgid "Reverse train"
+#~ msgstr "Zug Umkehren"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Waggon-Einstellungen speichern"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenbergkupplung"
+
+#~ msgid "Select seat:"
+#~ msgstr "Wählen Sie einen Sitzplatz aus:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Inventar Zeigen"
+
+#~ msgid "Signal"
+#~ msgstr "Lichtsignal"
+
+#~ msgid "Speed:"
+#~ msgstr "Geschw.:"
+
+#~ msgid "Station Code"
+#~ msgstr "Kennzeichen der Haltestelle"
+
+#~ msgid "Station Name"
+#~ msgstr "Name der Haltestelle"
+
+#~ 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."
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "Gleis zur Kennzeichnung einer Haltestelle"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Dampflokomotive"
+
+#~ msgid "Stop Time"
+#~ msgstr "Wartezeit"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "U-Bahn-Waggon"
+
+#~ msgid "Target:"
+#~ msgstr "Zielges.:"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Innere Anzeige"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Äußere Anzeige"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr ""
+#~ "Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug "
+#~ "nicht kopiert werden."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Das Clipboard ist leer."
+
+#, 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."
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Das Inventar dieses Waggons ist nicht leer."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Hier ist ein Signal-Beeinflussungspunkt."
+
+#~ msgid "There's a Track Circuit Break here."
+#~ msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "Der Waggon ist voll."
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
+
+#~ msgid "This position is protected!"
+#~ msgstr "Diese Position ist geschützt!"
+
+#~ 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."
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Dieses Gleis kann nicht geändert werden."
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "Dieses Gleis kann nicht entfernt werden."
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Dieses Gleis kann nicht gedreht werden."
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Der Waggon ist voll."
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
+
+#~ msgid "Track"
+#~ msgstr "Gleis"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Gleiswerkzeug\n"
+#~ "\n"
+#~ "Linksklick: Gleistyp ändern\n"
+#~ "Rechtsklick: Objekt drehen"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid "Train copied."
+#~ msgstr "Der Zug wurde Kopiert."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Werkzeug zur Erstellung von Zugkopien\n"
+#~ "\n"
+#~ "Linksklick: Zug ins Clipboard kopieren\n"
+#~ "Right-click: Kopierten Zug einfügen"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Abladungsgleis"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen "
+#~ "einzusteigen."
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Waggon-Einstellungen"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "An der linken Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "An der rechten Seite montiertes Signal"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "An der Decke montiertes Signal"
+
+#~ msgid ""
+#~ "Warning: If you destroy this wagon, you only get some steel back! If you "
+#~ "are sure, hold Sneak and left-click the wagon."
+#~ msgstr ""
+#~ "Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
+#~ "Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
+
+#~ msgid "Y-turnout"
+#~ msgstr "Y-Weiche"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Sie haben keinen Zugang zum Führerstand."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
+
+#~ 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."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#~ 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."
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Sie können nicht in diesen Waggon einsteigen."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Ihnen fehlt das „@1“-Privileg."
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln."
diff --git a/advtrains_luaautomation/po/fr.po b/advtrains_luaautomation/po/fr.po
new file mode 100644
index 0000000..e83f85f
--- /dev/null
+++ b/advtrains_luaautomation/po/fr.po
@@ -0,0 +1,986 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:03+0200\n"
+"PO-Revision-Date: 2025-03-25 15:06+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"
+
+#: active_common.lua
+msgid "Clear Local Environment"
+msgstr "Effacer l'environnement LuaATC"
+
+#: active_common.lua
+msgid "Code"
+msgstr "Code"
+
+#: active_common.lua
+msgid "LuaATC Environment"
+msgstr "Environnement LuaATC"
+
+#: active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
+msgstr "Composant LuaATC assigné à un environnement invalide"
+
+#: active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr "Composant LuaATC assigné à l'environnement '@1'"
+
+#: active_common.lua
+msgid "LuaATC component with error: @1"
+msgstr "Erreur @1 du composant LuaATC"
+
+#: active_common.lua chatcmds.lua
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Composant LuaATC non configuré"
+
+#: 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."
+
+#: atc_rail.lua
+#, fuzzy
+msgid "LuaATC Track"
+msgstr "Voie de Chargement"
+
+#: chatcmds.lua
+msgid "Already subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Clear S"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Create an AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"Created environment '@1'. Use '/env_setup @2' to define global "
+"initialization code, or start building LuaATC components!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Delete Env."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment already exists!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment deleted!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment initialization code"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid environment name!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid name (only common characters)"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"List Advtrains LuaATC environments you are subscribed to (no parameters) or "
+"subscribers of an environment (giving an env name)."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Name required!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "No subscribers!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed to any!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Run Init Code"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just "
+"quit form to cancel."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Set up and modify AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: chatcmds.lua
+#, fuzzy
+msgid "Subscribed to environment '@1'."
+msgstr "Composant LuaATC assigné à l'environnement '@1'"
+
+#: chatcmds.lua
+msgid "Successfully unsubscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Unubscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: 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"
+
+#: mesecon_controller.lua
+msgid "LuaATC Mesecon Controller"
+msgstr "Commande Mesecon de LuaATC"
+
+#: operation_panel.lua
+msgid "LuaATC Operation Panel"
+msgstr "Panneau de commande de LuaATC"
+
+#: pcnaming.lua
+msgid ""
+"Passive Component Naming Tool\n"
+"\n"
+"Right-click to name a passive component."
+msgstr ""
+"Outil de nommage de composant passif\n"
+"\n"
+"Clic-Droit pour nommer un composant passif."
+
+#: pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr "Nommer le composant (chaîne vide pour effacer)"
+
+#: pcnaming.lua
+msgid ""
+"You are not allowed to name LuaATC passive components without the @1 "
+"privilege."
+msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
+
+#~ msgid " does not exist or is invalid"
+#~ msgstr " n'existe pas ou est invalide"
+
+#~ msgid " is at "
+#~ msgstr " est à la position "
+
+#~ msgid " units"
+#~ msgstr " Unités"
+
+#~ msgid " wagon:destroy(): data is not set!"
+#~ msgstr " Appel de wagon:destroy() : données non définies !"
+
+#~ msgid "!!! Train off track !!!"
+#~ msgstr "!!! Train hors voie !!!"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(Portes closes)"
+
+#~ msgid "(log"
+#~ msgstr "(log"
+
+#~ msgid ", using placeholder"
+#~ msgstr ", dans un espace réservé"
+
+#~ msgid "3-way turnout"
+#~ msgstr "Embranchement triple"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculo-diagonal"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<Pas de coupleur>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "Quai @1 (haut, 45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "Quai @1 (haut)"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "Quai @1 (bas)"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "Quai @1 (bas, 45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "Pente @1"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "Avertissement commande ATC Éjecter : portes closes."
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "Avertissement commande ATC Éjecter : train en mouvement."
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr ""
+#~ "Attention : Commande ATC de renversement impossible car le train se "
+#~ "déplace."
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr ""
+#~ "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1"
+
+#~ msgid "ATC controller"
+#~ msgstr "Controlleur ATC"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Canal : @2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "Controlleur ATC, mode @1\n"
+#~ "Commande : @2"
+
+#~ msgid "Access to @1"
+#~ msgstr "Accès à @1"
+
+#~ msgid "Advtrains Status: no_action"
+#~ msgstr "État d'advtrains : aucune action"
+
+#~ msgid "Advtrains is already running normally!"
+#~ msgstr "Advtrains fonctionne déjà correctement !"
+
+#~ msgid "Allow these players to access your wagon:"
+#~ msgstr "Autoriser ces joueurs à embarquer :"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "Croix de Saint André"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "La fin du train serait hors voie : annulation."
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "Grosse locomotive industrielle"
+
+#~ msgid "Boiler"
+#~ msgstr "Chaudière à vapeur"
+
+#~ msgid "Box Wagon"
+#~ msgstr "Wagon de frêt"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "Attelage à tampon et vis"
+
+#~ msgid "Bumper"
+#~ msgstr "Heurtoir"
+
+#~ 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)."
+
+#~ 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"
+
+#~ msgid "Can place and dig tracks in unprotected areas"
+#~ msgstr ""
+#~ "Possibilité de poser ou retirer des voies dans les zones non protégées"
+
+#~ 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"
+
+#~ msgid "Can place, remove and operate trains"
+#~ msgstr "Possibilité de poser, retirer ou opérer les trains"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr ""
+#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !"
+
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr ""
+#~ "Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
+
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1"
+
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr ""
+#~ "Placement impossible : pas de nœud d'appui à l'extrémité supérieure."
+
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "Placement impossible : ne pointe pas un nœud"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "Placement impossible : emplacement protégé"
+
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "Placement impossible : espace occupé !"
+
+#~ msgid "Caution"
+#~ msgstr "Attention"
+
+#~ msgid "Chimney"
+#~ msgstr "Cheminée"
+
+#~ msgid "Clear 'Disable ARS' flag"
+#~ msgstr "Effacer le drapeau \"Désactiver l'ARS\""
+
+#~ msgid "Clear (proceed)"
+#~ msgstr "Autorisation (procédez)"
+
+#~ msgid "Closed"
+#~ msgstr "Fermé"
+
+#~ msgid "Command"
+#~ msgstr "Commande"
+
+#~ msgid "Command (on)"
+#~ msgstr "Commande (marche)"
+
+#~ 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 !"
+
+#~ msgid "Current FC: "
+#~ msgstr "Code de fret courant: "
+
+#~ msgid "Danger (halt)"
+#~ msgstr "Danger (stop)"
+
+#~ 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 !"
+
+#~ msgid "Default Seat"
+#~ msgstr "Siège par défaut"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "Siège par défaut (poste de pilotage)"
+
+# Routage est il le bon terme ?
+#~ msgid "Delete all train routes, force them to recalculate"
+#~ msgstr "Suppression et recalcul de tous les routages"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "Vit. de départ"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "Voie déconseillée"
+
+#~ msgid ""
+#~ "Destroying wagon with inventory, but inventory is not found? Shouldn't "
+#~ "happen!"
+#~ msgstr "Desctruction d'un wagon avec inventaire introuvable ? Anomalie !"
+
+#~ 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é."
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "Locomotive à vapeur complexe"
+
+#~ msgid "Detector Rail"
+#~ msgstr "Voie détectrice"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "Croisement diagonal"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Canal Digiline"
+
+#~ msgid "Disable the advtrains globalstep temporarily"
+#~ msgstr "Désactive temporairement le pas global d'advtrains"
+
+#~ msgid "Disabled advtrains successfully"
+#~ msgstr "Succès de la désactivation d'advtrains"
+
+#~ msgid "Door Delay"
+#~ msgstr "Durée d'ouverture des portes"
+
+#~ msgid "Door Side"
+#~ msgstr "Ouv. des portes coté"
+
+#~ msgid "Doors are closed! (Try holding sneak key!)"
+#~ msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
+
+#~ 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 "Driver Stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "Poste de pilotage (gauche)"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "Poste de pilotage (droit)"
+
+#~ msgid "Driver stand"
+#~ msgstr "Poste de pilotage"
+
+#~ msgid "Driver's cab"
+#~ msgstr "Cabine de pilotage"
+
+#~ msgid "Freight Code:"
+#~ msgstr "Code de frêt :"
+
+#~ msgid "Get off"
+#~ msgstr "Débarquer"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "Débarquer (de force)"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "Locomotive industrielle"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "Wagon-citerne industriel"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "Wagon grumier industriel"
+
+#~ msgid "Instructed to save() but load() was never called!"
+#~ msgstr "Appel de save() requis sans appel préalable de load() !"
+
+#~ msgid "Insufficient privileges to use this!"
+#~ msgstr "Privilèges insuffisants pour utiliser ceci !"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "Motrice Japonaise"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "Passage inter-voiture de train Japonais"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Japanese signal pole"
+#~ msgstr "Voiture Japonaise"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "Éjecter les passagers"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "Sémaphore"
+
+#~ msgid "Left"
+#~ msgstr "Gauche"
+
+#~ msgid "Left,Right,Closed;"
+#~ msgstr "Gauche,Droit,Fermé;"
+
+#~ msgid "Line"
+#~ msgstr "Ligne"
+
+#~ msgid "Liquid: "
+#~ msgstr "Liquide : "
+
+#~ msgid "Liquid: empty"
+#~ msgstr "Liquide : vide"
+
+#~ msgid "Lock couples"
+#~ msgstr "Verrouiller l'accouplement"
+
+#~ msgid "Missing train_operator privilege"
+#~ msgstr "Privilège \"train_operator\" manquant"
+
+#~ msgid "Munich U-Bahn Distant Signal ("
+#~ msgstr "Signal distant métro de Munich ("
+
+#~ msgid "Munich U-Bahn Main Signal ("
+#~ msgstr "Signal principal métro de Munich ("
+
+#~ msgid "Next FC:"
+#~ msgstr "Code de fret suivant :"
+
+#~ msgid "Next Stop:\n"
+#~ msgstr "Prochain arrêt :\n"
+
+#~ msgid "No callback to handle schedule"
+#~ msgstr "Absence de fonction de gestion de planning"
+
+#~ msgid "No such lua entity."
+#~ msgstr "Pas de telle entité lua."
+
+#~ msgid "No such train: @1."
+#~ msgstr "Pas de tel train : @1."
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "Pas de tel wagon : @1."
+
+#~ msgid "Not a valid wagon id."
+#~ msgstr "Identificateur de wagon invalide."
+
+#~ msgid "Not allowed to do this."
+#~ msgstr "Vous n'êtes pas autorisé effectuer ceci."
+
+#~ msgid ""
+#~ "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#~ msgstr ""
+#~ "Franchissement de signal rouge : examinez la situation et inversez le "
+#~ "sens de marche du train."
+
+#~ msgid "Onboard Computer"
+#~ msgstr "Ordinateur embarqué"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "Voiture passager"
+
+#~ msgid "Passenger area"
+#~ msgstr "Voiture Passager"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "Croisement perpendiculaire"
+
+#~ msgid "Please specify a player name to transfer ownership to."
+#~ msgstr ""
+#~ "Spécifiez le nom du joueur à qui la propriété doit être transférée, SVP."
+
+#~ msgid "Point Speed Restriction Track"
+#~ msgstr "Voie de point de limitation de vitesse"
+
+#~ msgid "Point speed restriction: @1"
+#~ msgstr "Point de limitation de vitesse : @1"
+
+#~ msgid "Position is occupied by a train."
+#~ msgstr "Cet emplacement est occupé par un train."
+
+#~ msgid "Prev FC"
+#~ msgstr "Code de fret précédent"
+
+#~ msgid "Print advtrains status info"
+#~ msgstr "Affiche les informations d'état d'advtrains"
+
+#~ msgid "Re-enabling advtrains globalstep..."
+#~ msgstr "Réacivation du pas global d'advtrains..."
+
+#~ msgid "Reduced speed"
+#~ msgstr "Vitesse réduite"
+
+#~ msgid "Reload successful!"
+#~ msgstr "Succès du rechargement !"
+
+#~ msgid "Remote Routesetting"
+#~ msgstr "Routage à distance"
+
+#~ msgid "Removing unused wagon"
+#~ msgstr "Suppression d'un wagon inutilisé"
+
+#~ msgid "Restoring saved state in 1 second..."
+#~ msgstr "Restauration du l'état sauvegardé dans une seconde..."
+
+#~ msgid "Restricted speed"
+#~ msgstr "Vitesse limitée"
+
+#~ msgid "Returns the position of the train with the given id"
+#~ msgstr "Affiche la position du train identifié"
+
+#~ msgid "Reverse train"
+#~ msgstr "Inversion du sens de marche"
+
+#~ msgid "Right"
+#~ msgstr "Droit"
+
+#~ msgid "Route state changed."
+#~ msgstr "Changement d'état de l'itinéraire."
+
+#~ msgid "Routingcode"
+#~ msgstr "Code de routage"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "Sauvegarder les propriétés du wagon"
+
+#~ msgid "Saving failed: "
+#~ msgstr "Échec de sauvegarde : "
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Attelage Scharfenberg"
+
+#~ msgid "Select seat:"
+#~ msgstr "Choisir le siège :"
+
+#~ msgid "Set point speed restriction:"
+#~ msgstr "Placez un point de limitation de vitesse :"
+
+#~ msgid "Show Inventory"
+#~ msgstr "Montrer le stock"
+
+#~ msgid "Signal"
+#~ msgstr "Signal"
+
+#~ msgid "Speed:"
+#~ msgstr "Vitesse : "
+
+#~ msgid "Station Code"
+#~ msgstr "Code de Station"
+
+#~ msgid "Station Name"
+#~ msgstr "Nom de Station"
+
+#~ msgid "Station code \"@1\" already exists and is owned by @2."
+#~ msgstr "Le code de station \"@1\" existe et est possédé par @2."
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "Voie d'arrêt en station"
+
+#~ msgid "Steam Engine"
+#~ msgstr "Locomotive à vapeur"
+
+#~ msgid "Stop Time"
+#~ msgstr "Durée d'arrêt"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "Voiture de Métropolitain"
+
+# Routage est il le bon terme ?
+#~ msgid "Successfully invalidated train routes"
+#~ msgstr "Succès d'invalidation des routages des trains"
+
+#~ msgid "Target:"
+#~ msgstr "Destination : "
+
+#~ msgid "Teleporting to train "
+#~ msgstr "Téléportation au train "
+
+#~ msgid "Teleports you to the position of the train with the given id"
+#~ msgstr "Vous téléporte à la position du train identifié"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "Texte affiché à l'intérieur du train"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "Texte affiché à l'extérieur du train"
+
+#~ msgid "That player does not exist!"
+#~ msgstr "Ce joueur n'existe pas !"
+
+#~ msgid "That wagon does not exist!"
+#~ msgstr "Ce wagon n'a pas de siège !"
+
+#~ 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 !"
+
+#~ 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."
+
+#~ 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."
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "Le presse-papier est vide."
+
+#~ 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 !"
+
+#~ 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."
+
+#~ msgid "The wagon's inventory is not empty."
+#~ msgstr "Le stock de ce wagon n'est pas vide."
+
+#~ msgid "There's a Signal Influence Point here."
+#~ msgstr "Il y a un \"Signal Influence Point\" ici."
+
+#~ msgid "There's a Track Circuit Break here."
+#~ msgstr "Il y a un \"Track Circuit Break\" ici."
+
+#~ msgid "This Wagon ID"
+#~ msgstr "Identificateur du wagon"
+
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !"
+
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+
+#~ msgid "This position is protected!"
+#~ msgstr "Cet emplacement est protégé !"
+
+#~ 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."
+
+#~ msgid "This track can not be changed."
+#~ msgstr "Cette voie ne peut pas être modifiée."
+
+#~ msgid "This track can not be removed!"
+#~ msgstr "Cette voie ne peut pas être enlevée !"
+
+#~ msgid "This track can not be rotated!"
+#~ msgstr "Cette voie ne peut pas être tournée !"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "Ce wagon n'a pas de siège."
+
+#~ msgid "This wagon is full."
+#~ msgstr "Ce wagon est plein."
+
+#~ 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."
+
+#~ msgid "Track"
+#~ msgstr "Voie"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "Outil \"Trackworker\"\n"
+#~ "\n"
+#~ "Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n"
+#~ "\n"
+#~ "Clic-Droit : tourne l'objet"
+
+#~ msgid "Train"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train "
+#~ msgstr "Identificateur du train "
+
+#~ msgid "Train ID"
+#~ msgstr "Identificateur du train"
+
+#~ msgid "Train copied."
+#~ msgstr "Train copié."
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "Outil de copie/collage de train\n"
+#~ "\n"
+#~ "Clic-Gauche : copie\n"
+#~ "\n"
+#~ "Clic-Droit : collage"
+
+#~ 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."
+
+#~ msgid "Train overview /coupling control:"
+#~ msgstr "Aperçu du train / commande d'accouplement :"
+
+#~ msgid "Trains stopping here (ARS rules)"
+#~ msgstr "Trains marquant l'arrêt (règles ARS)"
+
+#~ msgid "Unable to load wagon type"
+#~ msgstr "Impossible de charger le type du wagon"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "Controlleur ATC, non-configuré"
+
+#~ msgid "Uninitialized init="
+#~ msgstr "Variable init non initialisée"
+
+#~ msgid "Uninitialized, removing"
+#~ msgstr "Non initialisé, retiré"
+
+#~ msgid "Unknown Station"
+#~ msgstr "Gare inconnue"
+
+#~ msgid "Unloading Track"
+#~ msgstr "Voie de Déchargement"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr ""
+#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les "
+#~ "portes closes !"
+
+#~ msgid "Wagon @1 ownership changed from @2 to @3"
+#~ msgstr "La propriété du wagon @1 a été transférée de @2 à @3"
+
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "Outil de propriété du wagon"
+
+#~ msgid ""
+#~ "Wagon Properties Tool\n"
+#~ "Punch a wagon to view and edit the Wagon Properties"
+#~ msgstr ""
+#~ "Outil de propriété du wagon\n"
+#~ "Frappez un wagon pour voir et modifier ses propriétés"
+
+#~ 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."
+
+#~ msgid "Wagon properties"
+#~ msgstr "Propriétés du wagon"
+
+#~ msgid "Wagon road number:"
+#~ msgstr "Immatriculation du wagon :"
+
+#~ msgid "Wait for signal to clear"
+#~ msgstr "En attente de signal d'autorisation"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "Signal mural (gauche)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "Signal mural (droit)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "Signal mural (plafond)"
+
+#~ 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."
+
+#~ msgid "Wheel"
+#~ msgstr "Roue"
+
+#~ msgid "Y-turnout"
+#~ msgstr "Embranchement en Y"
+
+#~ msgid "You are not allowed to access the driver stand."
+#~ msgstr "Accès interdit au poste de pilotage."
+
+#~ 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é."
+
+#~ 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\" (?)"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé."
+
+#~ 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\"."
+
+#~ 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."
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
+#~ 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\"."
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr ""
+#~ "Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
+#~ "\"railway_operator\" manquant)"
+
+#~ msgid "You can't get on this wagon."
+#~ msgstr "Montée impossible dans ce wagon."
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"@1\"."
+
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "Vous ne possédez pas le privilège \"train_operator\"."
+
+#~ msgid "You have been given ownership of wagon @1"
+#~ msgstr "La propriété du wagon @1 vous a été transférée"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr ""
+#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer "
+#~ "cet attelage."
+
+#~ msgid "from wagon_save table."
+#~ msgstr "de la table wagon_save."
+
+#~ 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 !"
+
+#~ msgid "slowdown"
+#~ msgstr "ralentissement"
diff --git a/advtrains_luaautomation/po/update-translations.sh b/advtrains_luaautomation/po/update-translations.sh
new file mode 100644
index 0000000..032e19e
--- /dev/null
+++ b/advtrains_luaautomation/po/update-translations.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+MODNAME="advtrains_luaautomation"
+MSGID_BUGS_ADDR='advtrains-discuss@lists.sr.ht'
+
+PODIR=`dirname "$0"`
+ATDIR="$PODIR/.."
+POTFILE="$PODIR/$MODNAME.pot"
+
+xgettext \
+ -D "$ATDIR" \
+ -d "$MODNAME" \
+ -o "$POTFILE" \
+ -p . \
+ -L lua \
+ --add-location=file \
+ --from-code=UTF-8 \
+ --sort-by-file \
+ --keyword='S' \
+ --package-name="$MODNAME" \
+ --msgid-bugs-address="$MSGID_BUGS_ADDR" \
+ `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \
+ &&
+for i in "$PODIR"/*.po; do
+ msgmerge -U \
+ --sort-by-file \
+ $i "$POTFILE"
+done
diff --git a/advtrains_luaautomation/po/zh_CN.po b/advtrains_luaautomation/po/zh_CN.po
new file mode 100644
index 0000000..e35e1c7
--- /dev/null
+++ b/advtrains_luaautomation/po/zh_CN.po
@@ -0,0 +1,644 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:03+0200\n"
+"PO-Revision-Date: 2023-10-09 11:24+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Simplified)\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: active_common.lua
+msgid "Clear Local Environment"
+msgstr ""
+
+#: active_common.lua
+msgid "Code"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC Environment"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component with error: @1"
+msgstr ""
+
+#: active_common.lua chatcmds.lua
+msgid "Save"
+msgstr "保存"
+
+#: active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 部件 (未配置)"
+
+#: active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#: atc_rail.lua
+#, fuzzy
+msgid "LuaATC Track"
+msgstr "装货轨道"
+
+#: chatcmds.lua
+msgid "Already subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Clear S"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Create an AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"Created environment '@1'. Use '/env_setup @2' to define global "
+"initialization code, or start building LuaATC components!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Delete Env."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment already exists!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment deleted!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment initialization code"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid environment name!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid name (only common characters)"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"List Advtrains LuaATC environments you are subscribed to (no parameters) or "
+"subscribers of an environment (giving an env name)."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Name required!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "No subscribers!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed to any!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Run Init Code"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just "
+"quit form to cancel."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Set up and modify AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribed to environment '@1'."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Successfully unsubscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Unubscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: init.lua
+msgid ""
+"Can place and configure LuaATC components, including execute potentially "
+"harmful Lua code"
+msgstr ""
+
+#: mesecon_controller.lua
+msgid "LuaATC Mesecon Controller"
+msgstr ""
+
+#: operation_panel.lua
+msgid "LuaATC Operation Panel"
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"Passive Component Naming Tool\n"
+"\n"
+"Right-click to name a passive component."
+msgstr ""
+"被动元件命名工具\n"
+"\n"
+"右键单击命名所选元件。"
+
+#: pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"You are not allowed to name LuaATC passive components without the @1 "
+"privilege."
+msgstr "您没有“@1”权限,不能命名被动元件。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(车门已关闭)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三开道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<没有车钩>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "较高的@1站台 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "较高的@1站台"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "较低的@1站台"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "较低的@1站台 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 语法错误:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 语法错误:“I”命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "频道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "铁路道口信号灯"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火车后部不在轨道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工业用火车头"
+
+#~ msgid "Boiler"
+#~ msgstr "锅炉"
+
+#~ msgid "Box Wagon"
+#~ msgstr "货运车厢"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "链式车钩"
+
+#~ msgid "Bumper"
+#~ msgstr "保险杠"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "无法上车:车门已关闭或车厢已满。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "无法放置斜坡:较高端没有支撑方块。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "无法放置斜坡:您没有选择任何方块。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "无法放置:此区域已被保护。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "无法放置斜坡:此区域已被占用。"
+
+#~ msgid "Chimney"
+#~ msgstr "烟囱"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (激活时)"
+
+#~ msgid "Default Seat"
+#~ msgstr "默认座位"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "默认座位 (司机座位)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "出发速度"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "请不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精细的蒸汽机车"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探测轨道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉轨道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 频道"
+
+#~ msgid "Door Delay"
+#~ msgstr "车门关闭时间"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "车门已关闭,请使用潜行+右键单击下车。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左侧司机座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右侧司机座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司机座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "驾驶室"
+
+#~ msgid "Get off"
+#~ msgstr "下车"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "强制下车"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工业用火车头"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液体运输车厢"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材运输车厢"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列车车头"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火车车钩"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列车车厢"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列车车厢"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂板信号机"
+
+#~ msgid "Line"
+#~ msgstr "火车线路"
+
+#~ msgid "Lock couples"
+#~ msgstr "锁定连接处"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您没有指向一个可以用火车复制工具复制的物体。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 为“@1”的列车不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 为“@1”的车厢不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能调整这段轨道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客车"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客车"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉轨道"
+
+#~ msgid "Reverse train"
+#~ msgstr "改变行车方向"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由码"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "保存车厢属性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式车钩"
+
+#~ msgid "Select seat:"
+#~ msgstr "请选择座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "显示物品栏"
+
+#~ msgid "Signal"
+#~ msgstr "信号灯"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Station Code"
+#~ msgstr "车站代码"
+
+#~ msgid "Station Name"
+#~ msgstr "车站名称"
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "车站轨道"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽机车"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站时间"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地铁车厢"
+
+#~ msgid "Target:"
+#~ msgstr "目标速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "车厢内部显示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "车厢外部显示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "无法复制:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "无法粘贴:剪贴板无法访问元数据。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪贴板是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "轨道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "轨道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "车厢已满。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具调整这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "这里已被保护。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能调整这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除这段轨道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋转这段轨道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "这节车厢没有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "车厢已满。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "这是 @1 的车厢,您不能摧毁它。"
+
+#~ msgid "Track"
+#~ msgstr "轨道"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "铁路调整工具\n"
+#~ "\n"
+#~ "左键单击:切换轨道类型\n"
+#~ "右键单击:旋转方块"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已复制列车。"
+
+#~ msgid "Train copied."
+#~ msgstr "已复制列车。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火车复制工具\n"
+#~ "\n"
+#~ "左键单击:复制\n"
+#~ "右键单击:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸货轨道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "请使用潜行+右键上车。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "车厢属性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁挂式信号灯 (左侧)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁挂式信号灯 (右侧)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "悬挂式信号灯"
+
+#~ 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 ""
+#~ "警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请"
+#~ "按潜行键并左键单击此车厢。"
+
+#~ msgid "Wheel"
+#~ msgstr "车轮"
+
+#~ msgid "Y-turnout"
+#~ msgstr "对称道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您没有“train_operator”权限,不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您没有“@1”权限,不能调整这段轨道。"
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "您不能调整这段轨道。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您没有“train_operator”权限,不能连接这两节车厢。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您没有“@1”权限。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。"
diff --git a/advtrains_luaautomation/po/zh_TW.po b/advtrains_luaautomation/po/zh_TW.po
new file mode 100644
index 0000000..866ccc5
--- /dev/null
+++ b/advtrains_luaautomation/po/zh_TW.po
@@ -0,0 +1,644 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: advtrains\n"
+"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
+"POT-Creation-Date: 2025-06-11 23:03+0200\n"
+"PO-Revision-Date: 2023-10-09 11:31+0200\n"
+"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
+"Language-Team: Chinese (Traditional)\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: active_common.lua
+msgid "Clear Local Environment"
+msgstr ""
+
+#: active_common.lua
+msgid "Code"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC Environment"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: active_common.lua
+msgid "LuaATC component with error: @1"
+msgstr ""
+
+#: active_common.lua chatcmds.lua
+msgid "Save"
+msgstr "儲存"
+
+#: active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 元件 (未配置)"
+
+#: active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#: atc_rail.lua
+#, fuzzy
+msgid "LuaATC Track"
+msgstr "裝貨軌道"
+
+#: chatcmds.lua
+msgid "Already subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Clear S"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Create an AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"Created environment '@1'. Use '/env_setup @2' to define global "
+"initialization code, or start building LuaATC components!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Delete Env."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment already exists!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment deleted!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Environment initialization code"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid environment name!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Invalid name (only common characters)"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"List Advtrains LuaATC environments you are subscribed to (no parameters) or "
+"subscribers of an environment (giving an env name)."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Name required!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "No subscribers!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed to any!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Not subscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Run Init Code"
+msgstr ""
+
+#: chatcmds.lua
+msgid ""
+"SURE TO DELETE ENVIRONMENT @1? Type YES (all uppercase) to continue or just "
+"quit form to cancel."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Set up and modify AdvTrains LuaAutomation environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Subscribed to environment '@1'."
+msgstr ""
+
+#: chatcmds.lua
+msgid "Successfully unsubscribed!"
+msgstr ""
+
+#: chatcmds.lua
+msgid "Unubscribe to the log of an Advtrains LuaATC environment"
+msgstr ""
+
+#: init.lua
+msgid ""
+"Can place and configure LuaATC components, including execute potentially "
+"harmful Lua code"
+msgstr ""
+
+#: mesecon_controller.lua
+msgid "LuaATC Mesecon Controller"
+msgstr ""
+
+#: operation_panel.lua
+msgid "LuaATC Operation Panel"
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"Passive Component Naming Tool\n"
+"\n"
+"Right-click to name a passive component."
+msgstr ""
+"被動元件命名工具\n"
+"\n"
+"右鍵單擊命名所選元件。"
+
+#: pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: pcnaming.lua
+msgid ""
+"You are not allowed to name LuaATC passive components without the @1 "
+"privilege."
+msgstr "您沒有「@1」許可權,不能命名這個元件。"
+
+#~ msgid "(Doors closed)"
+#~ msgstr "(車門已關閉)"
+
+#~ msgid "3-way turnout"
+#~ msgstr "三開道岔"
+
+#~ msgid "90+Angle Diamond Crossing Track"
+#~ msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
+
+#~ msgid "<No coupler>"
+#~ msgstr "<無連結器>"
+
+#~ msgid "@1 Platform (45 degree)"
+#~ msgstr "較高的@1月臺 (45°)"
+
+#~ msgid "@1 Platform (high)"
+#~ msgstr "較高的@1月臺"
+
+#~ msgid "@1 Platform (low)"
+#~ msgstr "較低的@1月臺"
+
+#~ msgid "@1 Platform (low, 45 degree)"
+#~ msgstr "較低的@1月臺 (45°)"
+
+#~ msgid "@1 Slope"
+#~ msgstr "@1斜坡"
+
+#~ msgid "ATC Kick command warning: doors are closed."
+#~ msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+
+#~ msgid "ATC Kick command warning: train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+
+#~ msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#~ msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+
+#~ msgid "ATC command parse error: Unknown command: @1"
+#~ msgstr "ATC 語法錯誤:未知命令:@1"
+
+#~ msgid "ATC command syntax error: I statement not closed: @1"
+#~ msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+
+#~ msgid "ATC controller"
+#~ msgstr "ATC 控制器"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Channel: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "頻道:@2"
+
+#~ msgid ""
+#~ "ATC controller, mode @1\n"
+#~ "Command: @2"
+#~ msgstr ""
+#~ "ATC 控制器\n"
+#~ "模式:@1\n"
+#~ "命令:@2"
+
+#~ msgid "Access to @1"
+#~ msgstr "可前往@1"
+
+#~ msgid "Andrew's Cross"
+#~ msgstr "平交道號誌燈"
+
+#~ msgid "Back of train would end up off track, cancelling."
+#~ msgstr "火車後部不在軌道上。"
+
+#~ msgid "Big Industrial Train Engine"
+#~ msgstr "大型工業用火車頭"
+
+#~ msgid "Boiler"
+#~ msgstr "鍋爐"
+
+#~ msgid "Box Wagon"
+#~ msgstr "貨運車廂"
+
+#~ msgid "Buffer and Chain Coupler"
+#~ msgstr "鏈式連結器"
+
+#~ msgid "Bumper"
+#~ msgstr "保險槓"
+
+#~ msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+#~ msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
+
+#~ msgid "Can't get on: wagon full or doors closed!"
+#~ msgstr "無法上車:車門已關閉或車廂已滿。"
+
+#, fuzzy
+#~ msgid "Can't place: Not enough slope items left (@1 required)"
+#~ msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
+
+#, fuzzy
+#~ msgid "Can't place: There's no slope of length @1"
+#~ msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
+
+#, fuzzy
+#~ msgid "Can't place: no supporting node at upper end."
+#~ msgstr "無法放置斜坡:較高階沒有支撐方塊。"
+
+#, fuzzy
+#~ msgid "Can't place: not pointing at node"
+#~ msgstr "無法放置斜坡:您沒有選擇任何方塊。"
+
+#~ msgid "Can't place: protected position!"
+#~ msgstr "無法放置:此區域已被保護。"
+
+#, fuzzy
+#~ msgid "Can't place: space occupied!"
+#~ msgstr "無法放置斜坡:此區域已被佔用。"
+
+#~ msgid "Chimney"
+#~ msgstr "煙囪"
+
+#~ msgid "Command"
+#~ msgstr "命令"
+
+#~ msgid "Command (on)"
+#~ msgstr "命令 (啟用時)"
+
+#~ msgid "Default Seat"
+#~ msgstr "預設座位"
+
+#~ msgid "Default Seat (driver stand)"
+#~ msgstr "預設座位 (司機座位)"
+
+#~ msgid "Dep. Speed"
+#~ msgstr "出發速度"
+
+#~ msgid "Deprecated Track"
+#~ msgstr "請不要使用"
+
+#~ msgid "Detailed Steam Engine"
+#~ msgstr "精細的蒸汽機車"
+
+#~ msgid "Detector Rail"
+#~ msgstr "探測軌道"
+
+#~ msgid "Diagonal Diamond Crossing Track"
+#~ msgstr "交叉軌道"
+
+#~ msgid "Digiline channel"
+#~ msgstr "Digiline 頻道"
+
+#~ msgid "Door Delay"
+#~ msgstr "車門關閉時間"
+
+#~ msgid ""
+#~ "Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+#~ "off."
+#~ msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
+
+#, fuzzy
+#~ msgid "Driver Stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver Stand (left)"
+#~ msgstr "左側司機座位"
+
+#~ msgid "Driver Stand (right)"
+#~ msgstr "右側司機座位"
+
+#~ msgid "Driver stand"
+#~ msgstr "司機座位"
+
+#~ msgid "Driver's cab"
+#~ msgstr "駕駛室"
+
+#~ msgid "Get off"
+#~ msgstr "下車"
+
+#~ msgid "Get off (forced)"
+#~ msgstr "強制下車"
+
+#~ msgid "Industrial Train Engine"
+#~ msgstr "工業用火車頭"
+
+#~ msgid "Industrial tank wagon"
+#~ msgstr "液體運輸車廂"
+
+#~ msgid "Industrial wood wagon"
+#~ msgstr "木材運輸車廂"
+
+#~ msgid "Japanese Train Engine"
+#~ msgstr "高速列車車頭"
+
+#~ msgid "Japanese Train Inter-Wagon Connection"
+#~ msgstr "日本火車連結器"
+
+#~ msgid "Japanese Train Wagon"
+#~ msgstr "高速列車車廂"
+
+#, fuzzy
+#~ msgid "Japanese signal pole"
+#~ msgstr "高速列車車廂"
+
+#~ msgid "Kick out passengers"
+#~ msgstr "踢出乘客"
+
+#~ msgid "Lampless Signal"
+#~ msgstr "臂木式號誌機"
+
+#~ msgid "Line"
+#~ msgstr "火車線路"
+
+#~ msgid "Lock couples"
+#~ msgstr "鎖定連結處"
+
+#~ msgid "No such lua entity."
+#~ msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
+
+#~ msgid "No such train: @1."
+#~ msgstr "ID 為「@1」的列車不存在。"
+
+#~ msgid "No such wagon: @1."
+#~ msgstr "ID 為「@1」的車廂不存在。"
+
+#, fuzzy
+#~ msgid "Not allowed to do this."
+#~ msgstr "您不能調整這段軌道。"
+
+#~ msgid "Passenger Wagon"
+#~ msgstr "客車"
+
+#, fuzzy
+#~ msgid "Passenger area"
+#~ msgstr "客車"
+
+#~ msgid "Perpendicular Diamond Crossing Track"
+#~ msgstr "垂直交叉軌道"
+
+#~ msgid "Reverse train"
+#~ msgstr "改變行車方向"
+
+#~ msgid "Routingcode"
+#~ msgstr "路由碼"
+
+#~ msgid "Save wagon properties"
+#~ msgstr "儲存車廂屬性"
+
+#~ msgid "Scharfenberg Coupler"
+#~ msgstr "Scharfenberg 式連結器"
+
+#~ msgid "Select seat:"
+#~ msgstr "請選擇座位:"
+
+#~ msgid "Show Inventory"
+#~ msgstr "顯示物品欄"
+
+#~ msgid "Signal"
+#~ msgstr "色燈號誌機"
+
+#~ msgid "Speed:"
+#~ msgstr "速度"
+
+#~ msgid "Station Code"
+#~ msgstr "車站碼"
+
+#~ msgid "Station Name"
+#~ msgstr "車站名稱"
+
+#~ msgid "Station/Stop Track"
+#~ msgstr "車站軌道"
+
+#~ msgid "Steam Engine"
+#~ msgstr "蒸汽機車"
+
+#~ msgid "Stop Time"
+#~ msgstr "停站時間"
+
+#~ msgid "Subway Passenger Wagon"
+#~ msgstr "地鐵車廂"
+
+#~ msgid "Target:"
+#~ msgstr "目標速度"
+
+#~ msgid "Text displayed inside train"
+#~ msgstr "車廂內部顯示"
+
+#~ msgid "Text displayed outside on train"
+#~ msgstr "車廂外部顯示"
+
+#, fuzzy
+#~ msgid "That wagon does not exist!"
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "The clipboard couldn't access the metadata. Copy failed."
+#~ msgstr "無法複製:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard couldn't access the metadata. Paste failed."
+#~ msgstr "無法貼上:剪貼簿無法訪問元資料。"
+
+#~ msgid "The clipboard is empty."
+#~ msgstr "剪貼簿是空的。"
+
+#, fuzzy
+#~ msgid "The track you are trying to place the wagon on is not long enough!"
+#~ msgstr "軌道太短。"
+
+#~ msgid "The track you are trying to place the wagon on is not long enough."
+#~ msgstr "軌道太短。"
+
+#, fuzzy
+#~ msgid "This Wagon ID"
+#~ msgstr "車廂已滿。"
+
+#, fuzzy
+#~ msgid "This node can't be changed using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具調整這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker!"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#, fuzzy
+#~ msgid "This node can't be rotated using the trackworker,"
+#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#~ msgid "This position is protected!"
+#~ msgstr "這裡已被保護。"
+
+#~ msgid "This track can not be changed."
+#~ msgstr "您不能調整這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be removed!"
+#~ msgstr "您不能移除這段軌道。"
+
+#, fuzzy
+#~ msgid "This track can not be rotated!"
+#~ msgstr "您不能旋轉這段軌道。"
+
+#~ msgid "This wagon has no seats."
+#~ msgstr "這節車廂沒有座位。"
+
+#~ msgid "This wagon is full."
+#~ msgstr "車廂已滿。"
+
+#~ msgid "This wagon is owned by @1, you can't destroy it."
+#~ msgstr "這是 @1 的車廂,您不能摧毀它。"
+
+#~ msgid "Track"
+#~ msgstr "軌道"
+
+#~ msgid ""
+#~ "Track Worker Tool\n"
+#~ "\n"
+#~ "Left-click: change rail type (straight/curve/switch)\n"
+#~ "Right-click: rotate object"
+#~ msgstr ""
+#~ "鐵路調整工具\n"
+#~ "\n"
+#~ "左鍵單擊:切換軌道型別\n"
+#~ "右鍵單擊:旋轉方塊"
+
+#, fuzzy
+#~ msgid "Train "
+#~ msgstr "已複製火車。"
+
+#~ msgid "Train copied."
+#~ msgstr "已複製火車。"
+
+#~ msgid ""
+#~ "Train copy/paste tool\n"
+#~ "\n"
+#~ "Left-click: copy train\n"
+#~ "Right-click: paste train"
+#~ msgstr ""
+#~ "火車複製工具\n"
+#~ "\n"
+#~ "左鍵單擊:複製\n"
+#~ "右鍵單擊:粘帖"
+
+#~ msgid "Unconfigured ATC controller"
+#~ msgstr "ATC 控制器 (未配置)"
+
+#~ msgid "Unloading Track"
+#~ msgstr "卸貨軌道"
+
+#~ msgid "Use Sneak+rightclick to bypass closed doors!"
+#~ msgstr "請使用潛行+右鍵上車。"
+
+#, fuzzy
+#~ msgid "Wagon Properties Tool"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wagon properties"
+#~ msgstr "車廂屬性"
+
+#~ msgid "Wallmounted Signal (left)"
+#~ msgstr "壁掛式色燈號誌機 (左側)"
+
+#~ msgid "Wallmounted Signal (right)"
+#~ msgstr "壁掛式色燈號誌機 (右側)"
+
+#~ msgid "Wallmounted Signal (top)"
+#~ msgstr "懸掛式色燈號誌機"
+
+#~ 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 ""
+#~ "警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請"
+#~ "按潛行鍵並左鍵單擊此車廂。"
+
+#~ msgid "Wheel"
+#~ msgstr "車輪"
+
+#~ msgid "Y-turnout"
+#~ msgstr "對稱道岔"
+
+#~ msgid "You are not allowed to build near tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
+
+#~ msgid ""
+#~ "You are not allowed to build near tracks without the track_builder "
+#~ "privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
+
+#~ msgid "You are not allowed to build tracks at this protected position."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to build tracks without the track_builder privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to configure this track without the @1 privilege."
+#~ msgstr "您沒有「@1」許可權,不能調整這段軌道。"
+
+#~ msgid "You are not allowed to configure this track."
+#~ msgstr "您不能調整這段軌道。"
+
+#~ msgid ""
+#~ "You are not allowed to couple trains without the train_operator privilege."
+#~ msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。"
+
+#, fuzzy
+#~ msgid "You are not allowed to modify this protected track."
+#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#~ msgid ""
+#~ "You are not allowed to operate turnouts and signals without the "
+#~ "railway_operator privilege."
+#~ msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
+
+#~ msgid "You do not have the @1 privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#, fuzzy
+#~ msgid "You don't have the train_operator privilege."
+#~ msgstr "您沒有「@1」許可權。"
+
+#~ msgid ""
+#~ "You need to own at least one neighboring wagon to destroy this couple."
+#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。"
diff --git a/advtrains_signals_japan/init.lua b/advtrains_signals_japan/init.lua
index 728a91f..914a139 100644
--- a/advtrains_signals_japan/init.lua
+++ b/advtrains_signals_japan/init.lua
@@ -260,7 +260,8 @@ do
end
end
-local S = attrans
+-- ask engine for translator instance, this will load the translation files
+local S = core.get_translator("advtrains_signals_japan")
minetest.register_node("advtrains_signals_japan:pole_0", {
description = S("Japanese signal pole"),
@@ -398,7 +399,7 @@ for _, rtab in ipairs {
local lightcount = siginfo.lightcount
for asp, texture in pairs(siginfo.textures) do
minetest.register_node("advtrains_signals_japan:"..sigtype.."_"..asp.."_"..rot, {
- description = attrans(string.format("Japanese%s signal (type %s)", siginfo.isdst and " repeating" or "", siginfo.desc)),
+ description = S(string.format("Japanese%s signal (type %s)", siginfo.isdst and " repeating" or "", siginfo.desc)),
drawtype = "mesh",
mesh = string.format("advtrains_signals_japan_%d_%s.obj", lightcount, rot),
tiles = {pole_texture, signal_face_texture, texture},
diff --git a/advtrains_signals_ks/init.lua b/advtrains_signals_ks/init.lua
index 97d5e44..3b4bebb 100644
--- a/advtrains_signals_ks/init.lua
+++ b/advtrains_signals_ks/init.lua
@@ -1,6 +1,9 @@
-- Ks signals
-- Can display main aspects (no Zs) + Sht
+-- ask engine for translator instance, this will load the translation files
+local S = core.get_translator("advtrains_signals_ks")
+
-- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities"
-- advtrains_signal=1 is meant for signals that do not implement set_aspect.
@@ -86,38 +89,38 @@ end
local mainaspects_main = {
{
name = "proceed",
- description = "Proceed",
+ description = S("Proceed"),
zs3 = "off"
},
{
name = "shunt",
- description = "Shunt",
+ description = S("Shunt"),
zs3 = "off",
shunt = true,
},
{
name = "proceed_16",
- description = "Proceed (speed 16)",
+ description = S("Proceed (speed 16)"),
zs3 = "16",
},
{
name = "proceed_12",
- description = "Proceed (speed 12)",
+ description = S("Proceed (speed 12)"),
zs3 = "12",
},
{
name = "proceed_8",
- description = "Proceed (speed 8)",
+ description = S("Proceed (speed 8)"),
zs3 = "8",
},
{
name = "proceed_6",
- description = "Proceed (speed 6)",
+ description = S("Proceed (speed 6)"),
zs3 = "6",
},
{
name = "proceed_4",
- description = "Proceed (speed 4)",
+ description = S("Proceed (speed 4)"),
zs3 = "4",
},
}
@@ -151,7 +154,7 @@ end
local mainaspects_dst = {
{
name = "expectclear",
- description = "Expect Clear",
+ description = S("Expect Clear"),
},
}
@@ -173,7 +176,7 @@ end
local mainaspects_ra = {
{
name = "shunt",
- description = "Shunt",
+ description = S("Shunt"),
shunt = true,
},
}
@@ -226,7 +229,7 @@ for _, rtab in ipairs({
}
end
minetest.register_node("advtrains_signals_ks:hs_"..typ.."_"..rot, {
- description = "Ks Main Signal",
+ description = S("Ks Main Signal"),
drawtype = "mesh",
mesh = "advtrains_signals_ks_main_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", tile},
@@ -298,7 +301,7 @@ for _, rtab in ipairs({
}
end
minetest.register_node("advtrains_signals_ks:vs_"..typ.."_"..rot, {
- description = "Ks Distant Signal",
+ description = S("Ks Distant Signal"),
drawtype = "mesh",
mesh = "advtrains_signals_ks_distant_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", tile},
@@ -350,7 +353,7 @@ for _, rtab in ipairs({
afunc = function() return prts.asp end
end
minetest.register_node("advtrains_signals_ks:ra_"..typ.."_"..rot, {
- description = "Ks Shunting Signal",
+ description = S("Ks Shunting Signal"),
drawtype = "mesh",
mesh = "advtrains_signals_ks_sht_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_ltm_"..typ..".png"},
@@ -465,7 +468,7 @@ for _, rtab in ipairs({
if typ == "e" then
tile2 = "advtrains_signals_ks_sign_zs10.png"
end
- register_sign("sign", typ, prts.n, "Permanent local speed restriction sign", "sign"..mesh, tile2, "8", "advtrains_signals_ks_sign_8.png^[invert:rgb", prts.asp)
+ register_sign("sign", typ, prts.n, S("Permanent local speed restriction sign"), "sign"..mesh, tile2, "8", "advtrains_signals_ks_sign_8.png^[invert:rgb", prts.asp)
end
for typ, prts in pairs {
@@ -478,7 +481,7 @@ for _, rtab in ipairs({
} do
local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)^[multiply:orange"
local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)^[multiply:orange"
- register_sign("sign_lf", typ, prts.n, "Temporary local speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "temp"})
+ register_sign("sign_lf", typ, prts.n, S("Temporary local speed restriction sign"), "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "temp"})
end
for typ, prts in pairs {
@@ -491,7 +494,7 @@ for _, rtab in ipairs({
} do
local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)"
local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)"
- register_sign("sign_lf7", typ, prts.n, "Line speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "line"})
+ register_sign("sign_lf7", typ, prts.n, S("Line speed restriction sign"), "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "line"})
end
-- Geschwindigkeits(vor)anzeiger für Ks-Signale
@@ -525,7 +528,7 @@ for _, rtab in ipairs({
-- Zs 3
local t = table.copy(def)
- t.description = "Ks speed limit indicator"
+ t.description = S("Ks speed limit indicator")
t.mesh = "advtrains_signals_ks_zs_top_smr"..rot..".obj"
t.drop = "advtrains_signals_ks:zs3_off_0"
t.selection_box.fixed[1][5] = 0
@@ -538,7 +541,7 @@ for _, rtab in ipairs({
-- Zs 3v
local t = table.copy(def)
- t.description = "Ks distant speed limit indicator"
+ t.description = S("Ks distant speed limit indicator")
t.mesh = "advtrains_signals_ks_zs_bottom_smr"..rot..".obj"
t.drop = "advtrains_signals_ks:zs3v_off_0"
t.tiles[3] = t.tiles[3] .. "^[multiply:yellow"
@@ -551,7 +554,7 @@ for _, rtab in ipairs({
end
minetest.register_node("advtrains_signals_ks:mast_mast_"..rot, {
- description = "Ks Mast",
+ description = S("Ks Mast"),
drawtype = "mesh",
mesh = "advtrains_signals_ks_mast_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_mast.png"},
@@ -663,4 +666,4 @@ minetest.register_craft{ -- Line Speed Restriction Sign
minetest.register_craft{ -- Permanent Local Speed Restriction Sign
output = "advtrains_signals_ks:sign_8_0",
recipe = {{"advtrains_signals_ks:sign_lf7_8_0"}}
-} \ No newline at end of file
+}
diff --git a/advtrains_signals_muc_ubahn/init.lua b/advtrains_signals_muc_ubahn/init.lua
index a8eb445..49642ef 100644
--- a/advtrains_signals_muc_ubahn/init.lua
+++ b/advtrains_signals_muc_ubahn/init.lua
@@ -6,6 +6,9 @@
-- Hp4 and Hp5 are not implemented because they do not make sense.
-- Also the speed signals are not yet added (they will be added later)
+-- ask engine for translator instance, this will load the translation files
+local S = core.get_translator("advtrains_signals_muc_ubahn")
+
local all_sigs = {
hp0 = { asp = { main = 0 }, crea = true }, -- halt
hp1 = { asp = { main = -1, proceed_as_main = true } }, -- free full speed
@@ -16,9 +19,9 @@ local all_sigs = {
}
local mainaspects = {
- { name = "hp1", description = "Hp1: Full speed" },
- { name = "hp2", description = "Hp2: Reduced Speed" },
- { name = "hp3", description = "Hp3: Shunt" },
+ { name = "hp1", description = S("Hp1: Full speed") },
+ { name = "hp2", description = S("Hp2: Reduced Speed") },
+ { name = "hp3", description = S("Hp3: Shunt") },
}
local dstaspects = {
{ name = "vr1", description = "Vr1: Expect Full speed" },
@@ -62,7 +65,7 @@ for r,f in pairs(all_sigs) do
mesh = "advtrains_signals_muc_ubahn_wsig_"..loc..".obj",
tiles = {"advtrains_signals_muc_ubahn_"..r..".png"},
drop = f.distant and "advtrains_signals_muc_ubahn:signal_wall_"..loc.."_vr0" or "advtrains_signals_muc_ubahn:signal_wall_"..loc.."_hp0",
- description = f.distant and attrans("Munich U-Bahn Distant Signal ("..loc..")") or attrans("Munich U-Bahn Main Signal ("..loc..")"),
+ description = f.distant and S("Munich U-Bahn Distant Signal ("..loc..")") or S("Munich U-Bahn Main Signal ("..loc..")"),
groups = {
cracky=3,
not_blocking_trains=1,
@@ -113,4 +116,4 @@ for this,nxt in pairs({l = "t", t = "r",r = "l"}) do --Circular crafting for wal
type = "shapeless",
recipe = {"advtrains_signals_muc_ubahn:signal_wall_"..this.."_vr0"},
})
-end \ No newline at end of file
+end
diff --git a/advtrains_train_track/init.lua b/advtrains_train_track/init.lua
index 35937bc..c7bcb80 100644
--- a/advtrains_train_track/init.lua
+++ b/advtrains_train_track/init.lua
@@ -1,6 +1,11 @@
-- Default tracks for advtrains
-- (c) orwell96 and contributors
+-- Initialize internationalization (using ywang's poconvert)
+advtrains.poconvert.from_flat("advtrains_train_track")
+-- ask engine for translator instance, this will load the translation files
+local S = core.get_translator("advtrains_train_track")
+
local default_boxen = {
["st"] = {
[""] = {
@@ -184,7 +189,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Track"),
+ description=S("Track"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
@@ -265,7 +270,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack_sy",
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Y-turnout"),
+ description=S("Y-turnout"),
formats = {},
get_additional_definiton = y3_turnouts_addef,
}, advtrains.ap.t_yturnout)
@@ -284,7 +289,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack_s3",
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("3-way turnout"),
+ description=S("3-way turnout"),
formats = {},
get_additional_definiton = y3_turnouts_addef,
}, advtrains.ap.t_s3way)
@@ -334,7 +339,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack_xing",
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Perpendicular Diamond Crossing Track"),
+ description=S("Perpendicular Diamond Crossing Track"),
formats = {},
get_additional_definiton = function(def, preset, suffix, rotation)
return perp_boxen[rotation] or {}
@@ -426,7 +431,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack_xing90plusx",
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("90+Angle Diamond Crossing Track"),
+ description=S("90+Angle Diamond Crossing Track"),
formats = {},
get_additional_definiton = function(def, preset, suffix, rotation)
return ninety_plus_boxen[suffix] or {}
@@ -548,7 +553,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack_xingdiag",
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Diagonal Diamond Crossing Track"),
+ description=S("Diagonal Diamond Crossing Track"),
formats = {},
get_additional_definiton = function(def, preset, suffix, rotation)
return diagonal_boxen[suffix] or {}
@@ -575,7 +580,7 @@ advtrains.register_tracks("default", {
models_suffix=".obj",
shared_texture="advtrains_dtrack_shared.png",
second_texture="default_gravel.png",
- description=attrans("Track"),
+ description=S("Track"),
formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}},
}, advtrains.ap.t_30deg_slope)
@@ -598,7 +603,7 @@ advtrains.register_tracks("default", {
models_suffix=".b3d",
shared_texture="advtrains_dtrack_rail.png",
--bumpers still use the old texture until the models are redone.
- description=attrans("Bumper"),
+ description=S("Bumper"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
-- 2024-11-25: Bumpers get the additional feature of being both a signal and a self-contained TCB, when interlocking is used.
@@ -649,7 +654,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_atc.png",
- description=attrans("ATC controller"),
+ description=S("ATC controller"),
formats={},
get_additional_definiton = advtrains.atc_function
}, advtrains.trackpresets.t_30deg_straightonly)
@@ -827,7 +832,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_unload.png",
- description=attrans("Unloading Track"),
+ description=S("Unloading Track"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
return {
@@ -859,7 +864,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_load.png",
- description=attrans("Loading Track"),
+ description=S("Loading Track"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
return {
@@ -929,7 +934,7 @@ if mesecon then
models_prefix="advtrains_dtrack",
models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_detector_off.png",
- description=attrans("Detector Rail"),
+ description=S("Detector Rail"),
formats={},
get_additional_definiton = function(def, preset, suffix, rotation)
return {