diff options
Diffstat (limited to 'advtrains_luaautomation')
29 files changed, 3934 insertions, 87 deletions
diff --git a/advtrains_luaautomation/README.md b/advtrains_luaautomation/README.md index 683e45c..275653c 100644 --- a/advtrains_luaautomation/README.md +++ b/advtrains_luaautomation/README.md @@ -93,6 +93,9 @@ Removes any pending interrupts of this node. Make this active component send a digiline message on the specified channel. Not available in init code. + - `trainparts(train_id)` + returns a table with the ids of the cars the train is composed of, or false if `train_id` is invalid. `train_id` can be replaced with `atc_id` when used in LuaATC Rails. + - `atc_send_to_train(<train_id>, <atc_command>)` Sends the specified ATC command to the train specified by its train id. This happens regardless of where the train is in the world, and can be used to remote-control trains. Returns true on success. If the train ID does not exist, returns false and does nothing. See [atc_command.txt](../atc_command.txt) for the ATC command syntax. @@ -142,22 +145,16 @@ asp = { -- the character of call_on and dead_end is purely informative call_on = <boolean>, -- Call-on route, expect train in track ahead (not implemented yet) dead_end = <boolean>, -- Route ends on a dead end (e.g. bumper) (not implemented yet) - - w_speed = <integer>, - -- "Warning speed restriction". Supposed for short-term speed - -- restrictions which always override any other restrictions - -- imposed by "speed" fields, until lifted by a value of -1 - -- (Example: german Langsamfahrstellen-Signale) } ``` -As of January 2020, the 'dst', 'call_on' and 'dead_end' fields are not used. +As of September 2024, the 'dst', 'call_on' and 'dead_end' fields are not used. #### Lines The advtrains_line_automation component adds a few contraptions that should make creating timeable systems easier. Part of its functionality is also available in LuaATC: -- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:lines:rwt) +- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:api:railway_time_api) - `schedule(rw_time, msg)`, `schedule_in(rw_dtime, msg)` Schedules an event of type {type="schedule", schedule=true, msg=msg} at (resp. after) the specified railway time (which can be in any format). You can only schedule one event this way. (uses the new lines-internal scheduler) @@ -255,15 +252,39 @@ In addition to the above environment functions, the following functions are avai The interlocking system uses this property for Automatic Routesetting. #### Shunting Functions and Variables -There are several functions available especially for shunting operations. Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive: +There are several functions available especially for shunting operations. +Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive. +FCs are composed of codes separated by exclamation marks (`!`), for instance `"foo!bar!baz"`. +Each wagon has a current FC, indicating its next destination. - `split_at_index(index, atc_command)` Splits the train at the specified index, into a train with index-1 wagons and a second train starting with the index-th wagon. The `atc_command` specified is sent to the second train after decoupling. `"S0"` or `"B0"` is common to ensure any locomotives in the remaining train don't continue to move. + `index` must be more than 1 to avoid trying to decouple the very front of a train. + Example: train has wagons `"foo","foo","foo","bar","bar","bar"` Command: `split_at_index(4,"S0")` Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"` + - `get_fc()` + Returns a table with the entire FC list for each wagon in the train. + Command: `get_fc()` + Result: `{"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"}` + + - `get_fc_index()` + Returns a table with the current FC index for each wagon in the train. Use in conjunction with the result from `get_fc()` to find a the current FC for a wagon. + Command: `get_fc_index()` + Result: `{1, 1, 1, 2, 1}` + + - `set_fc(fc_list, reset_index)` + Overwrites the FC list according to a table `fc_list`. A false or nil entry will leave the wagon unaffected, however all others will be overwritten. + Useful for mass-programming freight trains that use FC-shunting instead of walking to each wagon individually. If the new FC entry for a wagon is shorter than the old entry, the index will clip to the last FC in the new entry. + If `reset_index` is true, all Current FC values will reset to the first entry in the list, instead of remaining at the current index. + + Example: train has FC lists: `"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"` + Command: `set_fc({"", "foo!turtle", nil, "4tehlulz", false})` + Result: `""` `"foo!turtle"` `"testing"` `"4tehlulz"` `"hello_world"` + - `split_at_fc(atc_command, len)` Splits the train in such a way that all cars with non-empty current FC of the first part of the train have the same FC. The `atc_command` specified is sent to the rear part, as with split_at_index. It returns the fc of the cars of the first part. @@ -287,15 +308,11 @@ There are several functions available especially for shunting operations. Some o first part of the train as above. - `step_fc()` - Steps the FCs of all train cars forward. FCs are composed of codes - separated by exclamation marks (`!`), for instance - `"foo!bar!baz"`. Each wagon has a current FC, indicating its next - destination. Stepping the freight code forward, selects the next - code after the !. If the end of the string is reached, then the + Steps the FCs of all train cars forward, selecting the next + code after the `!`. If the end of the string is reached, then the first code is selected, except if the string ends with a question mark (`?`), then the order is reversed. - - `train_length()` returns the number of cars the train is composed of. @@ -312,13 +329,16 @@ Deprecated: #### Interlocking -This additional function is available when advtrains_interlocking is enabled: +These additional functions are available when advtrains_interlocking is enabled: - - `atc_set_disable_ars(boolean)` + - `atc_set_ars_disable(boolean)` Disables (true) or enables (false) the use of ARS for this train. The train will not trigger ARS (automatic route setting) on signals then. - Note: If you want to disable ARS from an approach callback, the call to `atc_set_disable_ars(true)` *must* happen during the approach callback, and may not be deferred to an interrupt(). Else the train might trigger an ARS before the interrupt fires. + Note: If you want to disable ARS from an approach callback, the call to `atc_set_ars_disable(true)` *must* happen during the approach callback, and may not be deferred to an interrupt(). Else the train might trigger an ARS before the interrupt fires. + - `section_occupancy(section_id)` + Returns a table of train ids for the specified section, nil if no section id is provided, false if the section id is invalid, an empty table if the section id is valid but empty of trains. + #### Approach callbacks The LuaATC interface provides a way to hook into the approach callback system, which is for example used in the TSR rails (provided by advtrains_interlocking) or the station tracks (provided by advtrains_lines). However, for compatibility reasons, this behavior needs to be explicitly enabled. diff --git a/advtrains_luaautomation/active_common.lua b/advtrains_luaautomation/active_common.lua index 9bf8377..d0ae2a4 100644 --- a/advtrains_luaautomation/active_common.lua +++ b/advtrains_luaautomation/active_common.lua @@ -1,4 +1,5 @@ - +-- Get current translator +local S = atlatc.translate local ac = {nodes={}} @@ -14,7 +15,7 @@ end function ac.after_place_node(pos, player) local meta=minetest.get_meta(pos) meta:set_string("formspec", ac.getform(pos, meta)) - meta:set_string("infotext", "LuaAutomation component, unconfigured.") + meta:set_string("infotext", S("Unconfigured LuaATC component")) local ph=minetest.pos_to_string(pos) --just get first available key! for en,_ in pairs(atlatc.envs) do @@ -43,25 +44,29 @@ function ac.getform(pos, meta_p) end local form = "size["..atlatc.CODE_FORM_SIZE.."]" .."style[code;font=mono]" - .."label[0,-0.1;Environment]" + .."label[0,-0.1;"..S("LuaATC Environment").."]" .."dropdown[0,0.3;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" - .."button[5,0.2;2,1;save;Save]" - .."button[7,0.2;3,1;cle;Clear Local Env.]" - .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Code;"..minetest.formspec_escape(code).."]" - .."label[0,9.7;"..err.."]" + .."button[5,0.2;2,1;save;"..S("Save").."]" + .."button[7,0.2;3,1;cle;"..S("Clear Local Environment").."]" + .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;"..S("Code")..";"..minetest.formspec_escape(code).."]" + .."label["..atlatc.CODE_FORM_ERRLABELPOS..";"..err.."]" return form end function ac.after_dig_node(pos, node, player) advtrains.invalidate_all_paths(pos) advtrains.ndb.clear(pos) + atlatc.interrupt.clear_ints_at_pos(pos) + if advtrains.lines and advtrains.lines.sched then + advtrains.lines.sched.discard_all(advtrains.encode_pos(pos)) + end local ph=minetest.pos_to_string(pos) ac.nodes[ph]=nil end function ac.on_receive_fields(pos, formname, fields, player) if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then - minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") + minetest.chat_send_player(player:get_player_name(), S("You are not allowed to configure this LuaATC component without the @1 privilege.", "atlatc")) return end @@ -91,17 +96,17 @@ function ac.on_receive_fields(pos, formname, fields, player) meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then - meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'") + meta:set_string("infotext", S("LuaATC component assigned to environment '@1'", nodetbl.env)) else - meta:set_string("infotext", "LuaAutomation component, invalid enviroment set!") + meta:set_string("infotext", S("LuaATC component assigned to an invalid environment")) end end -function ac.run_in_env(pos, evtdata, customfct_p) +function ac.run_in_env(pos, evtdata, customfct_p, ignore_no_code) local ph=minetest.pos_to_string(pos) local nodetbl = ac.nodes[ph] if not nodetbl then - atwarn("LuaAutomation component at",ph,": Data not in memory! Please visit component and click 'Save'!") + atwarn("LuaATC component at",ph,": Data not in memory! Please visit component and click 'Save'!") return end @@ -111,12 +116,14 @@ function ac.run_in_env(pos, evtdata, customfct_p) end if not nodetbl.env or not atlatc.envs[nodetbl.env] then - atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>")) + atwarn("LuaATC component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>")) return false end local env = atlatc.envs[nodetbl.env] if not nodetbl.code or nodetbl.code=="" then - env:log("warning", "LuaAutomation component at",ph,": No code to run! (insert -- to suppress warning)") + if not ignore_no_code then + env:log("warning", "LuaATC component at",ph,": No code to run! (insert -- to suppress warning)") + end return false end @@ -166,7 +173,7 @@ function ac.run_in_env(pos, evtdata, customfct_p) atlatc.active.nodes[ph].err=dataout env:log("error", "LuaATC component at",ph,": LUA Error:",dataout) if meta then - meta:set_string("infotext", "LuaATC component, ERROR:"..dataout) + meta:set_string("infotext", S("LuaATC component with error: @1", dataout)) end --TODO temporary --if customfct.atc_id then diff --git a/advtrains_luaautomation/atc_rail.lua b/advtrains_luaautomation/atc_rail.lua index b862129..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={} @@ -14,7 +17,7 @@ function r.fire_event(pos, evtdata, appr_internal) local railtbl = atlatc.active.nodes[ph] if not railtbl then - atwarn("LuaAutomation ATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!") + atwarn("LuaATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!") return end @@ -56,13 +59,13 @@ function r.fire_event(pos, evtdata, appr_internal) split_at_index = function(index, cmd) if not train_id then return false end assertt(cmd, "string") - if type(index) ~= "number" then + if type(index) ~= "number" or index < 2 then return false end local new_id = advtrains.split_train_at_index(train, index) if new_id then minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow) - return true + return new_id end return false end, @@ -73,7 +76,7 @@ function r.fire_event(pos, evtdata, appr_internal) if new_id then minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow) end - return fc or "" + return (fc or ""), new_id end, split_off_locomotive = function(cmd, len) assertt(cmd, "string") @@ -81,7 +84,8 @@ function r.fire_event(pos, evtdata, appr_internal) local new_id, fc = advtrains.split_train_at_fc(train, true, len) if new_id then minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow) - end + end + return (fc or ""), new_id end, train_length = function () if not train_id then return false end @@ -91,6 +95,47 @@ function r.fire_event(pos, evtdata, appr_internal) if not train_id then return false end advtrains.train_step_fc(train) end, + get_fc = function() + if not train_id then return end + local fc_list = {} + for index,wagon_id in ipairs(train.trainparts) do + fc_list[index] = table.concat(advtrains.wagons[wagon_id].fc or {},"!") + end + return fc_list + end, + get_fc_index = function() + if not train_id then return end + local fc_index_list = {} + for widx, wagon_id in ipars(train.trainparts) do + fc_index_list[widx] = advtrains.wagons[wagon_id].fcind or 1 + end + return fc_index_list + end, + set_fc = function(fc_list,reset_index) + assertt(fc_list, "table") + if not train_id then return false end + -- safety type-check for entered values + for _,v in ipairs(fc_list) do + if v and type(v) ~= "string" then + error("FC entries must be a string") + return + end + end + for index,wagon_id in ipairs(train.trainparts) do + if fc_list[index] then -- has FC to enter to this wagon + local data = advtrains.wagons[wagon_id] + if data then -- wagon actually exists + --effectively copyied from wagons.lua, allowing for the :split function and reset_index + data.fc = fc_list[index]:split("!") + if reset_index or not data.fcind then + data.fcind = 1 + elseif data.fcind > #data.fc then + data.fcind = #data.fc + end + end + end + end + end, set_shunt = function() -- enable shunting mode if not train_id then return false end @@ -130,9 +175,8 @@ function r.fire_event(pos, evtdata, appr_internal) get_rc = function() return train.routingcode end, - atc_reset = function(cmd) + atc_reset = function() if not train_id then return false end - assertt(cmd, "string") advtrains.atc.train_reset_command(train) return true end, @@ -188,7 +232,7 @@ advtrains.register_tracks("default", { models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_atc.png", - description=atltrans("LuaAutomation ATC Rail"), + 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/environment.lua b/advtrains_luaautomation/environment.lua index 63aa68d..a6ed2c7 100644 --- a/advtrains_luaautomation/environment.lua +++ b/advtrains_luaautomation/environment.lua @@ -150,9 +150,15 @@ local static_env = { --interrupts are handled per node, position unknown. (same goes for digilines) --however external interrupts can be set here. interrupt_pos = function(parpos, imesg) - local pos=atlatc.pcnaming.resolve_pos(parpos) + local pos=atlatc.pcnaming.resolve_pos(parpos, "interrupt_pos") atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg}) end, + train_parts = function(train_id) + if not train_id then return false end + local train = advtrains.trains[train_id] + if not train then return false end + return table.copy(train.trainparts or {}) + end, -- sends an atc command to train regardless of where it is in the world atc_send_to_train = function(train_id, command) assertt(command, "string") @@ -164,6 +170,9 @@ local static_env = { return false end end, + get_slowdown = function() + return advtrains.global_slowdown + end } -- If interlocking is present, enable route setting functions @@ -217,11 +226,24 @@ if advtrains.interlocking then end static_env.get_aspect = function(signal) local pos = atlatc.pcnaming.resolve_pos(signal) - return advtrains.interlocking.signal_get_aspect(pos) + return advtrains.interlocking.signal.get_aspect_info(pos) end - static_env.set_aspect = function(signal, asp) + static_env.set_aspect = function(signal, main_asp, rem_signal) + if type(main_asp) == "table" then + error("set_aspect: Parameters of this method have changed to (signal, main_asp, rem_signal) with introduction of distant signalling: parameter 2 is now the main aspect name (a string)") + end local pos = atlatc.pcnaming.resolve_pos(signal) - return advtrains.interlocking.signal_set_aspect(pos) + local rem_pos = rem_signal and atlatc.pcnaming.resolve_pos(rem_signal) + return advtrains.interlocking.signal_set_aspect(pos, main_asp, rem_pos) + end + + --section_occupancy() + static_env.section_occupancy = function(ts_id) + if not ts_id then return nil end + ts_id = tostring(ts_id) + local response = advtrains.interlocking.db.get_ts(ts_id) + if not response then return false end + return (response.trains and table.copy(response.trains)) or {} end end @@ -250,6 +272,11 @@ if advtrains.lines then } end + +atlatc.register_function = function (name, f) + static_env[name] = f +end + for _, name in pairs(safe_globals) do static_env[name] = _G[name] end diff --git a/advtrains_luaautomation/init.lua b/advtrains_luaautomation/init.lua index ab625b1..753340d 100644 --- a/advtrains_luaautomation/init.lua +++ b/advtrains_luaautomation/init.lua @@ -2,18 +2,26 @@ -- Lua automation features for advtrains -- Uses global table 'atlatc' (AdvTrains_LuaATC) ---TODO: re-add localization (if merging localization, discard this hunk please) -atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end ---Privilege ---Only trusted players should be enabled to build stuff which can break the server. atlatc = { envs = {}} -minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false }) +-- 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 atlatc.CODE_FORM_SIZE = "15,12" +--Position of Error Label in Code Form +atlatc.CODE_FORM_ERRLABELPOS = "0,12" --assertt helper. error if a variable is not of a type function assertt(var, typ) @@ -31,10 +39,16 @@ dofile(mp.."/interrupt.lua") dofile(mp.."/active_common.lua") dofile(mp.."/atc_rail.lua") dofile(mp.."/operation_panel.lua") +if mesecon then + dofile(mp.."/mesecon_controller.lua") +end dofile(mp.."/pcnaming.lua") dofile(mp.."/chatcmds.lua") +if minetest.settings:get_bool("advtrains_luaautomation_enable_atlac_recipes",false) == true then + dofile(mp.."/recipes.lua") +end local filename=minetest.get_worldpath().."/advtrains_luaautomation" 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 new file mode 100644 index 0000000..9f1a931 --- /dev/null +++ b/advtrains_luaautomation/mesecon_controller.lua @@ -0,0 +1,261 @@ +-- mesecon_controller.lua +-- Mesecon-interfaceable Operation Panel alternative +-- Looks like a Mesecon Luacontroller + +-- Luacontroller Adapted Code +-- From Mesecons mod https://mesecons.net/ +-- (c) Jeija and Contributors + +-- Get current translator +local S = atlatc.translate +local BASENAME = "advtrains_luaautomation:mesecon_controller" + +local rules = { + a = {x = -1, y = 0, z = 0, name="A"}, + b = {x = 0, y = 0, z = 1, name="B"}, + c = {x = 1, y = 0, z = 0, name="C"}, + d = {x = 0, y = 0, z = -1, name="D"}, +} + +local function generate_name(ports) + local d = ports.d and 1 or 0 + local c = ports.c and 1 or 0 + local b = ports.b and 1 or 0 + local a = ports.a and 1 or 0 + return BASENAME..d..c..b..a +end + + +local function set_port(pos, rule, state) + if state then + mesecon.receptor_on(pos, {rule}) + else + mesecon.receptor_off(pos, {rule}) + end +end + +local function clean_port_states(ports) + ports.a = ports.a and true or false + ports.b = ports.b and true or false + ports.c = ports.c and true or false + ports.d = ports.d and true or false +end + +-- Local table for storing which Mesecons off events should be ignored +-- Indexed by hex encoded position +local ignored_off_events = {} + +local function set_port_states(pos, ports) + local node = advtrains.ndb.get_node(pos) + local name = node.name + clean_port_states(ports) + local vports = minetest.registered_nodes[name].virtual_portstates + local new_name = generate_name(ports) + + if name ~= new_name and vports then + -- Problem: + -- We need to place the new node first so that when turning + -- off some port, it won't stay on because the rules indicate + -- there is an onstate output port there. + -- When turning the output off then, it will however cause feedback + -- so that the luacontroller will receive an "off" event by turning + -- its output off. + -- Solution / Workaround: + -- Remember which output was turned off and ignore next "off" event. + local ph=minetest.pos_to_string(pos) + local railtbl = atlatc.active.nodes[ph] + if not railtbl then return end + + local ign = railtbl.ignored_off_events or {} + if ports.a and not vports.a and not mesecon.is_powered(pos, rules.a) then ign.A = true end + if ports.b and not vports.b and not mesecon.is_powered(pos, rules.b) then ign.B = true end + if ports.c and not vports.c and not mesecon.is_powered(pos, rules.c) then ign.C = true end + if ports.d and not vports.d and not mesecon.is_powered(pos, rules.d) then ign.D = true end + railtbl.ignored_off_events = ign + + advtrains.ndb.swap_node(pos, {name = new_name, param2 = node.param2}) + + -- Apply mesecon state only if node loaded + -- If node is not loaded, mesecon update will occur on next load via on_updated_from_nodedb + if advtrains.is_node_loaded(pos) then + if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end + if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end + if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end + if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end + end + end +end + +local function on_updated_from_nodedb(pos, newnode, oldnode) + -- Switch appropriate Mesecon receptors depending on the node change + local vports = minetest.registered_nodes[oldnode.name].virtual_portstates + local ports = minetest.registered_nodes[newnode.name].virtual_portstates + if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end + if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end + if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end + if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end +end + +local function ignore_offevent(pos, rule) + local ph=minetest.pos_to_string(pos) + local railtbl = atlatc.active.nodes[ph] + if not railtbl then return nil end + local ign = railtbl.ignored_off_events + if ign and ign[rule.name] then + ign[rule.name] = nil + return true + end + return false +end + +local valid_ports = {a=true, b=true, c=true, d=true} + +local function fire_event(pos, evtdata) + local customfct={ + set_mesecon_outputs = function(states) + assertt(states, "table") + set_port_states(pos, states) + end, + get_mesecon_input = function(port) + local portl = string.lower(port) + if not valid_ports[portl] then + error("get_mesecon_input: Invalid port (expected a,b,c,d)") + end + if mesecon.is_powered(pos, rules[portl]) then + return true + end + return false + end, + } + atlatc.active.run_in_env(pos, evtdata, customfct, true) + +end + +local output_rules = {} +local input_rules = {} + +local node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, -- Bottom slab + {-5/16, -7/16, -5/16, 5/16, -6/16, 5/16}, -- Circuit board + {-3/16, -6/16, -3/16, 3/16, -5/16, 3/16}, -- IC + } +} + +local selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, +} + +for a = 0, 1 do -- 0 = off 1 = on +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do + local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a) + local node_name = BASENAME..cid + local top = "atlatc_luacontroller_top.png" + if a == 1 then + top = top.."^atlatc_luacontroller_LED_A.png" + end + if b == 1 then + top = top.."^atlatc_luacontroller_LED_B.png" + end + if c == 1 then + top = top.."^atlatc_luacontroller_LED_C.png" + end + if d == 1 then + top = top.."^atlatc_luacontroller_LED_D.png" + end + + local groups + if a + b + c + d ~= 0 then + groups = {dig_immediate=2, not_in_creative_inventory=1, save_in_at_nodedb=1} + else + groups = {dig_immediate=2, save_in_at_nodedb=1} + end + + output_rules[cid] = {} + input_rules[cid] = {} + if a == 1 then table.insert(output_rules[cid], rules.a) end + if b == 1 then table.insert(output_rules[cid], rules.b) end + if c == 1 then table.insert(output_rules[cid], rules.c) end + if d == 1 then table.insert(output_rules[cid], rules.d) end + + if a == 0 then table.insert( input_rules[cid], rules.a) end + if b == 0 then table.insert( input_rules[cid], rules.b) end + if c == 0 then table.insert( input_rules[cid], rules.c) end + if d == 0 then table.insert( input_rules[cid], rules.d) end + + local mesecons = { + effector = { + rules = input_rules[cid], + action_change = function (pos, _, rule_name, new_state) + if new_state == "off" then + -- check for ignored off event on this node + if ignore_offevent(pos, rule_name) then + return + end + end + --Note: rule_name is not a *name* but actually the full rule table (position + name field) + --Event format consistent with Mesecons Luacontroller event + atlatc.interrupt.add(0, pos, {type=new_state, [new_state]=true, pin=rule_name}) + end, + }, + receptor = { + state = mesecon.state.on, + rules = output_rules[cid] + }, + } + + minetest.register_node(node_name, { + description = S("LuaATC Mesecon Controller"), + drawtype = "nodebox", + tiles = { + top, + "atlatc_luacontroller_bottom.png", + "atlatc_luacontroller_sides.png", + "atlatc_luacontroller_sides.png", + "atlatc_luacontroller_sides.png", + "atlatc_luacontroller_sides.png" + }, + inventory_image = top, + paramtype = "light", + is_ground_content = false, + groups = groups, + drop = BASENAME.."0000", + sunlight_propagates = true, + selection_box = selection_box, + node_box = node_box, + mesecons = mesecons, + -- Virtual portstates are the ports that + -- the node shows as powered up (light up). + virtual_portstates = { + a = a == 1, + b = b == 1, + c = c == 1, + d = d == 1, + }, + after_dig_node = function (pos, node, player) + mesecon.receptor_off(pos, output_rules) + atlatc.active.after_dig_node(pos, node, player) + end, + after_place_node = atlatc.active.after_place_node, + on_receive_fields = atlatc.active.on_receive_fields, + advtrains = { + on_updated_from_nodedb = on_updated_from_nodedb + }, + luaautomation = { + fire_event=fire_event + }, + digiline = { + receptor = {}, + effector = { + action = atlatc.active.on_digiline_receive + }, + }, + }) +end +end +end +end diff --git a/advtrains_luaautomation/operation_panel.lua b/advtrains_luaautomation/operation_panel.lua index f8b93b5..adfaf09 100644 --- a/advtrains_luaautomation/operation_panel.lua +++ b/advtrains_luaautomation/operation_panel.lua @@ -1,13 +1,15 @@ +-- Get current translator +local S = atlatc.translate -local function on_punch(pos, player) - atlatc.interrupt.add(0, pos, {type="punch", punch=true}) +local function on_punch(pos,node,player) + atlatc.interrupt.add(0, pos, {type="punch", punch=true, name=player:get_player_name()}) end minetest.register_node("advtrains_luaautomation:oppanel", { drawtype = "normal", tiles={"atlatc_oppanel.png"}, - description = "LuaAutomation operation panel", + description = S("LuaATC Operation Panel"), groups = { cracky = 1, save_in_at_nodedb=1, diff --git a/advtrains_luaautomation/pcnaming.lua b/advtrains_luaautomation/pcnaming.lua index ebb769f..7c7f0c9 100644 --- a/advtrains_luaautomation/pcnaming.lua +++ b/advtrains_luaautomation/pcnaming.lua @@ -2,6 +2,9 @@ --a.k.a Passive component naming --Allows to assign names to passive components, so they can be called like: --setstate("iamasignal", "green") +-- Get current translator +local S = atlatc.translate + atlatc.pcnaming={name_map={}} function atlatc.pcnaming.load(stuff) if type(stuff)=="table" then @@ -22,8 +25,11 @@ function atlatc.pcnaming.resolve_pos(pos, func_name) error("Invalid position supplied to " .. (func_name or "???")..": " .. dump(pos)) end + +local pcrename = {} + minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ - description = attrans("Passive Component Naming Tool\n\nRight-click to name a passive component."), + description = S("Passive Component Naming Tool\n\nRight-click to name a passive component."), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "atlatc_pcnaming.png", wield_image = "atlatc_pcnaming.png", @@ -34,7 +40,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ return end if not minetest.check_player_privs(pname, {atlatc=true}) then - minetest.chat_send_player(pname, "Missing privilege: atlatc") + minetest.chat_send_player(pname, S("You are not allowed to name LuaATC passive components without the @1 privilege.", "atlatc")) return end if pointed_thing.type=="node" then @@ -43,8 +49,14 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ minetest.record_protection_violation(pos, pname) return end + local node = advtrains.ndb.get_node(pos) - if node.name and (minetest.get_item_group(node.name, "advtrains_signal")>0 or advtrains.is_passive(pos)) then + local ndef = minetest.registered_nodes[node.name] + if node.name and ( + minetest.get_item_group(node.name, "advtrains_signal")>0 --is IL signal + or advtrains.is_passive(pos) -- is passive component + or (ndef and ndef.luaautomation) -- is active component + ) then --look if this one already has a name local pn="" for name, npos in pairs(atlatc.pcnaming.name_map) do @@ -52,16 +64,17 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ pn=name end end - minetest.show_formspec(pname, "atlatc_naming_"..minetest.pos_to_string(pos), "field[pn;Set name of component (empty to clear);"..minetest.formspec_escape(pn).."]") + pcrename[pname] = pos + minetest.show_formspec(pname, "atlatc_naming", "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]") end end end, }) minetest.register_on_player_receive_fields(function(player, formname, fields) - local pts=string.match(formname, "^atlatc_naming_(.+)") - if pts then - local pos=minetest.string_to_pos(pts) - if fields.pn then + if formname == "atlatc_naming" then + local pname = player:get_player_name() + local pos=pcrename[pname] + if fields.pn and pos then --first remove all occurences for name, npos in pairs(atlatc.pcnaming.name_map) do if vector.equals(npos, pos) then @@ -74,3 +87,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end) +minetest.register_craft({ + output = "advtrains_luaautomation:pcnaming", + type = "shapeless", + recipe = {"dye:red","advtrains:trackworker"} +}) 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_luaautomation/recipes.lua b/advtrains_luaautomation/recipes.lua new file mode 100644 index 0000000..16121a8 --- /dev/null +++ b/advtrains_luaautomation/recipes.lua @@ -0,0 +1,27 @@ +-- depends on default, digilines and mesecons for crafting recipes +minetest.register_craft({ + output = "advtrains_luaautomation:dtrack_placer", + recipe = { + {"","mesecons_luacontroller:luacontroller0000",""}, + {"","advtrains:dtrack_atc_placer",""}, + {"","digilines:wire_std_00000000",""}, + } +}) + +minetest.register_craft({ + output = "advtrains_luaautomation:mesecon_controller0000", + recipe = { + {"","mesecons:wire_00000000_off",""}, + {"mesecons:wire_00000000_off","advtrains_luaautomation:dtrack_placer","mesecons:wire_00000000_off"}, + {"","mesecons:wire_00000000_off",""}, + } +}) + +minetest.register_craft({ + output = "advtrains_luaautomation:oppanel", + recipe = { + {"","mesecons_button:button_off",""}, + {"","advtrains_luaautomation:mesecon_controller0000",""}, + {"","default:stone",""}, + } +})
\ No newline at end of file diff --git a/advtrains_luaautomation/settingtypes.txt b/advtrains_luaautomation/settingtypes.txt new file mode 100644 index 0000000..20ed52e --- /dev/null +++ b/advtrains_luaautomation/settingtypes.txt @@ -0,0 +1,2 @@ +# Enable or disable craft recipes for LuaATC components +advtrains_luaautomation_enable_atlac_recipes (Enable LuaATC component craft recipes) bool true
\ No newline at end of file diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_LED_A.png b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_A.png Binary files differnew file mode 100644 index 0000000..c6182cc --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_A.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_LED_B.png b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_B.png Binary files differnew file mode 100644 index 0000000..04c2da0 --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_B.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_LED_C.png b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_C.png Binary files differnew file mode 100644 index 0000000..01f6ae4 --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_C.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_LED_D.png b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_D.png Binary files differnew file mode 100644 index 0000000..6c8a26f --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_LED_D.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_bottom.png b/advtrains_luaautomation/textures/atlatc_luacontroller_bottom.png Binary files differnew file mode 100644 index 0000000..7ae955c --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_bottom.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_sides.png b/advtrains_luaautomation/textures/atlatc_luacontroller_sides.png Binary files differnew file mode 100644 index 0000000..40f4b60 --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_sides.png diff --git a/advtrains_luaautomation/textures/atlatc_luacontroller_top.png b/advtrains_luaautomation/textures/atlatc_luacontroller_top.png Binary files differnew file mode 100644 index 0000000..a5059af --- /dev/null +++ b/advtrains_luaautomation/textures/atlatc_luacontroller_top.png |