LanguageManager

This commit is contained in:
2026-02-11 22:39:19 +01:00
parent 19a2ac8d59
commit a9c30bbdfe
8 changed files with 414 additions and 88 deletions

View File

@@ -1,14 +1,42 @@
using System;
using System.Linq;
using Avalonia; using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.Styling;
using StarterNG.Services;
namespace StarterNG; namespace StarterNG;
public partial class App : Application public partial class App : Application
{ {
public static LocalizationService Loc { get; } = new();
public override void Initialize() public override void Initialize()
{ {
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
var langDict = new ResourceInclude(new Uri("avares://StarterNG/"))
{
Source = new Uri("Assets/Langs/English.axaml", UriKind.Relative)
};
var resources = Current!.Resources;
var languageDictionaries = resources.MergedDictionaries
.OfType<ResourceInclude>()
.Where(d => d.Source != null && d.Source.OriginalString.Contains("Langs/"))
.ToList();
foreach (var dict in languageDictionaries)
{
resources.MergedDictionaries.Remove(dict);
}
resources.MergedDictionaries.Add(langDict);
Loc.SetLanguage(langDict);
} }
public override void OnFrameworkInitializationCompleted() public override void OnFrameworkInitializationCompleted()

View File

@@ -0,0 +1,111 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Add Resources Here -->
<x:String x:Key="General">General</x:String>
<x:String x:Key="Language">Language</x:String>
<x:String x:Key="Fullscreen">Fullscreen</x:String>
<x:String x:Key="PauseSimInactive">Pause simulation when window is inactive</x:String>
<x:String x:Key="PauseSimStart">Pause on start</x:String>
<x:String x:Key="CursorSensitivity">Cursor sensitivity:</x:String>
<x:String x:Key="MouseHorInvert">Invert mouse horizontally</x:String>
<x:String x:Key="MouseVertInvert">Invert mouse vertically</x:String>
<x:String x:Key="Communication">Communication</x:String>
<x:String x:Key="GamepadSignalIgnore">Ignore gamepad input</x:String>
<x:String x:Key="Feedback">Feedback</x:String>
<x:String x:Key="FeedbackOff">Off</x:String>
<x:String x:Key="FeedbackCASHP">Caps: CA/SHP; ScrollLock: starting resistances</x:String>
<x:String x:Key="FeedbackCA">Caps: CA; ScrollLock: SHP</x:String>
<x:String x:Key="FeedbackLPT">LPT</x:String>
<x:String x:Key="FeedbackPoKeys">PoKeys55</x:String>
<x:String x:Key="FeedbackSP">Serial port (COM)</x:String>
<x:String x:Key="Others">Other</x:String>
<x:String x:Key="SelectEXE">Select exe:</x:String>
<x:String x:Key="SelectEXEAuto">Select automatically</x:String>
<x:String x:Key="DebugMode">Debug mode (test mode)</x:String>
<x:String x:Key="VirtualShunting">Virtual shunting</x:String>
<x:String x:Key="Graphic">Graphics</x:String>
<x:String x:Key="RenderEngine">Render engine</x:String>
<x:String x:Key="REFull">Full</x:String>
<x:String x:Key="REOld">Old</x:String>
<x:String x:Key="RESimpShader">Simplified shader</x:String>
<x:String x:Key="RESimp">Simplified</x:String>
<x:String x:Key="REOff">Disable visual layer</x:String>
<x:String x:Key="REExperimental">Experimental</x:String>
<x:String x:Key="Resolution">Resolution:</x:String>
<x:String x:Key="BufforResolution">Buffer resolution:</x:String>
<x:String x:Key="MaxTexResolution">Maximum texture resolution:</x:String>
<x:String x:Key="MaxTexCabResolution">Maximum cabin texture resolution:</x:String>
<x:String x:Key="TexFilteringQuality">Texture filtering quality:</x:String>
<x:String x:Key="Multisampling">Multisampling:</x:String>
<x:String x:Key="RenderRange">Rendering range:</x:String>
<x:String x:Key="VSync">VSync</x:String>
<x:String x:Key="SmokeDisplay">Smoke display</x:String>
<x:String x:Key="SmokeParticlesMultiplier">Smoke particles multiplier</x:String>
<x:String x:Key="Postprocessing">Post-processing</x:String>
<x:String x:Key="PPReinhard">Reinhard</x:String>
<x:String x:Key="PPACES">ACES</x:String>
<x:String x:Key="ChromaticAberration">Chromatic aberration</x:String>
<x:String x:Key="MotionBlur">Motion blur</x:String>
<x:String x:Key="AdditionalShadersEffects">Additional shader effects</x:String>
<x:String x:Key="ReflectionsCubeMap">Reflections as cubemap</x:String>
<x:String x:Key="RenderVBO">Render VBO</x:String>
<x:String x:Key="RenderShadows">Render shadows</x:String>
<x:String x:Key="ReflectionsFramerate">Reflections refresh rate</x:String>
<x:String x:Key="ShadowsResolution">Shadows resolution</x:String>
<x:String x:Key="ShaderRange">Reflections refresh rate</x:String>
<x:String x:Key="CabShadowsRange">Cabin shadow sources range</x:String>
<x:String x:Key="ShadowDisplay">Display shadows</x:String>
<x:String x:Key="CSROnlyImportant">Only important</x:String>
<x:String x:Key="CSRLimited">Limited</x:String>
<x:String x:Key="CSRAll">All</x:String>
<x:String x:Key="ReflectionsDetails">Reflections detail level</x:String>
<x:String x:Key="RDTerrain">Terrain geometry only</x:String>
<x:String x:Key="RDTerrainModels">Terrain geometry and static models</x:String>
<x:String x:Key="RDTerrainModelsVehicles">Terrain geometry, static models and vehicles</x:String>
<x:String x:Key="ShadowsCabRange">Cabin shadow sources range</x:String>
<x:String x:Key="RenderScreens">Render onboard computer screens</x:String>
<x:String x:Key="RenderScreensThread">Render screens in a separate thread</x:String>
<x:String x:Key="RenderScreensFramerate">Onboard screens refresh rate</x:String>
<x:String x:Key="Physics">Physics</x:String>
<x:String x:Key="TrackCurvesQuality">Track curves quality</x:String>
<x:String x:Key="PhysicsAccuracyIncreased">Increased physics accuracy</x:String>
<x:String x:Key="BreakingPantographPossibility">Possibility of pantograph breaking</x:String>
<x:String x:Key="PowerOverheadLineOnly">Powered only under overhead line</x:String>
<x:String x:Key="SaveSpeedometerTapes">Save speedometer tapes</x:String>
<x:String x:Key="SaveSimLogs">Save simulation log</x:String>
<x:String x:Key="KeepPrevLogs">Keep previous logs</x:String>
<x:String x:Key="DisplaySimulation">Display simulation</x:String>
<x:String x:Key="CrashDamage">Collision damage</x:String>
<x:String x:Key="Sounds">Sound</x:String>
<x:String x:Key="EnableSounds">Enable sound</x:String>
<x:String x:Key="Volume">Volume</x:String>
<x:String x:Key="RadiophoneVolume">Radio volume</x:String>
<x:String x:Key="VehiclesVolume">Vehicles volume</x:String>
<x:String x:Key="PositionedSoundsVolume">Positional sounds volume</x:String>
<x:String x:Key="AmbientVolume">Ambient volume</x:String>
<x:String x:Key="VolumeDuringPause">Volume during pause</x:String>
<x:String x:Key="Starter">Starter</x:String>
<x:String x:Key="AutoCloseStarter">Automatically close starter</x:String>
<x:String x:Key="LargeThumbnails">Large thumbnails</x:String>
<x:String x:Key="AutoExpandSceneryTree">Automatically expand scenery tree</x:String>
</ResourceDictionary>

View File

@@ -0,0 +1,114 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Add Resources Here -->
<x:String x:Key="General">Ogólne</x:String>
<x:String x:Key="Language">Język</x:String>
<x:String x:Key="Fullscreen">Tryb pełnoekranowy</x:String>
<x:String x:Key="PauseSimInactive">Wstrzymaj symulację, gdy okno nie jest aktywne</x:String>
<x:String x:Key="PauseSimStart">Pauza po uruchomieniu</x:String>
<x:String x:Key="CursorSensitivity">Czułość kursora:</x:String>
<x:String x:Key="MouseHorInvert">Inwersja myszy w poziomie</x:String>
<x:String x:Key="MouseVertInvert">Inwersja myszy w pionie</x:String>
<x:String x:Key="Communication">Komunikacja</x:String>
<x:String x:Key="GamepadSignalIgnore">Ignoruj sygnały z gamepada</x:String>
<x:String x:Key="Feedback">Informacja zwrotna</x:String>
<x:String x:Key="FeedbackOff">Wyłączona</x:String>
<x:String x:Key="FeedbackCASHP">Caps: CA/SHP; ScrollLock: opory rozr.</x:String>
<x:String x:Key="FeedbackCA">Caps: CA; Scrollock: SHP</x:String>
<x:String x:Key="FeedbackLPT">LPT</x:String>
<x:String x:Key="FeedbackPoKeys">PoKeys55</x:String>
<x:String x:Key="FeedbackSP">Serialport (COM)</x:String>
<x:String x:Key="Others">Inne</x:String>
<x:String x:Key="SelectEXE">Wybór exe:</x:String>
<x:String x:Key="SelectEXEAuto">Wybierz automatycznie</x:String>
<x:String x:Key="DebugMode">Tryb testowy (debugmode)</x:String>
<x:String x:Key="VirtualShunting">Wirtualny manewrowy</x:String>
<x:String x:Key="Graphic">Grafika</x:String>
<x:String x:Key="RenderEngine">Silnik renderowania</x:String>
<x:String x:Key="REFull">Pełny</x:String>
<x:String x:Key="REOld">Stary</x:String>
<x:String x:Key="RESimpShader">Uproszczony shaderowy</x:String>
<x:String x:Key="RESimp">Uproszczony</x:String>
<x:String x:Key="REOff">Wyłącz warstwę wizualną</x:String>
<x:String x:Key="REExperimental">Eksperymentalny</x:String>
<x:String x:Key="Resolution">Rozdzielczość:</x:String>
<x:String x:Key="BufforResolution">Rozdzielczość bufora:</x:String>
<x:String x:Key="MaxTexResolution">Maksymalna rozdzielczość tekstur:</x:String>
<x:String x:Key="MaxTexCabResolution">Maksymalna rozdzielczość tekstur kabiny:</x:String>
<x:String x:Key="TexFilteringQuality">Jakość filtrowania tekstur:</x:String>
<x:String x:Key="Multisampling">Multisampling:</x:String>
<x:String x:Key="RenderRange">Zasięg renderowania:</x:String>
<x:String x:Key="VSync">VSync</x:String>
<x:String x:Key="SmokeDisplay">Wyświetlanie dymu</x:String>
<x:String x:Key="SmokeParticlesMultiplier">Mnożnik ilości cząsteczek dymu</x:String>
<x:String x:Key="Postprocessing">Postprocessing</x:String>
<x:String x:Key="PPReinhard">Reinhard</x:String>
<x:String x:Key="PPACES">ACES</x:String>
<x:String x:Key="ChromaticAberration">Aberracja chromatyczna</x:String>
<x:String x:Key="MotionBlur">Rozmycie podczas ruchu</x:String>
<x:String x:Key="AdditionalShadersEffects">Dodatkowe efekty shaderów</x:String>
<x:String x:Key="ReflectionsCubeMap">Odbicia jako cubemapa</x:String>
<x:String x:Key="RenderVBO">Renderowanie VBO</x:String>
<x:String x:Key="RenderShadows">Renderowanie cieni</x:String>
<x:String x:Key="ReflectionsFramerate">Odświeżanie odbić</x:String>
<x:String x:Key="ShadowsResolution">Rozdzielczość cieni</x:String>
<x:String x:Key="ShaderRange">Odświeżanie odbić</x:String>
<x:String x:Key="CabShadowsRange">Zasięg źródeł cieni w kabinie</x:String>
<x:String x:Key="ShadowDisplay">Wyświetlanie cieni</x:String>
<x:String x:Key="CSROnlyImportant">Tylko ważne</x:String>
<x:String x:Key="CSRLimited">Ograniczone</x:String>
<x:String x:Key="CSRAll">Wszystkie</x:String>
<x:String x:Key="ReflectionsDetails">Szczegółowość odbić</x:String>
<x:String x:Key="RDTerrain">Tylko geometria terenu</x:String>
<x:String x:Key="RDTerrainModels">Geometria terenu i modele statyczne</x:String>
<x:String x:Key="RDTerrainModelsVehicles">Geometria terenu, modele statyczne i pojazdy</x:String>
<x:String x:Key="ShadowsCabRange">Zasięg źródeł cieni w kabinie</x:String>
<x:String x:Key="RenderScreens">Renderowanie ekranów komputerów pokładowych</x:String>
<x:String x:Key="RenderScreensThread">Renderowanie ekranów w osobnym wątku</x:String>
<x:String x:Key="RenderScreensFramerate">Częstotliwość odświeżania ekranów komputerów pokładowych</x:String>
<x:String x:Key="Physics">Fizyka</x:String>
<x:String x:Key="TrackCurvesQuality">Jakość łuków torów</x:String>
<x:String x:Key="PhysicsAccuracyIncreased">Zwiększona dokładność fizyki</x:String>
<x:String x:Key="BreakingPantographPossibility">Możliwość złamania pantografu</x:String>
<x:String x:Key="PowerOverheadLineOnly">Zasilanie tylko pod siecią trakcyjna</x:String>
<x:String x:Key="SaveSpeedometerTapes">Zapisuj taśmy z prędkościomierza</x:String>
<x:String x:Key="SaveSimLogs">Zapisuj log z symulacji</x:String>
<x:String x:Key="KeepPrevLogs">Zachowuj poprzednie logi</x:String>
<x:String x:Key="DisplaySimulation">Wyświetlaj symulację</x:String>
<x:String x:Key="CrashDamage">Uszkodzenia przy zderzeniu</x:String>
<x:String x:Key="Sounds">Dżwięk</x:String>
<x:String x:Key="EnableSounds">Włącz dźwięk</x:String>
<x:String x:Key="Volume">Głośność</x:String>
<x:String x:Key="RadiophoneVolume">Głośność radiotelefonu</x:String>
<x:String x:Key="VehiclesVolume">Głośność pojazdów</x:String>
<x:String x:Key="PositionedSoundsVolume">Głośność dżwięków pozycjonowanych</x:String>
<x:String x:Key="AmbientVolume">Głośność otoczenia</x:String>
<x:String x:Key="VolumeDuringPause">Głośność podczas pauzy</x:String>
<x:String x:Key="Starter">Starter</x:String>
<x:String x:Key="AutoCloseStarter">Zamknij starter automatycznie</x:String>
<x:String x:Key="LargeThumbnails">Duże miniaturki</x:String>
<x:String x:Key="AutoExpandSceneryTree">Automatycznie rozwijanie drzewka scenerii</x:String>
</ResourceDictionary>

View File

@@ -8,7 +8,7 @@
xmlns:svg="clr-namespace:Avalonia.Svg;assembly=Avalonia.Svg" xmlns:svg="clr-namespace:Avalonia.Svg;assembly=Avalonia.Svg"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:StarterNG.Views" BackgroundStyle="Bubble" xmlns:views="clr-namespace:StarterNG.Views" BackgroundStyle="Bubble"
Title="MaSzyna - Symulator pojazdów szynowych" Height="800" Width="1000"> Title="MaSzyna - Symulator pojazdów szynowych" Height="800" Width="1000" WindowStartupLocation="CenterScreen">
<sukiUi:SukiSideMenu IsMenuExpanded="False"> <sukiUi:SukiSideMenu IsMenuExpanded="False">
<sukiUi:SukiSideMenu.Items> <sukiUi:SukiSideMenu.Items>
<!-- SCENARIUSZE --> <!-- SCENARIUSZE -->

View File

@@ -0,0 +1,33 @@
using System.ComponentModel;
using Avalonia.Controls;
using Avalonia.Styling;
namespace StarterNG.Services;
public class LocalizationService : INotifyPropertyChanged
{
private IResourceProvider _currentProvider = new ResourceDictionary();
public event PropertyChangedEventHandler? PropertyChanged;
public string this[string key]
{
get
{
if (_currentProvider.TryGetResource(key, null, out var value))
{
return value?.ToString() ?? key;
}
return key;
}
}
public void SetLanguage(IResourceProvider provider)
{
_currentProvider = provider;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
}
}

View File

@@ -6,7 +6,6 @@
<BuiltInComInteropSupport>true</BuiltInComInteropSupport> <BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest> <ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault> <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
@@ -31,6 +30,10 @@
<PackageReference Include="SukiUI" Version="6.0.3" /> <PackageReference Include="SukiUI" Version="6.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Assets\Logo\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="Assets\Logo\maszyna_black.svg" /> <None Remove="Assets\Logo\maszyna_black.svg" />
<AvaloniaResource Include="Assets\Logo\maszyna_black.svg" /> <AvaloniaResource Include="Assets\Logo\maszyna_black.svg" />

View File

@@ -4,46 +4,57 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:suki="clr-namespace:SukiUI.Controls;assembly=SukiUI" xmlns:suki="clr-namespace:SukiUI.Controls;assembly=SukiUI"
xmlns:objectModel="clr-namespace:System.Collections.ObjectModel;assembly=System.ObjectModel" xmlns:objectModel="clr-namespace:System.Collections.ObjectModel;assembly=System.ObjectModel"
xmlns:starterNg="clr-namespace:StarterNG"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="StarterNG.Views.Settings"> x:Class="StarterNG.Views.Settings">
<suki:SettingsLayout> <suki:SettingsLayout>
<suki:SettingsLayout.Items> <suki:SettingsLayout.Items>
<objectModel:ObservableCollection x:TypeArguments="suki:SettingsLayoutItem"> <objectModel:ObservableCollection x:TypeArguments="suki:SettingsLayoutItem">
<suki:SettingsLayoutItem Header="Ogólne"> <suki:SettingsLayoutItem Header="{Binding [General], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<CheckBox>Tryb pełnoekranowy</CheckBox> <StackPanel Spacing="8" Orientation="Horizontal">
<Label Content="{Binding [Language], Source={x:Static starterNg:App.Loc}}" VerticalAlignment="Center" FontSize="14"/>
<ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="1" SelectionChanged="LanguageComboBox_OnSelectionChanged">
<ComboBoxItem>Polski</ComboBoxItem>
<ComboBoxItem>English</ComboBoxItem>
</ComboBox>
</StackPanel>
<CheckBox Content="{Binding [Fullscreen], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Wstrzymaj symulację, gdy okno nie jest aktywne</CheckBox> <CheckBox Content="{Binding [PauseSimInactive], Source={x:Static starterNg:App.Loc}}" />
<CheckBox>Pauza po uruchomieniu</CheckBox> <CheckBox Content="{Binding [PauseSimStart], Source={x:Static starterNg:App.Loc}}" />
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<Label VerticalAlignment="Center" FontSize="14">Czułość kursora:</Label> <Label VerticalAlignment="Center" FontSize="14" Content="{Binding [CursorSensitivity], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" Maximum="5" TickFrequency="1" MinWidth="200" MaxWidth="200" <Slider Minimum="1" Maximum="5" TickFrequency="1" MinWidth="200" MaxWidth="200"
IsSnapToTickEnabled="True" Value="3"> IsSnapToTickEnabled="True" Value="3">
</Slider> </Slider>
</StackPanel> </StackPanel>
<CheckBox>Inwersja myszy w poziomie</CheckBox> <CheckBox Content="{Binding [MouseHorInvert], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Inwersja myszy w pionie</CheckBox> <CheckBox Content="{Binding [MouseVertInvert], Source={x:Static starterNg:App.Loc}}" />
</StackPanel> </StackPanel>
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Komunikacja"> <suki:SettingsLayoutItem Header="{Binding [Communication], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<CheckBox>Ignoruj sygnały z gamepada</CheckBox> <CheckBox Content="{Binding [GamepadSignalIgnore], Source={x:Static starterNg:App.Loc}}"/>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<Label VerticalAlignment="Center" FontSize="14">Informacja zwrotna</Label> <Label VerticalAlignment="Center" FontSize="14" Content="{Binding [Feedback], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0"> <ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0">
<ComboBoxItem Tag="0">Wyłączona</ComboBoxItem> <ComboBoxItem Tag="0" Content="{Binding [FeedbackOff], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem Tag="1">Caps: CA/SHP; ScrollLock: opory rozr.</ComboBoxItem> <ComboBoxItem Tag="1" Content="{Binding [FeedbackCASHP], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem Tag="2">Caps: CA; Scrollock: SHP</ComboBoxItem> <ComboBoxItem Tag="2" Content="{Binding [FeedbackCA], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem Tag="3">LPT</ComboBoxItem> <ComboBoxItem Tag="3" Content="{Binding [FeedbackLPT], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem Tag="4">PoKeys55</ComboBoxItem> <ComboBoxItem Tag="4" Content="{Binding [FeedbackPoKeys], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem Tag="5">Serialport (COM)</ComboBoxItem> <ComboBoxItem Tag="5" Content="{Binding [FeedbackSP], Source={x:Static starterNg:App.Loc}}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
@@ -51,46 +62,46 @@
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Inne"> <suki:SettingsLayoutItem Header="{Binding [Others], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<Label VerticalAlignment="Center" FontSize="14">Wybór exe:</Label> <Label VerticalAlignment="Center" FontSize="14" Content="{Binding [SelectEXE], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0"> <ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0">
<ComboBoxItem>Wybierz automatycznie</ComboBoxItem> <ComboBoxItem Content="{Binding [SelectEXEAuto], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>eu07.exe</ComboBoxItem> <ComboBoxItem>eu07.exe</ComboBoxItem>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<CheckBox>Tryb testowy (debugmode)</CheckBox> <CheckBox Content="{Binding [DebugMode], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Wirtualny manewrowy</CheckBox> <CheckBox Content="{Binding [VirtualShunting], Source={x:Static starterNg:App.Loc}}"/>
</StackPanel> </StackPanel>
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Grafika"> <suki:SettingsLayoutItem Header="{Binding [Graphic], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<Label VerticalAlignment="Center" FontSize="14">Silnik renderowania</Label> <Label VerticalAlignment="Center" FontSize="14" Content="{Binding [RenderEngine], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0"> <ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0">
<ComboBoxItem>Pełny</ComboBoxItem> <ComboBoxItem Content="{Binding [REFull], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Stary</ComboBoxItem> <ComboBoxItem Content="{Binding [REOld], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Uproszczony shaderowy</ComboBoxItem> <ComboBoxItem Content="{Binding [RESimpShader], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Uproszczony</ComboBoxItem> <ComboBoxItem Content="{Binding [RESimp], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Wyłącz warstwę wizualną</ComboBoxItem> <ComboBoxItem Content="{Binding [REOff], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Eksperymentalny</ComboBoxItem> <ComboBoxItem Content="{Binding [REExperimental], Source={x:Static starterNg:App.Loc}}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<Label VerticalAlignment="Center" FontSize="14">Rozdzielczość:</Label> <Label VerticalAlignment="Center" FontSize="14" Content="{Binding [Resolution], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0"> <ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0">
<ComboBoxItem>2560x1440</ComboBoxItem> <ComboBoxItem>2560x1440</ComboBoxItem>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Rozdzielczość bufora:</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [BufforResolution], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="bufferScale" Minimum="50" MaxWidth="400" HorizontalAlignment="Left" <Slider Name="bufferScale" Minimum="50" MaxWidth="400" HorizontalAlignment="Left"
MinWidth="250" Maximum="200" TickFrequency="1" IsSnapToTickEnabled="True" MinWidth="250" Maximum="200" TickFrequency="1" IsSnapToTickEnabled="True"
Value="100" /> Value="100" />
@@ -99,7 +110,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Maksymalna rozdzielczość tekstur:</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [MaxTexResolution], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="textureResolutionSlider" Minimum="9" MaxWidth="400" <Slider Name="textureResolutionSlider" Minimum="9" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="14" MinWidth="250" Maximum="14"
@@ -109,7 +120,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Maksymalna rozdzielczość tekstur kabiny:</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [MaxTexCabResolution], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="cabTextureResolutionSlider" Minimum="9" MaxWidth="400" <Slider Name="cabTextureResolutionSlider" Minimum="9" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="14" MinWidth="250" Maximum="14"
@@ -119,7 +130,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Jakość filtrowania tekstur</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [TexFilteringQuality], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="5" MinWidth="250" Maximum="5"
@@ -128,7 +139,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Multisampling</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [Multisampling], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="4" MinWidth="250" Maximum="4"
@@ -137,18 +148,18 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Zasięg renderowania</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [RenderRange], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="3" Value="1" /> MinWidth="250" Maximum="3" Value="1" />
</StackPanel> </StackPanel>
<CheckBox>VSync</CheckBox> <CheckBox Content="{Binding [VSync], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Wyświetlanie dymu</CheckBox> <CheckBox Content="{Binding [SmokeDisplay], Source={x:Static starterNg:App.Loc}}"/>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Mnożnik ilości cząsteczek dymu</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [SmokeParticlesMultiplier], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="4" MinWidth="250" Maximum="4"
@@ -157,27 +168,27 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Postprocessing</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [Postprocessing], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0"> <ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0">
<ComboBoxItem>Reinhard</ComboBoxItem> <ComboBoxItem Content="{Binding [PPReinhard], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>ACES</ComboBoxItem> <ComboBoxItem Content="{Binding [PPACES], Source={x:Static starterNg:App.Loc}}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<CheckBox>Aberracja chromatyczna</CheckBox> <CheckBox Content="{Binding [ChromaticAberration], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Rozmycie podczas ruchu</CheckBox> <CheckBox Content="{Binding [MotionBlur], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Dodatkowe efekty shaderów</CheckBox> <CheckBox Content="{Binding [AdditionalShadersEffects], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Odbicia jako cubemapa</CheckBox> <CheckBox Content="{Binding [ReflectionsCubeMap], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Renderowanie VBO</CheckBox> <CheckBox Content="{Binding [RenderVBO], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Renderowanie cieni</CheckBox> <CheckBox Content="{Binding [RenderShadows], Source={x:Static starterNg:App.Loc}}"/>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Odświeżanie odbić</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ReflectionsFramerate], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="reflectionsFramerate" Minimum="5" MaxWidth="400" <Slider Name="reflectionsFramerate" Minimum="5" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="120" MinWidth="250" Maximum="120"
@@ -188,7 +199,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Rozdzielczość cieni</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ShadowsResolution], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="shaderResolutionSlider" Minimum="9" MaxWidth="400" <Slider Name="shaderResolutionSlider" Minimum="9" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="14" MinWidth="250" Maximum="14"
@@ -198,7 +209,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Odświeżanie odbić</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ShaderRange], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="shaderRange" Minimum="25" MaxWidth="400" <Slider Name="shaderRange" Minimum="25" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="400" MinWidth="250" Maximum="400"
@@ -209,7 +220,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Zasięg źródeł cieni w kabinie</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [CabShadowsRange], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="cabShaderSourceRange" Minimum="0" MaxWidth="400" <Slider Name="cabShaderSourceRange" Minimum="0" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -220,25 +231,25 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Wyświetlanie cieni</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ShadowDisplay], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0"> <ComboBox MinWidth="150" MaxWidth="150" SelectedIndex="0">
<ComboBoxItem>Tylko ważne</ComboBoxItem> <ComboBoxItem Content="{Binding [CSROnlyImportant], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Ograniczone</ComboBoxItem> <ComboBoxItem Content="{Binding [CSRLimited], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Wszystkie</ComboBoxItem> <ComboBoxItem Content="{Binding [CSRAll], Source={x:Static starterNg:App.Loc}}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Szczegółowość odbić</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ReflectionsDetails], Source={x:Static starterNg:App.Loc}}"/>
<ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0"> <ComboBox MinWidth="350" MaxWidth="350" SelectedIndex="0">
<ComboBoxItem>Tylko geometria terenu</ComboBoxItem> <ComboBoxItem Content="{Binding [RDTerrain], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Geometria terenu i modele statyczne</ComboBoxItem> <ComboBoxItem Content="{Binding [RDTerrainModels], Source={x:Static starterNg:App.Loc}}"/>
<ComboBoxItem>Geometria terenu, modele statyczne i pojazdy</ComboBoxItem> <ComboBoxItem Content="{Binding [RDTerrainModelsVehicles], Source={x:Static starterNg:App.Loc}}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Zasięg źródeł cieni w kabinie</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [ShadowsCabRange], Source={x:Static starterNg:App.Loc}}"/>
<Slider Name="fovSlider" Minimum="5" MaxWidth="400" <Slider Name="fovSlider" Minimum="5" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="110" MinWidth="250" Maximum="110"
@@ -248,11 +259,11 @@
Content="{Binding #fovSlider.Value, StringFormat='{}{0} stopni'}" /> Content="{Binding #fovSlider.Value, StringFormat='{}{0} stopni'}" />
</StackPanel> </StackPanel>
<CheckBox>Renderowanie ekranów komputerów pokładowych</CheckBox> <CheckBox Content="{Binding [RenderScreens], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Renderowanie ekranów w osobnym wątku</CheckBox> <CheckBox Content="{Binding [RenderScreensThread], Source={x:Static starterNg:App.Loc}}"/>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Częstotliwość odświeżania ekranów komputerów pokładowych</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [RenderScreensFramerate], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="5" MinWidth="250" Maximum="5"
@@ -263,11 +274,11 @@
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Fizyka"> <suki:SettingsLayoutItem Header="{Binding [Physics], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Jakość łuków torów</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [TrackCurvesQuality], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="4" MinWidth="250" Maximum="4"
@@ -275,32 +286,32 @@
IsSnapToTickEnabled="True" Value="4" /> IsSnapToTickEnabled="True" Value="4" />
</StackPanel> </StackPanel>
<CheckBox>Zwiększona dokładność fizyki</CheckBox> <CheckBox Content="{Binding [PhysicsAccuracyIncreased], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Możliwość złamania pantografu</CheckBox> <CheckBox Content="{Binding [BreakingPantographPossibility], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Zasilanie tylko pod siecią trakcyjna</CheckBox> <CheckBox Content="{Binding [PowerOverheadLineOnly], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Zapisuj taśmy z prędkościomierza</CheckBox> <CheckBox Content="{Binding [SaveSpeedometerTapes], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Zapisuj log z symulacji</CheckBox> <CheckBox Content="{Binding [SaveSimLogs], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Zachowuj poprzednie logi</CheckBox> <CheckBox Content="{Binding [KeepPrevLogs], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Wyświetlaj symulację</CheckBox> <CheckBox Content="{Binding [DisplaySimulation], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Uszkodzenia przy zderzeniu</CheckBox> <CheckBox Content="{Binding [CrashDamage], Source={x:Static starterNg:App.Loc}}"/>
</StackPanel> </StackPanel>
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Dżwięk"> <suki:SettingsLayoutItem Header="{Binding [Sounds], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<CheckBox>Włącz dźwięk</CheckBox> <CheckBox Content="{Binding [EnableSounds], Source={x:Static starterNg:App.Loc}}"/>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [Volume], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -309,7 +320,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność radiotelefonu</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [RadiophoneVolume], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -318,7 +329,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność pojazdów</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [VehiclesVolume], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -327,7 +338,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność dżwięków pozycjonowanych</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [PositionedSoundsVolume], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -336,7 +347,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność otoczenia</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [AmbientVolume], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -345,7 +356,7 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="8" Orientation="Horizontal"> <StackPanel Spacing="8" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" FontSize="14">Głośność podczas pauzy</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding [VolumeDuringPause], Source={x:Static starterNg:App.Loc}}"/>
<Slider Minimum="1" MaxWidth="400" <Slider Minimum="1" MaxWidth="400"
HorizontalAlignment="Left" HorizontalAlignment="Left"
MinWidth="250" Maximum="100" MinWidth="250" Maximum="100"
@@ -356,12 +367,12 @@
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>
<suki:SettingsLayoutItem Header="Starter"> <suki:SettingsLayoutItem Header="{Binding [Starter], Source={x:Static starterNg:App.Loc}}">
<suki:SettingsLayoutItem.Content> <suki:SettingsLayoutItem.Content>
<StackPanel Spacing="8" Orientation="Vertical"> <StackPanel Spacing="8" Orientation="Vertical">
<CheckBox>Zamknij starter automatycznie</CheckBox> <CheckBox Content="{Binding [AutoCloseStarter], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Duże miniaturki</CheckBox> <CheckBox Content="{Binding [LargeThumbnails], Source={x:Static starterNg:App.Loc}}"/>
<CheckBox>Automatycznie rozwijanie drzewka scenerii</CheckBox> <CheckBox Content="{Binding [AutoExpandSceneryTree], Source={x:Static starterNg:App.Loc}}"/>
</StackPanel> </StackPanel>
</suki:SettingsLayoutItem.Content> </suki:SettingsLayoutItem.Content>
</suki:SettingsLayoutItem> </suki:SettingsLayoutItem>

View File

@@ -1,8 +1,10 @@
using System; using System;
using System.Linq;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.Styling;
namespace StarterNG.Views; namespace StarterNG.Views;
@@ -45,4 +47,28 @@ public partial class Settings : UserControl
int resolution = 1 << (int)shaderResolutionSlider.Value; int resolution = 1 << (int)shaderResolutionSlider.Value;
shaderResolution.Text = $"{resolution} px"; shaderResolution.Text = $"{resolution} px";
} }
private void LanguageComboBox_OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (sender is not ComboBox { SelectedItem: ComboBoxItem item }) return;
var lang = item.Content?.ToString();
if (string.IsNullOrEmpty(lang)) return;
var langDict = new ResourceInclude(new Uri("avares://StarterNG/"))
{
Source = new Uri($"Assets/Langs/{lang}.axaml", UriKind.Relative)
};
var currentLangDict = App.Current.Resources.MergedDictionaries
.OfType<ResourceInclude>()
.FirstOrDefault(d => d.Source != null && d.Source.OriginalString.Contains("Langs/"));
if (currentLangDict != null)
{
App.Current.Resources.MergedDictionaries.Remove(currentLangDict);
}
App.Current.Resources.MergedDictionaries.Add(langDict);
App.Loc.SetLanguage(langDict);
}
} }