using System.Collections.Generic; using System.Globalization; namespace Eu07.BlackBox.Views; /// /// The texts of the window, by key. The starter gives its own translations; on its /// own the window speaks Polish or English, as the system does. /// public interface IBlackBoxStrings { string this[string key] { get; } } public sealed class DefaultBlackBoxStrings : IBlackBoxStrings { private static readonly Dictionary English = new() { ["Title"] = "Black box", ["TitleOf"] = "Black box – {0}", ["Open"] = "Open…", ["Reload"] = "Reload", ["Live"] = "Follow the file", ["LiveTip"] = "Reads what the simulator adds to the file every 2 seconds", ["Play"] = "Play", ["Pause"] = "Pause", ["Follow"] = "Follow the train", ["Fit"] = "Whole map", ["NoFile"] = "Open a black box: physicslog/*.blackbox, written with the physics logs on.", ["Unreadable"] = "Can't read {0}: {1}", ["Reading"] = "Reading {0}…", ["Summary"] = "{0} · {1:0.0} km · max {2:0} km/h · driven {3} · autopilot {4} · over the AI {5} ({6} by more than {7:0} km/h, at most +{8:0} km/h) · signals {9} · at danger {10} · commands {11}", ["NotComplete"] = "still being written, or cut short", ["Cursor"] = "{0} · {1:0} km/h · AI {2} · limit {3}", ["CursorNoAi"] = "{0} · {1:0} km/h · no AI data", ["CursorOut"] = "{0} · not in a vehicle", ["None"] = "–", ["LimitAt"] = "{0:0} km/h in {1:0} m", ["EventCommand"] = "{0}", ["EventAutopilotOn"] = "Autopilot on", ["EventAutopilotOff"] = "Autopilot off", ["EventPassed"] = "Signal {0}: {1}, {2:0} km/h", ["EventDanger"] = "PASSED AT DANGER {0}, {1:0} km/h, {2:0} m beyond", ["EventInVehicle"] = "In {0}", ["EventOutside"] = "Out of the cab of {0}", ["EventNoVehicle"] = "Not in any vehicle", ["EventEnd"] = "End of the recording", ["AspectStop"] = "stop", ["AspectFree"] = "go", ["AspectSpeed"] = "{0:0}/{1}", ["LegendTitle"] = "The train's way: its speed against the AI's", ["LegendWithin"] = "no faster than the AI", ["LegendSlightly"] = "up to {0:0} km/h faster than the AI", ["LegendOver"] = "over {0:0} km/h faster than the AI", ["LegendAutopilot"] = "the autopilot drove", ["LegendNoData"] = "no AI to compare with", ["LegendMarks"] = "Signs on the map", ["TimelineSpeed"] = "speed", ["TimelineTarget"] = "AI", ["TimelineLimit"] = "next limit", ["BandEvents"] = "events", ["KeyStation"] = "station", ["KeyHorn"] = "W6 horn", ["KeySignal"] = "signal passed", ["KeyCoupling"] = "coupling", ["KeyDriver"] = "autopilot on/off", ["KeyCommand"] = "command", ["TlSignal"] = "signal {0} passed: {1}", ["TlSignalDanger"] = "signal {0} passed at stop", ["TlCoupled"] = "coupled", ["TlUncoupled"] = "uncoupled", ["TlCouplingChanged"] = "a coupling changed", ["TlAutopilotOn"] = "the autopilot switched on", ["TlAutopilotOff"] = "the user takes over", ["TlStationStopped"] = "{0}: stopped", ["TlStationPassed"] = "{0}: passed", ["TlStationMissed"] = "{0}: missed", ["TlHornSounded"] = "W6: the horn sounded", ["TlHornSilent"] = "W6: no horn", ["TlCommand"] = "command: {0}", ["BandDriving"] = "driving", ["BandBrakes"] = "brakes", ["BandAlerter"] = "alerter", ["BandController"] = "controller", ["Cab"] = "Cab", ["CabNoData"] = "The user was in no vehicle then.", ["CabController"] = "Master controller", ["CabShunt"] = "Field shunting", ["CabReverser"] = "Reverser", ["CabForward"] = "forward", ["CabBackward"] = "backward", ["CabNeutral"] = "0", ["CabTrainBrake"] = "Driver's brake valve", ["CabLocalBrake"] = "Local brake", ["CabReservoir"] = "Main reservoir", ["CabCylinder"] = "Brake cylinders", ["CabPipe"] = "Brake pipe", ["CabCurrent"] = "Current", ["CabVoltage"] = "Voltage", ["CabRpm"] = "Revolutions", ["CabLights"] = "Lights", ["CabLightsFront"] = "front", ["CabLightsRear"] = "rear", ["DevBattery"] = "Battery", ["DevMainBreaker"] = "Main breaker", ["DevPantographFront"] = "Front pantograph", ["DevPantographRear"] = "Rear pantograph", ["DevConverter"] = "Converter", ["DevCompressor"] = "Compressor", ["DevLineContactors"] = "Line contactors", ["DevHeating"] = "Train heating", ["DevRadio"] = "Radio", ["DevShuntMode"] = "Shunting mode", ["DevDoorsLeft"] = "Left doors", ["DevDoorsRight"] = "Right doors", ["DevSanding"] = "Sanding", ["DevHorn"] = "Horn", ["DevSpringBrake"] = "Spring brake", ["DevAlerter"] = "Alerter", ["DevWheelSlip"] = "Wheel slip", ["DevOverloadRelay"] = "Overload relay", ["DevRadioStop"] = "Radio-stop", ["DevAlarmChain"] = "Emergency brake", ["TabEvents"] = "Events", ["TabTimetable"] = "Timetable", ["TabSummary"] = "Summary", ["PanelMap"] = "Map", ["PanelTimeline"] = "Run", ["Relation"] = "{0} → {1}", ["StatDistance"] = "Distance", ["StatMaxSpeed"] = "Top speed", ["StatDriven"] = "Driven by the user", ["StatAutopilotSub"] = "autopilot {0}", ["StatOverAi"] = "Over the AI", ["StatOverAiSub"] = "{0} by >{1:0} km/h · up to +{2:0}", ["StatSignals"] = "Signals", ["StatSignalsSub"] = "{0} at danger", ["StatStops"] = "Stops", ["StatStopsSub"] = "{0} missed", ["StatDelay"] = "Largest delay", ["StatDelaySub"] = "leaving a station: {0} at most", ["StatPlatform"] = "Stops off the platform", ["StatLights"] = "Head and tail signals", ["StatLightsRight"] = "right", ["StatLightsSub"] = "as required all the {0} on the move", ["StatLightsHead"] = "head {0} instead of {1}", ["StatLightsTail"] = "tail {0} instead of {1}", ["StatPlatformAt"] = "{0} {1:0.0} m", ["StatPlatformNone"] = "the whole train along the platform at every stop", ["StatHorn"] = "Horn at W6", ["StatHornSub"] = "{0} without the horn", ["StatAcceleration"] = "Acceleration", ["StatAccelerationSub"] = "lateral up to {0:0.00} m/s²", ["StatSecurity"] = "CA/SHP braking", ["StatRecording"] = "Recording", ["StatComplete"] = "complete", ["StatIncomplete"] = "being written or cut short", ["Minutes"] = "{0:+0.0;−0.0;0} min", ["OnTime"] = "on time", ["DelayNow"] = "delay {0}", ["DelayStanding"] = "{0} standing at {1}", ["DelayAfter"] = "{0} after {1}", ["TimetableNone"] = "The user's train had no timetable.", ["TtArrived"] = "arr. {0}", ["TtDeparted"] = "dep. {0}", ["TtPassed"] = "passed {0}", ["TtMissed"] = "stop missed", ["TtLeftEarly"] = "left early", ["TtStopShort"] = "{0:0.0} m short", ["TtStopPast"] = "{0:0.0} m past", ["TtStopExact"] = "on the spot", ["TtOnPlatform"] = "along the platform", ["TtOffPlatform"] = "{0:0.0} m of the train off the platform", ["TtTechnical"] = "technical stop", ["TtStanding"] = "standing", ["EventStopped"] = "Stop at {0}, {1}", ["EventStationPassed"] = "Passed {0}", ["EventStationMissed"] = "STOP MISSED: {0}", ["EventReady"] = "{0}: time to leave", ["EventHornSounded"] = "W6: horn sounded", ["EventHornMissed"] = "W6: NO HORN", ["EventCab"] = "Cab {0} of {1}", ["EventSecurityBraking"] = "BRAKING BY {0}", ["EventTimetable"] = "Timetable {0}, {1}", ["CabSpeed"] = "Speed", ["CabAiTarget"] = "AI {0:0} km/h", ["CabAcceleration"] = "Along", ["CabLateral"] = "Lateral", ["CabEndFront"] = "A", ["CabEndRear"] = "B", ["CabDriverUser"] = "user drives", ["CabDriverAi"] = "autopilot", ["CabOutside"] = "outside the cab", ["CabLightsHead"] = "head", ["CabLightsTail"] = "tail", ["CabSectionBrakes"] = "Brakes", ["CabSectionDrive"] = "Traction", ["CabSectionControls"] = "Controls", ["CabSectionDevices"] = "Devices", ["CabGroupPower"] = "Power", ["CabGroupDriving"] = "Driving", ["CabGroupSafety"] = "Safety", ["CabLightsWant"] = "{0}, should be {1}", ["DevVigilance"] = "CA", ["DevCabSignal"] = "SHP", ["DevSecurityBraking"] = "CA/SHP braking", ["LegendStopPoint"] = "W4 stop point", ["LegendShortStop"] = "W32 stop for shorter trains", ["ShortStopHover"] = "W32 {0}", ["LegendHorn"] = "W6 horn point", ["BandVigilance"] = "CA", ["BandCabSignal"] = "SHP", ["StopPointHover"] = "W4 {0}", ["PlatformHover"] = "platform {0:0} m", ["ShortTrainsHover"] = "for trains up to {0:0} m", ["StopHeadHover"] = "the head to stop {0:0} m before it", ["StopMiddleHover"] = "the middle of the train to stop {0:0} m before it", ["HornHover"] = "W6 {0} · {1:0} s", ["ZoomIn"] = "Zoom in", ["ZoomOut"] = "Zoom out", ["EventCamera"] = "Camera: {0}", ["CameraCab"] = "in the cab", ["CameraExternal"] = "outside view", ["CameraFree"] = "free camera", ["CameraDebug"] = "debug camera", ["EventCoupled"] = "Coupled {0} to {1}", ["EventUncoupled"] = "Uncoupled {0} from {1}", ["EventCouplingChanged"] = "{0} – {1}: {2}", ["CouplingCoupler"] = "coupler", ["CouplingBrakePipe"] = "brake pipe", ["CouplingControl"] = "control", ["CouplingPower"] = "high voltage", ["CouplingGangway"] = "gangway", ["CouplingMainPipe"] = "main pipe", ["CouplingHeating"] = "heating", ["CouplingNothing"] = "nothing", ["BandCamera"] = "camera", ["LegendCamera"] = "camera", ["Events"] = "Events", ["OnlyUser"] = "only the user's", ["FileFilter"] = "Black box" }; private static readonly Dictionary Polish = new() { ["Title"] = "Czarna skrzynka", ["TitleOf"] = "Czarna skrzynka – {0}", ["Open"] = "Otwórz…", ["Reload"] = "Odśwież", ["Live"] = "Śledź plik", ["LiveTip"] = "Co 2 sekundy doczytuje to, co symulator dopisał do pliku", ["Play"] = "Odtwarzaj", ["Pause"] = "Pauza", ["Follow"] = "Śledź pociąg", ["Fit"] = "Cała mapa", ["NoFile"] = "Otwórz czarną skrzynkę: physicslog/*.blackbox, zapisywaną razem z logami fizyki.", ["Unreadable"] = "Nie można odczytać {0}: {1}", ["Reading"] = "Czytanie {0}…", ["Summary"] = "{0} · {1:0.0} km · maks. {2:0} km/h · jazda {3} · autopilot {4} · ponad AI {5} (w tym {6} o więcej niż {7:0} km/h, najwyżej +{8:0} km/h) · sygnalizatory {9} · minięte na „Stój” {10} · komendy {11}", ["NotComplete"] = "wciąż zapisywana albo ucięta", ["Cursor"] = "{0} · {1:0} km/h · AI {2} · ograniczenie {3}", ["CursorNoAi"] = "{0} · {1:0} km/h · brak danych AI", ["CursorOut"] = "{0} · poza pojazdem", ["None"] = "–", ["LimitAt"] = "{0:0} km/h za {1:0} m", ["EventCommand"] = "{0}", ["EventAutopilotOn"] = "Autopilot włączony", ["EventAutopilotOff"] = "Autopilot wyłączony", ["EventPassed"] = "Sygnalizator {0}: {1}, {2:0} km/h", ["EventDanger"] = "MINIĘTY NA „STÓJ” {0}, {1:0} km/h, {2:0} m za nim", ["EventInVehicle"] = "W {0}", ["EventOutside"] = "Poza kabiną {0}", ["EventNoVehicle"] = "Poza pojazdami", ["EventEnd"] = "Koniec nagrania", ["AspectStop"] = "stój", ["AspectFree"] = "wolna droga", ["AspectSpeed"] = "{0:0}/{1}", ["LegendTitle"] = "Ślad pociągu: prędkość wobec AI", ["LegendWithin"] = "nie szybciej niż AI", ["LegendSlightly"] = "do {0:0} km/h szybciej niż AI", ["LegendOver"] = "ponad {0:0} km/h szybciej niż AI", ["LegendAutopilot"] = "prowadził autopilot", ["LegendNoData"] = "brak AI do porównania", ["LegendMarks"] = "Znaki na mapie", ["TimelineSpeed"] = "prędkość", ["TimelineTarget"] = "AI", ["TimelineLimit"] = "następne ograniczenie", ["BandEvents"] = "zdarzenia", ["KeyStation"] = "stacja", ["KeyHorn"] = "W6 trąbienie", ["KeySignal"] = "minięty semafor", ["KeyCoupling"] = "sprzęg", ["KeyDriver"] = "autopilot wł./wył.", ["KeyCommand"] = "polecenie", ["TlSignal"] = "semafor {0} minięty: {1}", ["TlSignalDanger"] = "semafor {0} minięty na „Stój”", ["TlCoupled"] = "sprzęg połączony", ["TlUncoupled"] = "sprzęg rozłączony", ["TlCouplingChanged"] = "zmiana na sprzęgu", ["TlAutopilotOn"] = "autopilot włączony", ["TlAutopilotOff"] = "prowadzenie przejmuje użytkownik", ["TlStationStopped"] = "{0}: postój", ["TlStationPassed"] = "{0}: przejazd", ["TlStationMissed"] = "{0}: pominięta", ["TlHornSounded"] = "W6: zatrąbiono", ["TlHornSilent"] = "W6: bez trąbienia", ["TlCommand"] = "polecenie: {0}", ["BandDriving"] = "jazda", ["BandBrakes"] = "hamulce", ["BandAlerter"] = "czuwak", ["BandController"] = "nastawnik", ["Cab"] = "Kabina", ["CabNoData"] = "Użytkownik nie był wtedy w żadnym pojeździe.", ["CabController"] = "Nastawnik", ["CabShunt"] = "Bocznik", ["CabReverser"] = "Kierunek", ["CabForward"] = "naprzód", ["CabBackward"] = "wstecz", ["CabNeutral"] = "0", ["CabTrainBrake"] = "Hamulec zespolony", ["CabLocalBrake"] = "Hamulec pomocniczy", ["CabReservoir"] = "Zbiornik główny", ["CabCylinder"] = "Cylindry", ["CabPipe"] = "Przewód główny", ["CabCurrent"] = "Prąd", ["CabVoltage"] = "Napięcie", ["CabRpm"] = "Obroty", ["CabLights"] = "Światła", ["CabLightsFront"] = "przód", ["CabLightsRear"] = "tył", ["DevBattery"] = "Baterie", ["DevMainBreaker"] = "WS", ["DevPantographFront"] = "Pantograf przedni", ["DevPantographRear"] = "Pantograf tylny", ["DevConverter"] = "Przetwornica", ["DevCompressor"] = "Sprężarka", ["DevLineContactors"] = "Styczniki liniowe", ["DevHeating"] = "Ogrzewanie", ["DevRadio"] = "Radiotelefon", ["DevShuntMode"] = "Jazda manewrowa", ["DevDoorsLeft"] = "Drzwi lewe", ["DevDoorsRight"] = "Drzwi prawe", ["DevSanding"] = "Piasecznica", ["DevHorn"] = "Syrena", ["DevSpringBrake"] = "Hamulec sprężynowy", ["DevAlerter"] = "Czuwak", ["DevWheelSlip"] = "Poślizg", ["DevOverloadRelay"] = "Nadmiarowy", ["DevRadioStop"] = "Radiostop", ["DevAlarmChain"] = "Hamulec bezpieczeństwa", ["TabEvents"] = "Zdarzenia", ["TabTimetable"] = "Rozkład", ["TabSummary"] = "Podsumowanie", ["PanelMap"] = "Mapa", ["PanelTimeline"] = "Przebieg jazdy", ["Relation"] = "{0} → {1}", ["StatDistance"] = "Dystans", ["StatMaxSpeed"] = "Prędkość maks.", ["StatDriven"] = "Jazda użytkownika", ["StatAutopilotSub"] = "autopilot {0}", ["StatOverAi"] = "Ponad AI", ["StatOverAiSub"] = "{0} o >{1:0} km/h · do +{2:0}", ["StatSignals"] = "Sygnalizatory", ["StatSignalsSub"] = "{0} na „Stój”", ["StatStops"] = "Postoje", ["StatStopsSub"] = "{0} pominięte", ["StatDelay"] = "Największe opóźnienie", ["StatDelaySub"] = "przy odjeździe: najwyżej {0}", ["StatPlatform"] = "Postoje poza peronem", ["StatLights"] = "Sygnały czoła i końca", ["StatLightsRight"] = "zgodne", ["StatLightsSub"] = "jak trzeba przez całe {0} jazdy", ["StatLightsHead"] = "czoło {0} zamiast {1}", ["StatLightsTail"] = "koniec {0} zamiast {1}", ["StatPlatformAt"] = "{0} {1:0.0} m", ["StatPlatformNone"] = "na każdym postoju cały skład przy peronie", ["StatHorn"] = "Trąbienie na W6", ["StatHornSub"] = "{0} bez trąbienia", ["StatAcceleration"] = "Przyspieszenie", ["StatAccelerationSub"] = "boczne do {0:0.00} m/s²", ["StatSecurity"] = "Hamowania CA/SHP", ["StatRecording"] = "Nagranie", ["StatComplete"] = "pełne", ["StatIncomplete"] = "w trakcie zapisu lub ucięte", ["Minutes"] = "{0:+0.0;−0.0;0} min", ["OnTime"] = "planowo", ["DelayNow"] = "opóźnienie {0}", ["DelayStanding"] = "{0} stoi w: {1}", ["DelayAfter"] = "{0} za: {1}", ["TimetableNone"] = "Pociąg użytkownika nie miał rozkładu.", ["TtArrived"] = "przyj. {0}", ["TtDeparted"] = "odj. {0}", ["TtPassed"] = "przejazd {0}", ["TtMissed"] = "pominięty postój", ["TtLeftEarly"] = "odjazd przed czasem", ["TtStopShort"] = "{0:0.0} m przed miejscem", ["TtStopPast"] = "{0:0.0} m za miejscem", ["TtStopExact"] = "w punkt", ["TtOnPlatform"] = "cały przy peronie", ["TtOffPlatform"] = "{0:0.0} m składu poza peronem", ["TtTechnical"] = "postój techniczny", ["TtStanding"] = "stoi", ["EventStopped"] = "Postój: {0}, {1}", ["EventStationPassed"] = "Przejazd: {0}", ["EventStationMissed"] = "POMINIĘTY POSTÓJ: {0}", ["EventReady"] = "{0}: czas odjazdu", ["EventHornSounded"] = "W6: zatrąbił", ["EventHornMissed"] = "W6: BEZ TRĄBIENIA", ["EventCab"] = "Kabina {0} w {1}", ["EventSecurityBraking"] = "HAMOWANIE PRZEZ {0}", ["EventTimetable"] = "Rozkład {0}, {1}", ["CabSpeed"] = "Prędkość", ["CabAiTarget"] = "AI {0:0} km/h", ["CabAcceleration"] = "Wzdłużne", ["CabLateral"] = "Boczne", ["CabEndFront"] = "A", ["CabEndRear"] = "B", ["CabDriverUser"] = "prowadzi użytkownik", ["CabDriverAi"] = "autopilot", ["CabOutside"] = "poza kabiną", ["CabLightsHead"] = "czoło", ["CabLightsTail"] = "koniec", ["CabSectionBrakes"] = "Hamulce", ["CabSectionDrive"] = "Napęd", ["CabSectionControls"] = "Nastawniki", ["CabSectionDevices"] = "Urządzenia", ["CabGroupPower"] = "Zasilanie", ["CabGroupDriving"] = "Jazda", ["CabGroupSafety"] = "Bezpieczeństwo", ["CabLightsWant"] = "{0}, a ma być {1}", ["DevVigilance"] = "CA", ["DevCabSignal"] = "SHP", ["DevSecurityBraking"] = "Hamowanie CA/SHP", ["LegendStopPoint"] = "W4 – wskaźnik zatrzymania", ["LegendShortStop"] = "W32 – zatrzymanie krótszych pociągów", ["ShortStopHover"] = "W32 {0}", ["LegendHorn"] = "W6 – „trąbić”", ["BandVigilance"] = "CA", ["BandCabSignal"] = "SHP", ["StopPointHover"] = "W4 {0}", ["PlatformHover"] = "peron {0:0} m", ["ShortTrainsHover"] = "dla pociągów do {0:0} m", ["StopHeadHover"] = "czoło ma stanąć {0:0} m przed W4", ["StopMiddleHover"] = "środek składu ma stanąć {0:0} m przed W4", ["HornHover"] = "W6 {0} · {1:0} s", ["ZoomIn"] = "Przybliż", ["ZoomOut"] = "Oddal", ["EventCamera"] = "Kamera: {0}", ["CameraCab"] = "w kabinie", ["CameraExternal"] = "widok zewnętrzny", ["CameraFree"] = "wolna kamera", ["CameraDebug"] = "kamera debugowania", ["EventCoupled"] = "Sprzęgnięto {0} z {1}", ["EventUncoupled"] = "Rozprzęgnięto {0} od {1}", ["EventCouplingChanged"] = "{0} – {1}: {2}", ["CouplingCoupler"] = "sprzęg", ["CouplingBrakePipe"] = "przewód hamulcowy", ["CouplingControl"] = "sterowanie", ["CouplingPower"] = "WN", ["CouplingGangway"] = "mostek", ["CouplingMainPipe"] = "przewód zasilający", ["CouplingHeating"] = "ogrzewanie", ["CouplingNothing"] = "nic", ["BandCamera"] = "kamera", ["LegendCamera"] = "kamera", ["Events"] = "Zdarzenia", ["OnlyUser"] = "tylko użytkownika", ["FileFilter"] = "Czarna skrzynka" }; private readonly Dictionary _texts; public DefaultBlackBoxStrings() : this(CultureInfo.CurrentUICulture) { } public DefaultBlackBoxStrings(CultureInfo culture) : this(culture.TwoLetterISOLanguageName) { } /// Polish for "pl", English for any other language. public DefaultBlackBoxStrings(string languageCode) { _texts = languageCode == "pl" ? Polish : English; } /// The keys there are texts for, for a translation to give them all. public static IEnumerable Keys => English.Keys; public string this[string key] => _texts.TryGetValue(key, out var text) ? text : English.GetValueOrDefault(key, key); }