diff --git a/Driver.cpp b/Driver.cpp index 637ce102..050e43d6 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1644,7 +1644,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, #ifdef _WIN32 CreateDirectory( "physicslog", NULL ); #elif __unix__ - mkdir( "physicslog", 0644 ); + mkdir( "physicslog", 0744 ); #endif LogFile.open( std::string( "physicslog/" + VehicleName + ".dat" ), std::ios::in | std::ios::out | std::ios::trunc ); @@ -1709,19 +1709,19 @@ std::string TController::OrderCurrent() const { // pobranie aktualnego rozkazu celem wyświetlenia auto const order { OrderCurrentGet() }; if( order & Change_direction ) { - return STR(driver_scenario_changedirection); + return STR("Change direction"); } switch( OrderList[ OrderPos ] ) { - case Wait_for_orders: { return STR(driver_scenario_waitfororders); } - case Prepare_engine: { return STR(driver_scenario_prepareengine); } - case Release_engine: { return STR(driver_scenario_releaseengine); } - case Change_direction: { return STR(driver_scenario_changedirection); } - case Connect: { return STR(driver_scenario_connect); } + case Wait_for_orders: { return STR("Wait for orders"); } + case Prepare_engine: { return STR("Start the engine"); } + case Release_engine: { return STR("Shut down the engine"); } + case Change_direction: { return STR("Change direction"); } + case Connect: { return STR("Couple to consist ahead"); } case Disconnect: { if( iVehicleCount < 0 ) { // done with uncoupling, order should update shortly - return STR(driver_scenario_waitfororders); + return STR("Wait for orders"); } // try to provide some task details auto const count { iVehicleCount }; @@ -1729,26 +1729,24 @@ std::string TController::OrderCurrent() const if( iVehicleCount > 1 ) { std::snprintf( orderbuffer.data(), orderbuffer.size(), - ( iVehicleCount < 5 ? - STR_C(driver_scenario_fewvehicles) : // 2-4 - STR_C(driver_scenario_somevehicles) ), // 5+ + STR_C("the engine plus %d next vehicles"), // TODO: implement plural forms count ); } auto const countstring { ( - count == 0 ? STR(driver_scenario_allvehicles) : - count == 1 ? STR(driver_scenario_onevehicle) : + count == 0 ? STR("the engine") : + count == 1 ? STR("the engine plus the next vehicle") : orderbuffer.data() ) }; std::snprintf( orderbuffer.data(), orderbuffer.size(), - STR_C(driver_scenario_disconnect), + STR_C("Uncouple %s"), countstring.c_str() ); return orderbuffer.data(); } - case Shunt: { return STR(driver_scenario_shunt); } - case Loose_shunt: { return STR(driver_scenario_looseshunt); } - case Obey_train: { return STR(driver_scenario_obeytrain); } - case Bank: { return STR(driver_scenario_bank); } + case Shunt: { return STR("Shunt according to signals"); } + case Loose_shunt: { return STR("Loose shunt according to signals"); } + case Obey_train: { return STR("Drive according to signals and timetable"); } + case Bank: { return STR("Bank consist ahead"); } default: { return{}; } } }; diff --git a/Texture.cpp b/Texture.cpp index a3f8cdb8..b8c9436a 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -180,7 +180,7 @@ opengl_texture::load() { if( type == ".dds" ) { load_DDS(); } else if( type == ".tga" ) { load_TGA(); } else if( type == ".png" ) { load_PNG(); } - else if( type == ".bmp" ) { load_BMP(); } + else if( type == ".bmp" ) { load_STBI(); } else if( type == ".jpg" ) { load_STBI(); } else if( type == ".tex" ) { load_TEX(); } else { goto fail; } @@ -257,6 +257,7 @@ void opengl_texture::load_PNG() void opengl_texture::load_STBI() { int x, y, n; + stbi_set_flip_vertically_on_load(1); uint8_t *image = stbi_load((name + type).c_str(), &x, &y, &n, 4); if (!image) { @@ -304,64 +305,6 @@ opengl_texture::make_request() { Application.request( { ToLower( components.front() ), dictionary, rt } ); } -void -opengl_texture::load_BMP() { - - std::ifstream file( name + type, std::ios::binary ); file.unsetf( std::ios::skipws ); - - BITMAPFILEHEADER header; - - file.read((char *) &header, sizeof( BITMAPFILEHEADER ) ); - if( file.eof() ) { - - data_state = resource_state::failed; - return; - } - - // Read in bitmap information structure - BITMAPINFO info; - unsigned int infosize = header.bfOffBits - sizeof( BITMAPFILEHEADER ); - if( infosize > sizeof( info ) ) { - WriteLog( "Warning - BMP header is larger than expected, possible format difference.", logtype::texture ); - } - file.read((char *) &info, std::min( (size_t)infosize, sizeof( info ) ) ); - - data_width = info.bmiHeader.biWidth; - data_height = info.bmiHeader.biHeight; - - if( info.bmiHeader.biCompression != BI_RGB ) { - - ErrorLog( "Bad texture: compressed BMP textures aren't supported.", logtype::texture ); - data_state = resource_state::failed; - return; - } - - unsigned long datasize = info.bmiHeader.biSizeImage; - if( 0 == datasize ) { - // calculate missing info - datasize = ( data_width * info.bmiHeader.biBitCount + 7 ) / 8 * data_height; - } - - data.resize( datasize ); - file.read((char*) &data[0], datasize ); - // we're storing texture data internally with bottom-left origin - // so BMP origin matches, no flipping needed - - // fill remaining data info - if( info.bmiHeader.biBitCount == 32 ) { - data_format = GL_BGRA; - data_components = GL_RGBA; - } - else { - data_format = GL_BGR; - data_components = GL_RGB; - } - data_mapcount = 1; - data_state = resource_state::good; - - return; -} - DDCOLORKEY opengl_texture::deserialize_ddck(std::istream &s) { DDCOLORKEY ddck; diff --git a/Texture.h b/Texture.h index 220967ec..d72ad702 100644 --- a/Texture.h +++ b/Texture.h @@ -63,8 +63,7 @@ struct opengl_texture { private: // methods - void make_request(); - void load_BMP(); + void make_request(); void load_PNG(); void load_DDS(); void load_TEX(); diff --git a/driveruilayer.cpp b/driveruilayer.cpp index bf8cfba2..b4cc74b5 100644 --- a/driveruilayer.cpp +++ b/driveruilayer.cpp @@ -37,17 +37,17 @@ driver_ui::driver_ui() { add_external_panel( &m_cameraviewpanel ); m_logpanel.is_open = false; - m_aidpanel.title = STR(driver_aid_header); + m_aidpanel.title = STR("Driving Aid"); - m_scenariopanel.title = STR(driver_scenario_header); + m_scenariopanel.title = STR("Scenario"); m_scenariopanel.size_min = { 435, 85 }; m_scenariopanel.size_max = { Global.iWindowWidth * 0.95, Global.iWindowHeight * 0.95 }; - m_timetablepanel.title = STR(driver_timetable_header); + m_timetablepanel.title = STR("%-*.*s Time: %d:%02d:%02d"); m_timetablepanel.size_min = { 435, 110 }; m_timetablepanel.size_max = { 435, Global.iWindowHeight * 0.95 }; - m_transcriptspanel.title = STR(driver_transcripts_header); + m_transcriptspanel.title = STR("Transcripts"); m_transcriptspanel.size_min = { 435, 85 }; m_transcriptspanel.size_max = { Global.iWindowWidth * 0.95, Global.iWindowHeight * 0.95 }; } @@ -55,10 +55,10 @@ driver_ui::driver_ui() { void driver_ui::render_menu_contents() { ui_layer::render_menu_contents(); - if (ImGui::BeginMenu(STR_C(ui_mode_windows))) + if (ImGui::BeginMenu(STR_C("Mode windows"))) { ImGui::MenuItem(m_aidpanel.title.c_str(), "F1", &m_aidpanel.is_open); - ImGui::MenuItem(STR_C(driver_timetable_name), "F2", &m_timetablepanel.is_open); + ImGui::MenuItem(STR_C("Timetable"), "F2", &m_timetablepanel.is_open); ImGui::MenuItem(m_debugpanel.name().c_str(), "F12", &m_debugpanel.is_open); ImGui::MenuItem(m_mappanel.name().c_str(), "Tab", &m_mappanel.is_open); ImGui::MenuItem(m_vehiclelist.name().c_str(), nullptr, &m_vehiclelist.is_open); @@ -228,18 +228,18 @@ driver_ui::set_cursor( bool const Visible ) { void driver_ui::render_() { // pause/quit modal - auto const popupheader { STR_C(driver_pause_header) }; + auto const popupheader { STR_C("Simulation Paused") }; if (m_paused && !m_pause_modal_opened) { m_pause_modal_opened = true; ImGui::OpenPopup(popupheader); } if( ImGui::BeginPopupModal( popupheader, &m_pause_modal_opened, ImGuiWindowFlags_AlwaysAutoResize ) ) { - auto const popupwidth{ STR(driver_pause_header).size() * 7 }; - if( ImGui::Button( STR_C(driver_pause_resume), ImVec2( popupwidth, 0 ) ) ) { + auto const popupwidth{ STR("Simulation Paused").size() * 7 }; + if( ImGui::Button( STR_C("Resume"), ImVec2( popupwidth, 0 ) ) ) { m_relay.post(user_command::pausetoggle, 0.0, 0.0, GLFW_PRESS, 0); } - if( ImGui::Button( STR_C(driver_pause_quit), ImVec2( popupwidth, 0 ) ) ) { + if( ImGui::Button( STR_C("Quit"), ImVec2( popupwidth, 0 ) ) ) { m_relay.post(user_command::quitsimulation, 0.0, 0.0, GLFW_PRESS, 0); } if (!m_paused) diff --git a/driveruipanels.cpp b/driveruipanels.cpp index a3f6ed67..8c5b1393 100644 --- a/driveruipanels.cpp +++ b/driveruipanels.cpp @@ -53,7 +53,7 @@ drivingaid_panel::update() { if( std::abs( grade ) >= 0.25 ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_grade), + STR_C(" Grade: %.1f%%%%"), grade ); gradetext = m_buffer.data(); } @@ -64,7 +64,7 @@ drivingaid_panel::update() { if( nextspeedlimit != speedlimit ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_nextlimit), + STR_C(", new limit: %d km/h in %.1f km"), nextspeedlimit, driver->ActualProximityDist * 0.001 ); nextspeedlimittext = m_buffer.data(); @@ -72,7 +72,7 @@ drivingaid_panel::update() { // current speed and limit std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_speedlimit), + STR_C(" Speed: %d km/h (limit %d km/h%s)%s"), static_cast( std::floor( mover->Vel ) ), speedlimit, nextspeedlimittext.c_str(), @@ -82,7 +82,7 @@ drivingaid_panel::update() { // base data and optional bits put together std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_throttle), + STR_C("Throttle: %2d+%d %c%s"), driver->Controlling()->MainCtrlPos, driver->Controlling()->ScndCtrlPos, ( mover->ActiveDir > 0 ? 'D' : mover->ActiveDir < 0 ? 'R' : 'N' ), @@ -96,14 +96,14 @@ drivingaid_panel::update() { if( is_expanded ) { std::snprintf ( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_pressures), + STR_C(" Pressure: %.2f kPa (train pipe: %.2f kPa)"), mover->BrakePress * 100, mover->PipePress * 100 ); expandedtext = m_buffer.data(); } std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_brakes), + STR_C("Brakes: %4.1f+%-2.0f%c%s"), mover->fBrakeCtrlPos, mover->LocalBrakePosA * LocalBrakePosNo, ( mover->SlippingWheels ? '!' : ' ' ), @@ -119,7 +119,7 @@ drivingaid_panel::update() { if( stoptime > 0 ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_loadinginprogress), + STR_C(" Loading/unloading in progress (%d s left)"), stoptime ); expandedtext = m_buffer.data(); } @@ -128,7 +128,7 @@ drivingaid_panel::update() { if( trackblockdistance <= 75.0 ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_aid_vehicleahead), + STR_C(" Another vehicle ahead (distance: %.1f m)"), trackblockdistance ); expandedtext = m_buffer.data(); } @@ -136,11 +136,11 @@ drivingaid_panel::update() { } std::string textline = ( mover->SecuritySystem.is_vigilance_blinking() ? - STR(driver_aid_alerter) : + STR("!ALERTER! ") : " " ); textline += ( mover->SecuritySystem.is_cabsignal_blinking() ? - STR(driver_aid_shp) : + STR("!SHP!") : " " ); text_lines.emplace_back( textline + " " + expandedtext, Global.UITextColor ); @@ -169,7 +169,7 @@ scenario_panel::update() { if( owner == nullptr ) { return; } std::string textline = - STR(driver_scenario_currenttask) + "\n " + STR("Current task:") + "\n " + owner->OrderCurrent(); text_lines.emplace_back( textline, Global.UITextColor ); @@ -205,7 +205,7 @@ scenario_panel::render() { m_nearest->Mechanik : m_nearest->ctOwner ) }; if( owner != nullptr ) { - auto const assignmentheader { STR(driver_scenario_assignment) }; + auto const assignmentheader { STR("Assignment") }; if( ( false == owner->assignment().empty() ) && ( true == ImGui::CollapsingHeader( assignmentheader.c_str() ) ) ) { ImGui::TextWrapped( "%s", owner->assignment().c_str() ); @@ -236,9 +236,9 @@ timetable_panel::update() { { // current time std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_timetable_header), + STR_C("%-*.*s Time: %d:%02d:%02d"), 37, 37, - STR_C(driver_timetable_name), + STR_C("Timetable"), time.wHour, time.wMinute, time.wSecond ); @@ -300,7 +300,7 @@ timetable_panel::update() { } std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(driver_timetable_consistdata), + STR_C("Consist weight: %d t (specified) %d t (actual)\nConsist length: %d m"), static_cast( table->LocLoad ), static_cast( consistmass / 1000 ), static_cast( consistlength ) ); @@ -311,7 +311,7 @@ timetable_panel::update() { if( 0 == table->StationCount ) { // only bother if there's stations to list - text_lines.emplace_back( STR(driver_timetable_notimetable), Global.UITextColor ); + text_lines.emplace_back( STR("(no timetable)"), Global.UITextColor ); } else { @@ -554,9 +554,9 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_nameloadstatuscouplers), + STR_C("Name: %s%s\nLoad: %.0f %s\nStatus: %s%s\nCouplers:\n front: %s\n rear: %s"), mover.Name.c_str(), - std::string( isowned ? STR(debug_vehicle_owned) + vehicle.ctOwner->OwnerName() : "" ).c_str(), + std::string( isowned ? STR(", owned by: ") + vehicle.ctOwner->OwnerName() : "" ).c_str(), mover.LoadAmount, mover.LoadType.name.c_str(), mover.EngineDescription( 0 ).c_str(), @@ -569,7 +569,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_devicespower), + STR_C("Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f"), // devices ( mover.Battery ? 'B' : '.' ), ( mover.Mains ? 'M' : '.' ), @@ -585,8 +585,8 @@ debug_panel::update_section_vehicle( std::vector &Output ) { ( mover.ConvOvldFlag ? '!' : '.' ), ( mover.CompressorFlag ? 'C' : ( false == mover.CompressorAllowLocal ? '-' : ( ( mover.CompressorAllow || mover.CompressorStart == start_t::automatic ) ? 'c' : '.' ) ) ), ( mover.CompressorGovernorLock ? '!' : '.' ), - std::string( isplayervehicle ? STR(debug_vehicle_radio) + ( mover.Radio ? std::to_string( m_input.train->RadioChannel() ) : "-" ) : "" ).c_str(), - std::string( isdieselenginepowered ? STR(debug_vehicle_oilpressure) + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(), + std::string( isplayervehicle ? STR(" radio: ") + ( mover.Radio ? std::to_string( m_input.train->RadioChannel() ) : "-" ) : "" ).c_str(), + std::string( isdieselenginepowered ? STR(" oil pressure: ") + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(), // power transfers mover.Couplers[ end::front ].power_high.voltage, mover.Couplers[ end::front ].power_high.current, @@ -600,11 +600,11 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_controllersenginerevolutions), + STR_C("Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f"), // controllers mover.MainCtrlPos, mover.MainCtrlActualPos, - std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(debug_vehicle_shuntmode) : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(), + std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(" (shunt mode)") : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(), // engine mover.EnginePower, std::abs( mover.TrainType == dt_EZT ? mover.ShowCurrent( 0 ) : mover.Im ), @@ -622,7 +622,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { if( isdieselenginepowered ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_temperatures), + STR_C("\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f"), mover.dizel_heat.Ts, mover.dizel_heat.To, mover.dizel_heat.temperatura1, @@ -635,7 +635,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_brakespressures), + STR_C("Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f"), // brakes mover.fBrakeCtrlPos, mover.LocalBrakePosA, @@ -661,7 +661,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { if( mover.EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_pantograph), + STR_C(" pantograph: %.2f%cMT"), mover.PantPress, ( mover.bPantKurek3 ? '-' : '|' ) ); textline += m_buffer.data(); @@ -677,7 +677,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::snprintf( m_buffer.data(), m_buffer.size(), - STR_C(debug_vehicle_forcesaccelerationvelocityposition), + STR_C("Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]"), // forces mover.Ft * 0.001f * ( mover.ActiveCab ? mover.ActiveCab : vehicle.ctOwner ? vehicle.ctOwner->Controlling()->ActiveCab : 1 ) + 0.001f, mover.Fb * 0.001f, @@ -702,7 +702,7 @@ debug_panel::update_section_vehicle( std::vector &Output ) { std::string debug_panel::update_vehicle_coupler( int const Side ) { // NOTE: mover and vehicle are guaranteed to be valid by the caller - std::string couplerstatus { STR(debug_vehicle_none) }; + std::string couplerstatus { STR("none") }; auto const *connected { m_input.vehicle->MoverParameters->Neighbours[ Side ].vehicle }; diff --git a/editoruilayer.cpp b/editoruilayer.cpp index f37f549f..7d3a9171 100644 --- a/editoruilayer.cpp +++ b/editoruilayer.cpp @@ -74,7 +74,7 @@ const std::string *editor_ui::get_active_node_template() { void editor_ui::render_menu_contents() { ui_layer::render_menu_contents(); - if (ImGui::BeginMenu(STR_C(ui_mode_windows))) + if (ImGui::BeginMenu(STR_C("Mode windows"))) { ImGui::MenuItem(m_nodebankpanel.title.c_str(), nullptr, &m_nodebankpanel.is_open); ImGui::EndMenu(); diff --git a/scenarioloadermode.cpp b/scenarioloadermode.cpp index ecce7a8d..19fe5069 100644 --- a/scenarioloadermode.cpp +++ b/scenarioloadermode.cpp @@ -83,7 +83,7 @@ scenarioloader_mode::enter() { m_userinterface->set_background( "logo" ); Application.set_title( Global.AppName + " (" + Global.SceneryFile + ")" ); m_userinterface->set_progress(); - m_userinterface->set_progress(STR(ui_loading_scenery)); + m_userinterface->set_progress(STR("Loading scenery")); GfxRenderer.Render(); } diff --git a/stb/stb_image.h b/stb/stb_image.h index ab2e3ce3..e23f4a17 100644 --- a/stb/stb_image.h +++ b/stb/stb_image.h @@ -111,6 +111,7 @@ RECENT REVISION HISTORY: #define STBI_INCLUDE_STB_IMAGE_H #define STBI_ONLY_JPEG +#define STBI_ONLY_BMP // DOCUMENTATION // diff --git a/stdafx.h b/stdafx.h index 98fef00a..4b5955a3 100644 --- a/stdafx.h +++ b/stdafx.h @@ -76,6 +76,7 @@ #include #include #include +#include #include "glad/glad.h" diff --git a/translation.cpp b/translation.cpp index 1460e809..f0ad76cd 100644 --- a/translation.cpp +++ b/translation.cpp @@ -16,563 +16,12 @@ http://mozilla.org/MPL/2.0/. #include "Logs.h" #include "Globals.h" - /* - // TODO: import localized strings from localization files - std::unordered_map> stringmap; - - stringmap.insert( - { "en", - { - "Driving Aid", - "Throttle: %2d+%d %c%s", - " Speed: %d km/h (limit %d km/h%s)%s", - ", new limit: %d km/h in %.1f km", - " Grade: %.1f%%%%", - "Brakes: %4.1f+%-2.0f%c%s", - " Pressure: %.2f kPa (train pipe: %.2f kPa)", - "!ALERTER! ", - "!SHP!", - " Loading/unloading in progress (%d s left)", - " Another vehicle ahead (distance: %.1f m)", - - "Scenario", - "Assignment", - "Current task:", - "Wait for orders", - "Start the engine", - "Shut down the engine", - "Change direction", - "Couple to consist ahead", - "Uncouple %s", - "the engine", - "the engine plus the next vehicle", - "the engine plus %d next vehicles", - "the engine plus %d next vehicles", - "Shunt according to signals", - "Loose shunt according to signals", - "Drive according to signals and timetable", - "Bank consist ahead", - - "%-*.*s Time: %d:%02d:%02d", // HACK: some manual padding to account for longer 'time' equivalent in polish version - "Timetable", - "(no timetable)", - "Consist weight: %d t (specified) %d t (actual)\nConsist length: %d m", - - "Transcripts", - - "Simulation Paused", - "Resume", - "Quit", - - "Name: %s%s\nLoad: %.0f %s\nStatus: %s%s\nCouplers:\n front: %s\n rear: %s", - ", owned by: ", - "none", - "Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f", - " radio: ", - " oil pressure: ", - "Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f", - " (shunt mode)", - "\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f", - "Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f", - " pantograph: %.2f%cMT", - "Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]", - - "expand", - "Loading", - "Loading scenery", - "Quit simulation?", - "Yes", - "No", - "General", - "Debug mode", - "Quit", - "Tools", - "Logging to log.txt", - "Screenshot", - "Windows", - "Log", - "Map", - "Mode windows", - - "Time and environment", - "Time", - "Day in year", - "Visibility", - "Overcast and precipitation", - "Temperature", - "Apply", - - "Straight |", - "Divert /", - "Open |", - "Close -", - "Insert obstacle:", - "Delete obstacle", - - "Vehicle list", - - "Vehicle parameters", - "Radiostop", - "Reset position", - "Stop and repair", - "Refill main tank", - "Rupture main pipe", - "Move +500m", - "Move -500m", - - "Camera preview", - - "master controller", - "master controller", - "second controller", - "shunt mode power", - "tempomat", - "reverser", - "train brake", - "independent brake", - "manual brake", - "emergency brake", - "brake acting speed", - "brake acting speed: cargo", - "brake acting speed: rapid", - "brake operation mode", - "motor overload relay threshold", - "water pump", - "water pump breaker", - "water heater", - "water heater breaker", - "water circuits link", - "fuel pump", - "oil pump", - "motor blowers A", - "motor blowers B", - "all motor blowers", - "cooling fans", - "line breaker", - "line breaker", - "alerter", - "independent brake releaser", - "sandbox", - "wheelspin brake", - "horn", - "low tone horn", - "high tone horn", - "whistle", - "motor overload relay reset", - "converter overload relay reset", - "motor connectors", - "left door (permit)", - "right door (permit)", - "door (permit)", - "left door", - "right door", - "left door (open)", - "right door (open)", - "left door (close)", - "right door (close)", - "all doors (open)", - "all doors (close)", - "doorstep", - "door control mode", - "departure signal", - "upper headlight", - "left headlight", - "right headlight", - "headlights dimmer", - "left marker light", - "right marker light", - "light pattern", - "rear upper headlight", - "rear left headlight", - "rear right headlight", - "rear left marker light", - "rear right marker light", - "compressor", - "local compressor", - "converter", - "local converter", - "converter", - "line breaker", - "radio", - "radio channel", - "radio channel", - "radio channel", - "radiostop test", - "radiostop", - "pantograph A", - "pantograph B", - "pantograph A", - "pantograph B", - "all pantographs", - "selected pantograph", - "selected pantograph", - "pantograph compressor", - "pantograph 3 way valve", - "heating", - "braking indicator", - "door locking", - "current indicator source", - "instrument light", - "dashboard light", - "timetable light", - "interior light", - "interior light dimmer", - "battery", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part", - "interactive part" - } - } ); - - stringmap.insert( - { "pl", - { - u8"Pomocnik", - u8"Nastawnik: %2d+%d %c%s", - u8" Prędkość: %d km/h (limit %d km/h%s)%s", - u8", nowy limit: %d km/h za %.1f km", - u8" Nachylenie: %.1f%%%%", - u8"Hamulce: %4.1f+%-2.0f%c%s", - u8" Ciśnienie: %.2f kPa (przewód główny: %.2f kPa)", - u8"!CZUWAK! ", - u8"!SHP!", - u8" Wsiadanie/wysiadanie pasażerów (do zakończenia %d s)", - u8" Inny pojazd na drodze (odległość: %.1f m)", - - u8"Scenariusz", - u8"Zlecenie", - u8"Bieżace zadanie:", - u8"Oczekiwać dalszych poleceń", - u8"Przygotować pojazd do jazdy", - u8"Wyłączyc pojazd", - u8"Zmienić kierunek jazdy", - u8"Sprząc się ze składem z przodu", - u8"Odpiąć %s", - u8"pojazd prowadzący", - u8"pojazd prowadzący plus kolejny", - u8"pojazd prowadzący plus %d kolejne", - u8"pojazd prowadzący plus %d kolejnych", - u8"Prowadzić manewry według sygnałów", - u8"Prowadzić manewry przetaczania odrzutem", - u8"Prowadzić skład według sygnałów i rozkładu", - u8"Popychać skład z przodu", - - u8"%-*.*s Godzina: %d:%02d:%02d", - u8"Rozkład jazdy", - u8"(brak rozkładu)", - u8"Brutto: %d t (rozkładowe) %d t (rzeczywiste)\nDługość pociągu: %d m", - - u8"Transkrypcje", - - u8"Symulacja wstrzymana", - u8"Wznów", - u8"Zakończ", - - u8"Nazwa: %s%s\nŁadunek: %.0f %s\nStatus: %s%s\nSprzęgi:\n przedni: %s\n tylny: %s", - u8", wlaściciel: ", - u8"wolny", - u8"Urządzenia: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPrzepływ prądu: %.0f@%.0f%s%s%s%.0f@%.0f", - u8" radio: ", - u8" cisń. oleju: ", - u8"Nastawniki:\n glówny: %d(%d), dodatkowy: %s\nMoc silnika: %.1f, prąd silnika: %.0f\nObroty:\n silnik: %.0f, motory: %.0f, went.silnika: %.0f, went.chłodnicy: %.0f+%.0f", - u8" (tryb manewrowy)", - u8"\nTemperatury:\n silnik: %.2f, olej: %.2f, woda: %.2f%c%.2f", - u8"Hamulce:\n zespolony: %.2f, pomocniczy: %.2f, tryb: %d, nastawa: %s, ładunek: %d\nCiśnienie w cylindrach:\n zespolony: %.2f, pomocniczy: %.2f, status: 0x%.2x\nCiśnienia w przewodach:\n główny: %.2f (kapturek: %.2f), zasilający: %.2f, kontrolny: %.2f\nCiśnienia w zbiornikach:\n pomocniczy: %.2f, główny: %.2f, sterujący: %.2f", - u8" pantograf: %.2f%cZG", - u8"Siły:\n napędna: %.1f, hamowania: %.1f, tarcie: %.2f%s\nPrzyśpieszenia:\n styczne: %.2f, normalne: %.2f (promień: %s)\nPrędkość: %.2f, pokonana odleglość: %.2f\nPozycja: [%.2f, %.2f, %.2f]", - - u8"rozszerz", - u8"Ładowanie", - u8"Wczytywanie scenerii", - u8"Zakończyć symulację?", - u8"Tak", - u8"Nie", - u8"Ogólne", - u8"Tryb debug", - u8"Wyjdź", - u8"Narzędzia", - u8"Logowanie do log.txt", - u8"Zrzut ekranu", - u8"Okna", - u8"Log", - u8"Mapa", - u8"Okna trybu", - - u8"Czas i środowisko", - u8"Czas", - u8"Dzień w roku", - u8"Widoczność", - u8"Zachmurzenie i opady", - u8"Temperatura", - u8"Zastosuj", - - u8"Prosto |", - u8"W bok /", - u8"Otwórz |", - u8"Zamknij -", - u8"Wstaw przeszkodę:", - u8"Usuń przeszkodę", - - u8"Lista pojazdów", - - u8"Parametry pojazdu", - u8"Radiostop", - u8"Zresetuj pozycję", - u8"Zatrzymaj i napraw", - u8"Napełnij ZG", - u8"Zerwij PG", - u8"Przesuń +500m", - u8"Przesuń -500m", - - u8"Podgląd kamery", - - u8"nastawnik jazdy", - u8"nastawnik jazdy", - u8"nastawnik dodatkowy", - u8"sterowanie analogowe", - u8"tempomat", - u8"nastawnik kierunku", - u8"hamulec zespolony", - u8"hamulec pomocniczy", - u8"hamulec ręczny", - u8"hamulec bezpieczeństwa", - u8"nastawa hamulca", - u8"nastawa hamulca: towarowy", - u8"nastawa hamulca: pośpieszny", - u8"tryb pracy hamulca", - u8"zakres prądu rozruchu", - u8"pompa wody", - u8"wyłącznik samoczynny pompy wody", - u8"podgrzewacz wody", - u8"wyłącznik samoczynny podgrzewacza wody", - u8"zawór połaczenia obiegow wody", - u8"pompa paliwa", - u8"pompa oleju", - u8"wentylatory silników trakcyjnych A", - u8"wentylatory silników trakcyjnych B", - u8"wszystkie wentylatory silników trakcyjnych", - u8"wentylatory oporów rozruchowych", - u8"wyłącznik szybki", - u8"wyłącznik szybki", - u8"czuwak", - u8"odluźniacz", - u8"piasecznica", - u8"hamulec przeciwpoślizgowy", - u8"syrena", - u8"syrena (ton niski)", - u8"syrena (ton wysoki)", - u8"gwizdawka", - u8"przekaźnik nadmiarowy silników trakcyjnych", - u8"przekaźnik nadmiarowy przetwornicy", - u8"styczniki liniowe", - u8"drzwi lewe (zezwól)", - u8"drzwi prawe (zezwól)", - u8"drzwi (zezwól)", - u8"drzwi lewe", - u8"drzwi prawe", - u8"drzwi lewe (otwórz)", - u8"drzwi prawe (otwórz)", - u8"drzwi lewe (zamknij)", - u8"drzwi prawe (zamknij)", - u8"drzwi (otwórz)", - u8"drzwi (zamknij)", - u8"stopień drzwi", - u8"tryb sterowania drzwiami", - u8"sygnal odjazdu", - u8"reflektor gorny", - u8"reflektor lewy", - u8"reflektor prawy", - u8"przyciemnienie reflektórow", - u8"sygnal lewy", - u8"sygnal prawy", - u8"programator świateł", - u8"tylny reflektor górny", - u8"tylny reflektor lewy", - u8"tylny reflektor prawy", - u8"tylny sygnal lewy", - u8"tylny sygnal prawy", - u8"sprężarka", - u8"sprężarka lokalna", - u8"przetwornica", - u8"przetwornica lokalna", - u8"przetwornica", - u8"wyłącznik szybki", - u8"radio", - u8"kanał radia", - u8"kanał radia", - u8"kanał radia", - u8"test radiostopu", - u8"radiostop", - u8"pantograf A", - u8"pantograf B", - u8"pantograf A", - u8"pantograf B", - u8"wszystkie pantografy", - u8"wybrany pantograf", - u8"wybrany pantograf", - u8"sprężarka pantografow", - u8"kurek trójdrogowy pantografow", - u8"ogrzewanie pociągu", - u8"sygnalizacja hamowania", - u8"blokada drzwi", - u8"prądy drugiego członu", - u8"oświetlenie przyrządow", - u8"oświetlenie pulpitu", - u8"oświetlenie rozkładu jazdy", - u8"oświetlenie kabiny", - u8"przyciemnienie oświetlenia kabiny", - u8"bateria", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy", - u8"element ruchomy" - } - } ); - - auto lookup { stringmap.find( Global.asLang ) }; - if( lookup == stringmap.end() ) { - lookup = stringmap.find( "en" ); - } - - locale::strings = lookup->second; - - // prepare cab controls translation table - { - std::vector cabcontrols = { - "mainctrl:", - "jointctrl:", - "scndctrl:", - "shuntmodepower:", - "tempomat_sw:", - "dirkey:", - "brakectrl:", - "localbrake:", - "manualbrake:", - "alarmchain:", - "brakeprofile_sw:", - "brakeprofileg_sw:", - "brakeprofiler_sw:", - "brakeopmode_sw", - "maxcurrent_sw:", - "waterpump_sw:", - "waterpumpbreaker_sw:", - "waterheater_sw:", - "waterheaterbreaker_sw:", - "watercircuitslink_sw:", - "fuelpump_sw:", - "oilpump_sw:", - "motorblowersfront_sw:", - "motorblowersrear_sw:", - "motorblowersalloff_sw:", - "coolingfans_sw:", - "main_off_bt:", - "main_on_bt:", - "security_reset_bt:", - "releaser_bt:", - "sand_bt:", - "antislip_bt:", - "horn_bt:", - "hornlow_bt:", - "hornhigh_bt:", - "whistle_bt:", - "fuse_bt:", - "converterfuse_bt:", - "stlinoff_bt:", - "doorleftpermit_sw:", - "doorrightpermit_sw:", - "doorpermitpreset_sw:", - "door_left_sw:", - "door_right_sw:", - "doorlefton_sw:", - "doorrighton_sw:", - "doorleftoff_sw:", - "doorrightoff_sw:", - "doorallon_sw:", - "dooralloff_sw:", - "doorstep_sw:", - "doormode_sw", - "departure_signal_bt:", - "upperlight_sw:", - "leftlight_sw:", - "rightlight_sw:", - "dimheadlights_sw:", - "leftend_sw:", - "rightend_sw:", - "lights_sw:", - "rearupperlight_sw:", - "rearleftlight_sw:", - "rearrightlight_sw:", - "rearleftend_sw:", - "rearrightend_sw:", - "compressor_sw:", - "compressorlocal_sw:", - "converter_sw:", - "converterlocal_sw:", - "converteroff_sw:", - "main_sw:", - "radio_sw:", - "radiochannel_sw:", - "radiochannelprev_sw:", - "radiochannelnext_sw:", - "radiotest_sw:", - "radiostop_sw:", - "pantfront_sw:", - "pantrear_sw:", - "pantfrontoff_sw:", - "pantrearoff_sw:", - "pantalloff_sw:", - "pantselected_sw:", - "pantselectedoff_sw:", - "pantcompressor_sw:", - "pantcompressorvalve_sw:", - "trainheating_sw:", - "signalling_sw:", - "door_signalling_sw:", - "nextcurrent_sw:", - "instrumentlight_sw:", - "dashboardlight_sw:", - "timetablelight_sw:", - "cablight_sw:", - "cablightdim_sw:", - "battery_sw:", - "universal0:", - "universal1:", - "universal2:", - "universal3:", - "universal4:", - "universal5:", - "universal6:", - "universal7:", - "universal8:", - "universal9:" - }; - - std::size_t stringidx { string::cab_mainctrl }; - for( auto const &cabcontrol : cabcontrols ) { - m_cabcontrols.insert( { cabcontrol, strings[ stringidx++ ] } ); - } - } - */ - void locale::init() { std::fstream stream("lang/" + Global.asLang + ".po", std::ios_base::in | std::ios_base::binary); if (!stream.is_open()) { - WriteLog("translation: cannot open lang file: " + Global.asLang); + WriteLog("translation: cannot open lang file: lang/" + Global.asLang + ".po"); return; } @@ -651,6 +100,7 @@ bool locale::parse_translation(std::istream &stream) } else { if (!msgid.empty() && !msgstr.empty()) { + // TODO: context support is incomplete if (!msgctxt.empty()) lang_mapping.emplace(msgctxt + "\x1d" + msgid, msgstr); else @@ -719,112 +169,112 @@ std::string locale::label_cab_control(std::string const &Label) if( Label.empty() ) { return ""; } static std::unordered_map cabcontrols_labels = { - { "mainctrl:", "master controller" }, - { "jointctrl:", "master controller" }, - { "scndctrl:", "second controller" }, - { "shuntmodepower:", "shunt mode power" }, - { "tempomat_sw:", "tempomat" }, - { "dirkey:", "reverser" }, - { "brakectrl:", "train brake" }, - { "localbrake:", "independent brake" }, - { "manualbrake:", "manual brake" }, - { "alarmchain:", "emergency brake" }, - { "brakeprofile_sw:", "brake acting speed" }, - { "brakeprofileg_sw:", "brake acting speed: cargo" }, - { "brakeprofiler_sw:", "brake acting speed: rapid" }, - { "brakeopmode_sw", "brake operation mode" }, - { "maxcurrent_sw:", "motor overload relay threshold" }, - { "waterpump_sw:", "water pump" }, - { "waterpumpbreaker_sw:", "water pump breaker" }, - { "waterheater_sw:", "water heater" }, - { "waterheaterbreaker_sw:", "water heater breaker" }, - { "watercircuitslink_sw:", "water circuits link" }, - { "fuelpump_sw:", "fuel pump" }, - { "oilpump_sw:", "oil pump" }, - { "motorblowersfront_sw:", "motor blowers A" }, - { "motorblowersrear_sw:", "motor blowers B" }, - { "motorblowersalloff_sw:", "all motor blowers" }, - { "coolingfans_sw:", "cooling fans" }, - { "main_off_bt:", "line breaker" }, - { "main_on_bt:", "line breaker" }, - { "security_reset_bt:", "alerter" }, - { "releaser_bt:", "independent brake releaser" }, - { "sand_bt:", "sandbox" }, - { "antislip_bt:", "wheelspin brake" }, - { "horn_bt:", "horn" }, - { "hornlow_bt:", "low tone horn" }, - { "hornhigh_bt:", "high tone horn" }, - { "whistle_bt:", "whistle" }, - { "fuse_bt:", "motor overload relay reset" }, - { "converterfuse_bt:", "converter overload relay reset" }, - { "stlinoff_bt:", "motor connectors" }, - { "doorleftpermit_sw:", "left door (permit)" }, - { "doorrightpermit_sw:", "right door (permit)" }, - { "doorpermitpreset_sw:", "door (permit)" }, - { "door_left_sw:", "left door" }, - { "door_right_sw:", "right door" }, - { "doorlefton_sw:", "left door (open)" }, - { "doorrighton_sw:", "right door (open)" }, - { "doorleftoff_sw:", "left door (close)" }, - { "doorrightoff_sw:", "right door (close)" }, - { "doorallon_sw:", "all doors (open)" }, - { "dooralloff_sw:", "all doors (close)" }, - { "doorstep_sw:", "doorstep" }, - { "doormode_sw", "door control mode" }, - { "departure_signal_bt:", "departure signal" }, - { "upperlight_sw:", "upper headlight" }, - { "leftlight_sw:", "left headlight" }, - { "rightlight_sw:", "right headlight" }, - { "dimheadlights_sw:", "headlights dimmer" }, - { "leftend_sw:", "left marker light" }, - { "rightend_sw:", "right marker light" }, - { "lights_sw:", "light pattern" }, - { "rearupperlight_sw:", "rear upper headlight" }, - { "rearleftlight_sw:", "rear left headlight" }, - { "rearrightlight_sw:", "rear right headlight" }, - { "rearleftend_sw:", "rear left marker light" }, - { "rearrightend_sw:", "rear right marker light" }, - { "compressor_sw:", "compressor" }, - { "compressorlocal_sw:", "local compressor" }, - { "converter_sw:", "converter" }, - { "converterlocal_sw:", "local converter" }, - { "converteroff_sw:", "converter" }, - { "main_sw:", "line breaker" }, - { "radio_sw:", "radio" }, - { "radiochannel_sw:", "radio channel" }, - { "radiochannelprev_sw:", "radio channel" }, - { "radiochannelnext_sw:", "radio channel" }, - { "radiotest_sw:", "radiostop test" }, - { "radiostop_sw:", "radiostop" }, - { "pantfront_sw:", "pantograph A" }, - { "pantrear_sw:", "pantograph B" }, - { "pantfrontoff_sw:", "pantograph A" }, - { "pantrearoff_sw:", "pantograph B" }, - { "pantalloff_sw:", "all pantographs" }, - { "pantselected_sw:", "selected pantograph" }, - { "pantselectedoff_sw:", "selected pantograph" }, - { "pantcompressor_sw:", "pantograph compressor" }, - { "pantcompressorvalve_sw:", "pantograph 3 way valve" }, - { "trainheating_sw:", "heating" }, - { "signalling_sw:", "braking indicator" }, - { "door_signalling_sw:", "door locking" }, - { "nextcurrent_sw:", "current indicator source" }, - { "instrumentlight_sw:", "instrument light" }, - { "dashboardlight_sw:", "dashboard light" }, - { "timetablelight_sw:", "timetable light" }, - { "cablight_sw:", "interior light" }, - { "cablightdim_sw:", "interior light dimmer" }, - { "battery_sw:", "battery" }, - { "universal0:", "interactive part" }, - { "universal1:", "interactive part" }, - { "universal2:", "interactive part" }, - { "universal3:", "interactive part" }, - { "universal4:", "interactive part" }, - { "universal5:", "interactive part" }, - { "universal6:", "interactive part" }, - { "universal7:", "interactive part" }, - { "universal8:", "interactive part" }, - { "universal9:", "interactive part" } + { "mainctrl:", STRN("master controller") }, + { "jointctrl:", STRN("master controller") }, + { "scndctrl:", STRN("second controller") }, + { "shuntmodepower:", STRN("shunt mode power") }, + { "tempomat_sw:", STRN("tempomat") }, + { "dirkey:", STRN("reverser") }, + { "brakectrl:", STRN("train brake") }, + { "localbrake:", STRN("independent brake") }, + { "manualbrake:", STRN("manual brake") }, + { "alarmchain:", STRN("emergency brake") }, + { "brakeprofile_sw:", STRN("brake acting speed") }, + { "brakeprofileg_sw:", STRN("brake acting speed: cargo") }, + { "brakeprofiler_sw:", STRN("brake acting speed: rapid") }, + { "brakeopmode_sw", STRN("brake operation mode") }, + { "maxcurrent_sw:", STRN("motor overload relay threshold") }, + { "waterpump_sw:", STRN("water pump") }, + { "waterpumpbreaker_sw:", STRN("water pump breaker") }, + { "waterheater_sw:", STRN("water heater") }, + { "waterheaterbreaker_sw:", STRN("water heater breaker") }, + { "watercircuitslink_sw:", STRN("water circuits link") }, + { "fuelpump_sw:", STRN("fuel pump") }, + { "oilpump_sw:", STRN("oil pump") }, + { "motorblowersfront_sw:", STRN("motor blowers A") }, + { "motorblowersrear_sw:", STRN("motor blowers B") }, + { "motorblowersalloff_sw:", STRN("all motor blowers") }, + { "coolingfans_sw:", STRN("cooling fans") }, + { "main_off_bt:", STRN("line breaker") }, + { "main_on_bt:", STRN("line breaker") }, + { "security_reset_bt:", STRN("alerter") }, + { "releaser_bt:", STRN("independent brake releaser") }, + { "sand_bt:", STRN("sandbox") }, + { "antislip_bt:", STRN("wheelspin brake") }, + { "horn_bt:", STRN("horn") }, + { "hornlow_bt:", STRN("low tone horn") }, + { "hornhigh_bt:", STRN("high tone horn") }, + { "whistle_bt:", STRN("whistle") }, + { "fuse_bt:", STRN("motor overload relay reset") }, + { "converterfuse_bt:", STRN("converter overload relay reset") }, + { "stlinoff_bt:", STRN("motor connectors") }, + { "doorleftpermit_sw:", STRN("left door (permit)") }, + { "doorrightpermit_sw:", STRN("right door (permit)") }, + { "doorpermitpreset_sw:", STRN("door (permit)") }, + { "door_left_sw:", STRN("left door") }, + { "door_right_sw:", STRN("right door") }, + { "doorlefton_sw:", STRN("left door (open)") }, + { "doorrighton_sw:", STRN("right door (open)") }, + { "doorleftoff_sw:", STRN("left door (close)") }, + { "doorrightoff_sw:", STRN("right door (close)") }, + { "doorallon_sw:", STRN("all doors (open)") }, + { "dooralloff_sw:", STRN("all doors (close)") }, + { "doorstep_sw:", STRN("doorstep") }, + { "doormode_sw", STRN("door control mode") }, + { "departure_signal_bt:", STRN("departure signal") }, + { "upperlight_sw:", STRN("upper headlight") }, + { "leftlight_sw:", STRN("left headlight") }, + { "rightlight_sw:", STRN("right headlight") }, + { "dimheadlights_sw:", STRN("headlights dimmer") }, + { "leftend_sw:", STRN("left marker light") }, + { "rightend_sw:", STRN("right marker light") }, + { "lights_sw:", STRN("light pattern") }, + { "rearupperlight_sw:", STRN("rear upper headlight") }, + { "rearleftlight_sw:", STRN("rear left headlight") }, + { "rearrightlight_sw:", STRN("rear right headlight") }, + { "rearleftend_sw:", STRN("rear left marker light") }, + { "rearrightend_sw:", STRN("rear right marker light") }, + { "compressor_sw:", STRN("compressor") }, + { "compressorlocal_sw:", STRN("local compressor") }, + { "converter_sw:", STRN("converter") }, + { "converterlocal_sw:", STRN("local converter") }, + { "converteroff_sw:", STRN("converter") }, + { "main_sw:", STRN("line breaker") }, + { "radio_sw:", STRN("radio") }, + { "radiochannel_sw:", STRN("radio channel") }, + { "radiochannelprev_sw:", STRN("radio channel") }, + { "radiochannelnext_sw:", STRN("radio channel") }, + { "radiotest_sw:", STRN("radiostop test") }, + { "radiostop_sw:", STRN("radiostop") }, + { "pantfront_sw:", STRN("pantograph A") }, + { "pantrear_sw:", STRN("pantograph B") }, + { "pantfrontoff_sw:", STRN("pantograph A") }, + { "pantrearoff_sw:", STRN("pantograph B") }, + { "pantalloff_sw:", STRN("all pantographs") }, + { "pantselected_sw:", STRN("selected pantograph") }, + { "pantselectedoff_sw:", STRN("selected pantograph") }, + { "pantcompressor_sw:", STRN("pantograph compressor") }, + { "pantcompressorvalve_sw:", STRN("pantograph 3 way valve") }, + { "trainheating_sw:", STRN("heating") }, + { "signalling_sw:", STRN("braking indicator") }, + { "door_signalling_sw:", STRN("door locking") }, + { "nextcurrent_sw:", STRN("current indicator source") }, + { "instrumentlight_sw:", STRN("instrument light") }, + { "dashboardlight_sw:", STRN("dashboard light") }, + { "timetablelight_sw:", STRN("timetable light") }, + { "cablight_sw:", STRN("interior light") }, + { "cablightdim_sw:", STRN("interior light dimmer") }, + { "battery_sw:", STRN("battery") }, + { "universal0:", STRN("interactive part") }, + { "universal1:", STRN("interactive part") }, + { "universal2:", STRN("interactive part") }, + { "universal3:", STRN("interactive part") }, + { "universal4:", STRN("interactive part") }, + { "universal5:", STRN("interactive part") }, + { "universal6:", STRN("interactive part") }, + { "universal7:", STRN("interactive part") }, + { "universal8:", STRN("interactive part") }, + { "universal9:", STRN("interactive part") } }; auto const it = cabcontrols_labels.find( Label ); diff --git a/translation.h b/translation.h index fb1262c6..570fe83d 100644 --- a/translation.h +++ b/translation.h @@ -12,218 +12,6 @@ http://mozilla.org/MPL/2.0/. #include #include -/* - - driver_aid_header, - driver_aid_throttle, - driver_aid_speedlimit, - driver_aid_nextlimit, - driver_aid_grade, - driver_aid_brakes, - driver_aid_pressures, - driver_aid_alerter, - driver_aid_shp, - driver_aid_loadinginprogress, - driver_aid_vehicleahead, - - driver_scenario_header, - driver_scenario_assignment, - driver_scenario_currenttask, - driver_scenario_waitfororders, - driver_scenario_prepareengine, - driver_scenario_releaseengine, - driver_scenario_changedirection, - driver_scenario_connect, - driver_scenario_disconnect, - driver_scenario_allvehicles, - driver_scenario_onevehicle, - driver_scenario_fewvehicles, - driver_scenario_somevehicles, - driver_scenario_shunt, - driver_scenario_looseshunt, - driver_scenario_obeytrain, - driver_scenario_bank, - - driver_timetable_header, - driver_timetable_name, - driver_timetable_notimetable, - driver_timetable_consistdata, - - driver_transcripts_header, - - driver_pause_header, - driver_pause_resume, - driver_pause_quit, - - debug_vehicle_nameloadstatuscouplers, - debug_vehicle_owned, - debug_vehicle_none, - debug_vehicle_devicespower, - debug_vehicle_radio, - debug_vehicle_oilpressure, - debug_vehicle_controllersenginerevolutions, - debug_vehicle_shuntmode, - debug_vehicle_temperatures, - debug_vehicle_brakespressures, - debug_vehicle_pantograph, - debug_vehicle_forcesaccelerationvelocityposition, - - ui_expand, - ui_loading, - ui_loading_scenery, - ui_quit_simulation_q, - ui_yes, - ui_no, - ui_general, - ui_debug_mode, - ui_quit, - ui_tools, - ui_logging_to_log, - ui_screenshot, - ui_windows, - ui_log, - ui_map, - ui_mode_windows, - - time_window, - time_time, - time_yearday, - time_visibility, - time_weather, - time_temperature, - time_apply, - - map_straight, - map_divert, - map_open, - map_close, - map_obstacle_insert, - map_obstacle_remove, - - vehiclelist_window, - - vehicleparams_window, - vehicleparams_radiostop, - vehicleparams_resetposition, - vehicleparams_reset, - vehicleparams_resetpipe, - vehicleparams_rupturepipe, - vehicleparams_move500f, - vehicleparams_move500b, - - cameraview_window, - - cab_mainctrl, - cab_jointctrl, - cab_scndctrl, - cab_shuntmodepower, - cab_tempomat, - cab_dirkey, - cab_brakectrl, - cab_localbrake, - cab_manualbrake, - cab_alarmchain, - cab_brakeprofile_sw, - cab_brakeprofileg_sw, - cab_brakeprofiler_sw, - cab_brakeopmode_sw, - cab_maxcurrent_sw, - cab_waterpump_sw, - cab_waterpumpbreaker_sw, - cab_waterheater_sw, - cab_waterheaterbreaker_sw, - cab_watercircuitslink_sw, - cab_fuelpump_sw, - cab_oilpump_sw, - cab_motorblowersfront_sw, - cab_motorblowersrear_sw, - cab_motorblowersalloff_sw, - cab_coolingfans_sw, - cab_main_off_bt, - cab_main_on_bt, - cab_security_reset_bt, - cab_releaser_bt, - cab_sand_bt, - cab_antislip_bt, - cab_horn_bt, - cab_hornlow_bt, - cab_hornhigh_bt, - cab_whistle_bt, - cab_fuse_bt, - cab_converterfuse_bt, - cab_stlinoff_bt, - cab_doorleftpermit_sw, - cab_doorrightpermit_sw, - cab_doorpermitpreset_sw, - cab_door_left_sw, - cab_door_right_sw, - cab_doorlefton_sw, - cab_doorrighton_sw, - cab_doorleftoff_sw, - cab_doorrightoff_sw, - cab_doorallon_sw, - cab_dooralloff_sw, - cab_doorstep_sw, - cab_doormode_sw, - cab_departure_signal_bt, - cab_upperlight_sw, - cab_leftlight_sw, - cab_rightlight_sw, - cab_dimheadlights_sw, - cab_leftend_sw, - cab_rightend_sw, - cab_lights_sw, - cab_rearupperlight_sw, - cab_rearleftlight_sw, - cab_rearrightlight_sw, - cab_rearleftend_sw, - cab_rearrightend_sw, - cab_compressor_sw, - cab_compressorlocal_sw, - cab_converter_sw, - cab_converterlocal_sw, - cab_converteroff_sw, - cab_main_sw, - cab_radio_sw, - cab_radiochannel_sw, - cab_radiochannelprev_sw, - cab_radiochannelnext_sw, - cab_radiotest_sw, - cab_radiostop_sw, - cab_pantfront_sw, - cab_pantrear_sw, - cab_pantfrontoff_sw, - cab_pantrearoff_sw, - cab_pantalloff_sw, - cab_pantselected_sw, - cab_pantselectedoff_sw, - cab_pantcompressor_sw, - cab_pantcompressorvalve_sw, - cab_trainheating_sw, - cab_signalling_sw, - cab_door_signalling_sw, - cab_nextcurrent_sw, - cab_instrumentlight_sw, - cab_dashboardlight_sw, - cab_timetablelight_sw, - cab_cablight_sw, - cab_cablightdim_sw, - cab_battery_sw, - cab_universal0, - cab_universal1, - cab_universal2, - cab_universal3, - cab_universal4, - cab_universal5, - cab_universal6, - cab_universal7, - cab_universal8, - cab_universal9, - - string_count - -*/ - class locale { public: void init(); @@ -242,7 +30,8 @@ private: extern locale Translations; -#define STR(x) Translations.lookup_s(#x, true) -#define STR_C(x) Translations.lookup_c(#x, true) -#define STRC(x, c) Translations.lookup_s(c "\x1d" #x, true) -#define STRC_C(x, c) Translations.lookup_c(c "\x1d" #x, true) +#define STR(x) Translations.lookup_s(x, true) +#define STR_C(x) Translations.lookup_c(x, true) +#define STRN(x) x + +//find . -name "*.cpp" | xargs xgettext --from-code="UTF-8" -k --keyword=STR --keyword=STR_C --keyword=STRN diff --git a/uilayer.cpp b/uilayer.cpp index 596d5a0a..ca9d1bdd 100644 --- a/uilayer.cpp +++ b/uilayer.cpp @@ -77,7 +77,7 @@ void ui_panel::register_popup(std::unique_ptr &&popup) void ui_expandable_panel::render_contents() { - ImGui::Checkbox(STR_C(ui_expand), &is_expanded); + ImGui::Checkbox(STR_C("expand"), &is_expanded); ui_panel::render_contents(); } @@ -269,14 +269,14 @@ void ui_layer::render_quit_widget() return; ImGui::SetNextWindowSize(ImVec2(0, 0)); - ImGui::Begin(STR_C(ui_quit), &m_quit_active, ImGuiWindowFlags_NoResize); - ImGui::TextUnformatted(STR_C(ui_quit_simulation_q)); - if (ImGui::Button(STR_C(ui_yes))) { + ImGui::Begin(STR_C("Quit"), &m_quit_active, ImGuiWindowFlags_NoResize); + ImGui::TextUnformatted(STR_C("Quit simulation?")); + if (ImGui::Button(STR_C("Yes"))) { command_relay relay; relay.post(user_command::quitsimulation, 0.0, 0.0, GLFW_PRESS, 0); } ImGui::SameLine(); - if (ImGui::Button(STR_C(ui_no))) + if (ImGui::Button(STR_C("No"))) m_quit_active = false; ImGui::End(); } @@ -334,7 +334,7 @@ void ui_layer::render_progress() ImGui::SetNextWindowPos(ImVec2(50, 50)); ImGui::SetNextWindowSize(ImVec2(0, 0)); - ImGui::Begin(STR_C(ui_loading), nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + ImGui::Begin(STR_C("Loading"), nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); if (!m_progresstext.empty()) ImGui::ProgressBar(m_progress, ImVec2(300, 0), m_progresstext.c_str()); else @@ -366,32 +366,32 @@ void ui_layer::render_tooltip() void ui_layer::render_menu_contents() { - if (ImGui::BeginMenu(STR_C(ui_general))) + if (ImGui::BeginMenu(STR_C("General"))) { - ImGui::MenuItem(STR_C(ui_debug_mode), nullptr, &DebugModeFlag); - ImGui::MenuItem(STR_C(ui_quit), "F10", &m_quit_active); + ImGui::MenuItem(STR_C("Debug mode"), nullptr, &DebugModeFlag); + ImGui::MenuItem(STR_C("Quit"), "F10", &m_quit_active); ImGui::EndMenu(); } - if (ImGui::BeginMenu(STR_C(ui_tools))) + if (ImGui::BeginMenu(STR_C("Tools"))) { static bool log = Global.iWriteLogEnabled & 1; - ImGui::MenuItem(STR_C(ui_logging_to_log), nullptr, &log); + ImGui::MenuItem(STR_C("Logging to log.txt"), nullptr, &log); if (log) Global.iWriteLogEnabled |= 1; else Global.iWriteLogEnabled &= ~1; - if (ImGui::MenuItem(STR_C(ui_screenshot), "PrtScr")) + if (ImGui::MenuItem(STR_C("Screenshot"), "PrtScr")) Application.queue_screenshot(); ImGui::EndMenu(); } - if (ImGui::BeginMenu(STR_C(ui_windows))) + if (ImGui::BeginMenu(STR_C("Windows"))) { - ImGui::MenuItem(STR_C(ui_log), "F9", &m_logpanel.is_open); + ImGui::MenuItem(STR_C("Log"), "F9", &m_logpanel.is_open); if (DebugModeFlag) { - ImGui::MenuItem("ImGui Demo", nullptr, &m_imgui_demo); - ImGui::MenuItem("Headlight config", nullptr, &GfxRenderer.debug_ui_active); + ImGui::MenuItem(STR_C("ImGui Demo"), nullptr, &m_imgui_demo); + ImGui::MenuItem(STR_C("Headlight config"), nullptr, &GfxRenderer.debug_ui_active); } ImGui::EndMenu(); } diff --git a/widgets/cameraview.cpp b/widgets/cameraview.cpp index 54f7b4ca..95f7f9c8 100644 --- a/widgets/cameraview.cpp +++ b/widgets/cameraview.cpp @@ -4,7 +4,7 @@ #include "Logs.h" ui::cameraview_panel::cameraview_panel() - : ui_panel(STR_C(cameraview_window), false) + : ui_panel(STR_C("Camera preview"), false) { size_min = { -2, -2 }; } @@ -103,6 +103,7 @@ void ui::cameraview_panel::workthread_func() if (buffer) { int w, h; + stbi_set_flip_vertically_on_load(0); uint8_t *image = stbi_load_from_memory(buffer, len, &w, &h, nullptr, 4); if (!image) ErrorLog(std::string(stbi_failure_reason())); diff --git a/widgets/map.cpp b/widgets/map.cpp index 3ea417af..79c8c825 100644 --- a/widgets/map.cpp +++ b/widgets/map.cpp @@ -8,7 +8,7 @@ #include "Driver.h" #include "AnimModel.h" -ui::map_panel::map_panel() : ui_panel(STR_C(ui_map), false) +ui::map_panel::map_panel() : ui_panel(STR_C("Map"), false) { size_min = {200, 200}; size_max = {fb_size, fb_size}; @@ -445,13 +445,13 @@ void ui::launcher_window::render_content() { ImGui::TextUnformatted(m_switch->name.c_str()); - const std::string &open_label = STR( + const std::string &open_label = m_switch->type == map::launcher::track_switch - ? locale::string::map_straight : locale::string::map_open); + ? STR("Straight |") : STR("Open |"); - const std::string &close_label = STR( + const std::string &close_label = m_switch->type == map::launcher::track_switch - ? locale::string::map_divert : locale::string::map_close); + ? STR("Divert /") : STR("Close -"); if (ImGui::Button(open_label.c_str())) { @@ -495,7 +495,7 @@ void ui::obstacle_insert_window::render_content() return; } - ImGui::TextUnformatted(STR_C(map_obstacle_insert)); + ImGui::TextUnformatted(STR_C("Insert obstacle:")); for (auto const &entry : m_obstacles) { if (ImGui::Button(entry.first.c_str())) @@ -526,7 +526,7 @@ ui::obstacle_remove_window::obstacle_remove_window(ui_panel &panel, std::shared_ void ui::obstacle_remove_window::render_content() { - if (ImGui::Button(STR_C(map_obstacle_remove))) { + if (ImGui::Button(STR_C("Delete obstacle"))) { m_relay.post(user_command::deletemodel, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(), &m_obstacle->model_name); auto &entries = map::Objects.entries; diff --git a/widgets/perfgraphs.cpp b/widgets/perfgraphs.cpp index 4ce6e413..9e5a6d0a 100644 --- a/widgets/perfgraphs.cpp +++ b/widgets/perfgraphs.cpp @@ -3,13 +3,13 @@ #include "Timer.h" perfgraph_panel::perfgraph_panel() - : ui_panel("Perf", false) + : ui_panel(STR("Performance"), false) { } void perfgraph_panel::render_contents() { - if (ImGui::BeginCombo("Timer", timer_label[current_timer].c_str())) // The second parameter is the label previewed before opening the combo. + if (ImGui::BeginCombo(STR_C("Timer"), timer_label[current_timer].c_str())) // The second parameter is the label previewed before opening the combo. { for (size_t i = 0; i < (size_t)TIMER_MAX; i++) { @@ -57,6 +57,6 @@ void perfgraph_panel::render_contents() { if (pos >= history.size()) pos = 0; - ImGui::SliderFloat("Range", &max, 0.1f, 250.0f); + ImGui::SliderFloat(STR_C("Range"), &max, 0.1f, 250.0f); ImGui::PlotLines("##timer", &history[0], history.size(), pos, label.c_str(), 0.0f, max, ImVec2(500, 200)); } diff --git a/widgets/time.cpp b/widgets/time.cpp index 17557eea..6929e6e2 100644 --- a/widgets/time.cpp +++ b/widgets/time.cpp @@ -3,20 +3,20 @@ #include "simulationtime.h" #include "Globals.h" -ui::time_panel::time_panel() : ui_panel(STR_C(time_window), false) +ui::time_panel::time_panel() : ui_panel(STR_C("Time and environment"), false) { size.x = 450; } void ui::time_panel::render_contents() { - ImGui::SliderFloat(STR_C(time_time), &time, 0.0f, 24.0f, "%.1f"); - ImGui::SliderInt(STR_C(time_yearday), &yearday, 1, 365); - ImGui::SliderFloat(STR_C(time_visibility), &fog, 50.0f, 3000.0f, "%.0f"); - ImGui::SliderFloat(STR_C(time_weather), &overcast, 0.0f, 2.0f, "%.1f"); - ImGui::SliderFloat(STR_C(time_temperature), &temperature, -20.0f, 40.0f, "%.0f"); + ImGui::SliderFloat(STR_C("Time"), &time, 0.0f, 24.0f, "%.1f"); + ImGui::SliderInt(STR_C("Day in year"), &yearday, 1, 365); + ImGui::SliderFloat(STR_C("Visibility"), &fog, 50.0f, 3000.0f, "%.0f"); + ImGui::SliderFloat(STR_C("Overcast and precipitation"), &overcast, 0.0f, 2.0f, "%.1f"); + ImGui::SliderFloat(STR_C("Temperature"), &temperature, -20.0f, 40.0f, "%.0f"); - if (ImGui::Button(STR_C(time_apply))) + if (ImGui::Button(STR_C("Apply"))) { m_relay.post(user_command::setdatetime, (double)yearday, time, 1, 0); m_relay.post(user_command::setweather, fog, overcast, 1, 0); diff --git a/widgets/vehiclelist.cpp b/widgets/vehiclelist.cpp index 0964ffff..163b8171 100644 --- a/widgets/vehiclelist.cpp +++ b/widgets/vehiclelist.cpp @@ -5,7 +5,7 @@ #include "widgets/vehicleparams.h" ui::vehiclelist_panel::vehiclelist_panel(ui_layer &parent) - : ui_panel(STR_C(vehiclelist_window), false), m_parent(parent) + : ui_panel(STR_C("Vehicle list"), false), m_parent(parent) { } diff --git a/widgets/vehicleparams.cpp b/widgets/vehicleparams.cpp index 4899683c..dec2f11e 100644 --- a/widgets/vehicleparams.cpp +++ b/widgets/vehicleparams.cpp @@ -6,7 +6,7 @@ #include "Train.h" ui::vehicleparams_panel::vehicleparams_panel(const std::string &vehicle) - : ui_panel(std::string(STR(vehicleparams_window)) + ": " + vehicle, false), m_vehicle_name(vehicle) + : ui_panel(std::string(STR("Vehicle parameters")) + ": " + vehicle, false), m_vehicle_name(vehicle) { } @@ -53,7 +53,7 @@ void ui::vehicleparams_panel::render_contents() std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_devicespower), + STR_C("Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f"), // devices ( mover.Battery ? 'B' : '.' ), ( mover.Mains ? 'M' : '.' ), @@ -70,7 +70,7 @@ void ui::vehicleparams_panel::render_contents() ( mover.CompressorFlag ? 'C' : ( false == mover.CompressorAllowLocal ? '-' : ( ( mover.CompressorAllow || mover.CompressorStart == start_t::automatic ) ? 'c' : '.' ) ) ), ( mover.CompressorGovernorLock ? '!' : '.' ), "", - std::string( isdieselenginepowered ? STR(debug_vehicle_oilpressure) + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(), + std::string( isdieselenginepowered ? STR(" oil pressure: ") + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(), // power transfers mover.Couplers[ end::front ].power_high.voltage, mover.Couplers[ end::front ].power_high.current, @@ -84,11 +84,11 @@ void ui::vehicleparams_panel::render_contents() std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_controllersenginerevolutions), + STR_C("Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f"), // controllers mover.MainCtrlPos, mover.MainCtrlActualPos, - std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(debug_vehicle_shuntmode) : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(), + std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(" (shunt mode)") : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(), // engine mover.EnginePower, std::abs( mover.TrainType == dt_EZT ? mover.ShowCurrent( 0 ) : mover.Im ), @@ -106,7 +106,7 @@ void ui::vehicleparams_panel::render_contents() if( isdieselenginepowered ) { std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_temperatures), + STR_C("\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f"), mover.dizel_heat.Ts, mover.dizel_heat.To, mover.dizel_heat.temperatura1, @@ -132,7 +132,7 @@ void ui::vehicleparams_panel::render_contents() std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_brakespressures), + STR_C("Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f"), // brakes mover.fBrakeCtrlPos, mover.LocalBrakePosA, @@ -158,7 +158,7 @@ void ui::vehicleparams_panel::render_contents() if( mover.EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) { std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_pantograph), + STR_C(" pantograph: %.2f%cMT"), mover.PantPress, ( mover.bPantKurek3 ? '-' : '|' ) ); ImGui::TextUnformatted(buffer.data()); @@ -166,7 +166,7 @@ void ui::vehicleparams_panel::render_contents() std::snprintf( buffer.data(), buffer.size(), - STR_C(debug_vehicle_forcesaccelerationvelocityposition), + STR_C("Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]"), // forces mover.Ft * 0.001f * ( mover.ActiveCab ? mover.ActiveCab : vehicle.ctOwner ? vehicle.ctOwner->Controlling()->ActiveCab : 1 ) + 0.001f, mover.Fb * 0.001f, @@ -186,40 +186,40 @@ void ui::vehicleparams_panel::render_contents() ImGui::TextUnformatted(buffer.data()); - if (ImGui::Button(STR_C(vehicleparams_radiostop))) + if (ImGui::Button(STR_C("Radiostop"))) m_relay.post(user_command::radiostop, 0.0, 0.0, GLFW_PRESS, 0, vehicle_ptr->GetPosition()); ImGui::SameLine(); - if (ImGui::Button(STR_C(vehicleparams_reset))) + if (ImGui::Button(STR_C("Stop and repair"))) m_relay.post(user_command::resetconsist, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); ImGui::SameLine(); - if (ImGui::Button(STR_C(vehicleparams_resetposition))) { + if (ImGui::Button(STR_C("Reset position"))) { std::string payload = vehicle_ptr->name() + '%' + vehicle_ptr->initial_track->name(); m_relay.post(user_command::consistteleport, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &payload); m_relay.post(user_command::resetconsist, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); } - if (ImGui::Button(STR_C(vehicleparams_resetpipe))) + if (ImGui::Button(STR_C("Refill main tank"))) m_relay.post(user_command::fillcompressor, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); ImGui::SameLine(); - if (ImGui::Button(STR_C(vehicleparams_rupturepipe))) + if (ImGui::Button(STR_C("Rupture main pipe"))) m_relay.post(user_command::pullalarmchain, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); ImGui::SameLine(); - ImGui::Button(STR_C(cab_releaser_bt)); + ImGui::Button(STR_C("independent brake releaser")); if (ImGui::IsItemClicked()) m_relay.post(user_command::consistreleaser, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); if (ImGui::IsItemDeactivated()) m_relay.post(user_command::consistreleaser, 0.0, 0.0, GLFW_RELEASE, 0, glm::vec3(0.0f), &vehicle_ptr->name()); if (vehicle_ptr->MoverParameters->V < 0.01) { - if (ImGui::Button(STR_C(vehicleparams_move500f))) + if (ImGui::Button(STR_C("Move +500m"))) m_relay.post(user_command::dynamicmove, 500.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); ImGui::SameLine(); - if (ImGui::Button(STR_C(vehicleparams_move500b))) + if (ImGui::Button(STR_C("Move -500m"))) m_relay.post(user_command::dynamicmove, -500.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name()); } } diff --git a/winheaders.h b/winheaders.h index 484963de..b50e971e 100644 --- a/winheaders.h +++ b/winheaders.h @@ -38,40 +38,6 @@ typedef struct _SYSTEMTIME { BI_CMYKRLE4 = 0x000D } Compression; -typedef struct tagBITMAPFILEHEADER { - WORD bfType; - DWORD bfSize; - WORD bfReserved1; - WORD bfReserved2; - DWORD bfOffBits; -} __attribute__((packed)) BITMAPFILEHEADER, *PBITMAPFILEHEADER; - -typedef struct tagRGBQUAD { - BYTE rgbBlue; - BYTE rgbGreen; - BYTE rgbRed; - BYTE rgbReserved; -} __attribute__((packed)) RGBQUAD; - -typedef struct tagBITMAPINFOHEADER { - DWORD biSize; - LONG biWidth; - LONG biHeight; - WORD biPlanes; - WORD biBitCount; - DWORD biCompression; - DWORD biSizeImage; - LONG biXPelsPerMeter; - LONG biYPelsPerMeter; - DWORD biClrUsed; - DWORD biClrImportant; -} __attribute__((packed)) BITMAPINFOHEADER, *PBITMAPINFOHEADER; - -typedef struct tagBITMAPINFO { - BITMAPINFOHEADER bmiHeader; - RGBQUAD bmiColors[1]; -} __attribute__((packed)) BITMAPINFO, *PBITMAPINFO; - #ifndef MAKEFOURCC #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \