This commit is contained in:
mika-n 2019-12-27 19:39:13 +02:00
commit 02f66bb6ca
9 changed files with 966 additions and 35 deletions

View File

@ -244,6 +244,7 @@ namespace DS4WinWPF
} }
else if (parser.Driverinstall) else if (parser.Driverinstall)
{ {
CreateBaseThread();
DS4Forms.WelcomeDialog dialog = new DS4Forms.WelcomeDialog(true); DS4Forms.WelcomeDialog dialog = new DS4Forms.WelcomeDialog(true);
dialog.ShowDialog(); dialog.ShowDialog();
runShutdown = false; runShutdown = false;
@ -309,6 +310,20 @@ namespace DS4WinWPF
Thread.SpinWait(500); Thread.SpinWait(500);
} }
private void CreateBaseThread()
{
controlThread = new Thread(() => {
DS4Windows.Program.rootHub = rootHub;
requestClient = new HttpClient();
collectTimer = new Timer(GarbageTask, null, 30000, 30000);
});
controlThread.Priority = ThreadPriority.Normal;
controlThread.IsBackground = true;
controlThread.Start();
while (controlThread.IsAlive)
Thread.SpinWait(500);
}
private void GarbageTask(object state) private void GarbageTask(object state)
{ {
GC.Collect(0, GCCollectionMode.Forced, false); GC.Collect(0, GCCollectionMode.Forced, false);

View File

@ -14,7 +14,7 @@
mc:Ignorable="d" mc:Ignorable="d"
Title="DS4Windows" Height="500" Width="800" Closing="MainDS4Window_Closing" Closed="MainDS4Window_Closed" StateChanged="MainDS4Window_StateChanged" SizeChanged="MainDS4Window_SizeChanged" LocationChanged="MainDS4Window_LocationChanged"> Title="DS4Windows" Height="500" Width="800" Closing="MainDS4Window_Closing" Closed="MainDS4Window_Closed" StateChanged="MainDS4Window_StateChanged" SizeChanged="MainDS4Window_SizeChanged" LocationChanged="MainDS4Window_LocationChanged">
<DockPanel> <DockPanel>
<tb:TaskbarIcon x:Name="notifyIcon" IconSource="{Binding IconSource}" ToolTipText="{Binding TooltipText}" MenuActivation="RightClick" TrayRightMouseUp="NotifyIcon_TrayRightMouseUp" TrayMiddleMouseDown="NotifyIcon_TrayMiddleMouseDown" TrayMouseDoubleClick="NotifyIcon_TrayMouseDoubleClick"> <tb:TaskbarIcon x:Name="notifyIcon" IconSource="{Binding IconSource,Mode=OneWay}" ToolTipText="{Binding TooltipText,Mode=OneWay}" MenuActivation="RightClick" TrayRightMouseUp="NotifyIcon_TrayRightMouseUp" TrayMiddleMouseDown="NotifyIcon_TrayMiddleMouseDown" TrayMouseDoubleClick="NotifyIcon_TrayMouseDoubleClick">
<!--<tb:TaskbarIcon.ContextMenu> <!--<tb:TaskbarIcon.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="Open" /> <MenuItem Header="Open" />
@ -87,12 +87,13 @@
</DataTemplate> </DataTemplate>
</GridViewColumn.CellTemplate> </GridViewColumn.CellTemplate>
</GridViewColumn> </GridViewColumn>
<GridViewColumn x:Name="selectProfileColumn" Header="Selected Profile" Width="120"> <GridViewColumn x:Name="selectProfileColumn" Header="Selected Profile" Width="130">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
<DataTemplate> <DataTemplate>
<StackPanel Width="{Binding ElementName=selectProfileColumn, Path=Width}"> <StackPanel Width="{Binding ElementName=selectProfileColumn, Path=Width}">
<ComboBox x:Name="selectProfCombo" Width="100" HorizontalAlignment="Left" DisplayMemberPath="Name" <ComboBox x:Name="selectProfCombo" Width="100" HorizontalAlignment="Center" DisplayMemberPath="Name"
ItemsSource="{Binding ProfileListCol}" SelectedIndex="{Binding SelectedIndex}" Height="Auto" Tag="{Binding DevIndex, Mode=OneTime}" SelectionChanged="SelectProfCombo_SelectionChanged" KeyDown="SelectProfCombo_KeyDown" /> ItemsSource="{Binding ProfileListCol}" SelectedIndex="{Binding SelectedIndex}" Height="Auto" Tag="{Binding DevIndex, Mode=OneTime}" Margin="4,0"
SelectionChanged="SelectProfCombo_SelectionChanged" KeyDown="SelectProfCombo_KeyDown" />
</StackPanel> </StackPanel>
</DataTemplate> </DataTemplate>
</GridViewColumn.CellTemplate> </GridViewColumn.CellTemplate>

View File

@ -77,8 +77,6 @@ namespace DS4WinWPF.DS4Forms
ChangeControllerPanel(); ChangeControllerPanel();
trayIconVM = new TrayIconViewModel(App.rootHub, profileListHolder); trayIconVM = new TrayIconViewModel(App.rootHub, profileListHolder);
notifyIcon.DataContext = trayIconVM; notifyIcon.DataContext = trayIconVM;
notifyIcon.Icon = Global.UseWhiteIcon ? Properties.Resources.DS4W___White :
Properties.Resources.DS4W;
if (Global.StartMinimized || parser.Mini) if (Global.StartMinimized || parser.Mini)
{ {
@ -259,9 +257,11 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
autoProfileHolder.AutoProfileColl.CollectionChanged += AutoProfileColl_CollectionChanged; autoProfileHolder.AutoProfileColl.CollectionChanged += AutoProfileColl_CollectionChanged;
//autoProfControl.AutoProfVM.AutoProfileSystemChange += AutoProfVM_AutoProfileSystemChange; //autoProfControl.AutoProfVM.AutoProfileSystemChange += AutoProfVM_AutoProfileSystemChange;
bool wmiConnected = false;
WqlEventQuery q = new WqlEventQuery(); WqlEventQuery q = new WqlEventQuery();
ManagementScope scope = new ManagementScope("root\\CIMV2"); ManagementScope scope = new ManagementScope("root\\CIMV2");
q.EventClassName = "Win32_PowerManagementEvent"; q.EventClassName = "Win32_PowerManagementEvent";
try try
{ {
scope.Connect(); scope.Connect();
@ -270,13 +270,20 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
if (scope.IsConnected) if (scope.IsConnected)
{ {
wmiConnected = true;
managementEvWatcher = new ManagementEventWatcher(scope, q); managementEvWatcher = new ManagementEventWatcher(scope, q);
managementEvWatcher.EventArrived += PowerEventArrive; managementEvWatcher.EventArrived += PowerEventArrive;
try
{
managementEvWatcher.Start(); managementEvWatcher.Start();
} }
else catch (ManagementException) { wmiConnected = false; }
}
if (!wmiConnected)
{ {
AppLogger.LogToGui("Could not connect to Windows Management Instrumentation service. Suspend support not enabled.", true); AppLogger.LogToGui(@"Could not connect to Windows Management Instrumentation service.
Suspend support not enabled.", true);
} }
} }
@ -991,13 +998,15 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
private async void HideDS4ContCk_Click(object sender, RoutedEventArgs e) private async void HideDS4ContCk_Click(object sender, RoutedEventArgs e)
{ {
StartStopBtn.IsEnabled = false; StartStopBtn.IsEnabled = false;
bool checkStatus = hideDS4ContCk.IsChecked == true; //bool checkStatus = hideDS4ContCk.IsChecked == true;
hideDS4ContCk.IsEnabled = false;
await Task.Run(() => await Task.Run(() =>
{ {
App.rootHub.Stop(); App.rootHub.Stop();
App.rootHub.Start(); App.rootHub.Start();
}); });
hideDS4ContCk.IsEnabled = true;
StartStopBtn.IsEnabled = true; StartStopBtn.IsEnabled = true;
} }
@ -1064,7 +1073,7 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
private void UseWhiteDS4IconCk_Click(object sender, RoutedEventArgs e) private void UseWhiteDS4IconCk_Click(object sender, RoutedEventArgs e)
{ {
bool status = useWhiteDS4IconCk.IsChecked == true; bool status = useWhiteDS4IconCk.IsChecked == true;
notifyIcon.Icon = status ? Properties.Resources.DS4W___White : Properties.Resources.DS4W; trayIconVM.IconSource = status ? TrayIconViewModel.ICON_WHITE : TrayIconViewModel.ICON_COLOR;
} }
private void CheckDrivers() private void CheckDrivers()
@ -1265,6 +1274,8 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
} }
private void ShowProfileEditor(int device, ProfileEntity entity = null) private void ShowProfileEditor(int device, ProfileEntity entity = null)
{
if (editor == null)
{ {
profOptsToolbar.Visibility = Visibility.Collapsed; profOptsToolbar.Visibility = Visibility.Collapsed;
profilesListBox.Visibility = Visibility.Collapsed; profilesListBox.Visibility = Visibility.Collapsed;
@ -1281,6 +1292,8 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question
editor.Reload(device, entity); editor.Reload(device, entity);
} }
}
private void Editor_CreatedProfile(ProfileEditor sender, string profile) private void Editor_CreatedProfile(ProfileEditor sender, string profile)
{ {
profileListHolder.AddProfileSort(profile); profileListHolder.AddProfileSort(profile);

View File

@ -289,7 +289,7 @@
<Setter Property="Height" Value="30" /> <Setter Property="Height" Value="30" />
</Style> </Style>
</TabItem.Resources> </TabItem.Resources>
<ScrollViewer CanContentScroll="True"> <ScrollViewer>
<StackPanel> <StackPanel>
<GroupBox Header="LS &amp; RS"> <GroupBox Header="LS &amp; RS">
<Grid> <Grid>
@ -333,9 +333,9 @@
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" /> <Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding LSSens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding LSSens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="5.0" Minimum="0.5" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding RSSens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding RSSens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="5.0" Minimum="0.5" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" /> <Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" />
@ -448,9 +448,9 @@
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" /> <Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding L2Sens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding L2Sens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="10.0" Minimum="0.1" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding R2Sens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding R2Sens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="10.0" Minimum="0.1" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" /> <Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" />
@ -530,9 +530,9 @@
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" /> <Label Content="Sensitivity:" Grid.Row="4" Grid.Column="0" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding SXSens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding SXSens}" MinWidth="50" Grid.Row="4" Grid.Column="1" Maximum="5.0" Minimum="0.5" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding SZSens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="1.0" Minimum="0.0" Increment="0.1" <xctk:DoubleUpDown d:IsHidden="True" FormatString="F2" Value="{Binding SZSens}" MinWidth="50" Grid.Row="4" Grid.Column="2" Maximum="5.0" Minimum="0.5" Increment="0.1"
Margin="{StaticResource spaceMargin}" /> Margin="{StaticResource spaceMargin}" />
<Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" /> <Label Content="Output Curve:" Grid.Row="5" Grid.Column="0" />

View File

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Threading;
using System.Windows.Controls; using System.Windows.Controls;
using DS4Windows; using DS4Windows;
@ -9,7 +9,9 @@ namespace DS4WinWPF.DS4Forms.ViewModels
public class TrayIconViewModel public class TrayIconViewModel
{ {
private string tooltipText = "DS4Windows"; private string tooltipText = "DS4Windows";
private string iconSource = "/DS4Windows;component/Resources/DS4W.ico"; public const string ICON_COLOR = "/DS4Windows;component/Resources/DS4W.ico";
public const string ICON_WHITE = "/DS4Windows;component/Resources/DS4W - White.ico";
private string iconSource = ICON_COLOR;
public const string ballonTitle = "DS4Windows"; public const string ballonTitle = "DS4Windows";
public static string trayTitle = $"DS4Windows v{Global.exeversion}"; public static string trayTitle = $"DS4Windows v{Global.exeversion}";
private ContextMenu contextMenu; private ContextMenu contextMenu;
@ -42,6 +44,7 @@ namespace DS4WinWPF.DS4Forms.ViewModels
public event EventHandler RequestOpen; public event EventHandler RequestOpen;
public event EventHandler RequestMinimize; public event EventHandler RequestMinimize;
private ReaderWriterLockSlim _colLocker = new ReaderWriterLockSlim();
private List<ControllerHolder> controllerList = new List<ControllerHolder>(); private List<ControllerHolder> controllerList = new List<ControllerHolder>();
private ProfileList profileListHolder; private ProfileList profileListHolder;
private ControlService controlService; private ControlService controlService;
@ -56,6 +59,9 @@ namespace DS4WinWPF.DS4Forms.ViewModels
this.profileListHolder = profileListHolder; this.profileListHolder = profileListHolder;
this.controlService = service; this.controlService = service;
contextMenu = new ContextMenu(); contextMenu = new ContextMenu();
iconSource = Global.UseWhiteIcon ? "/DS4Windows;component/Resources/DS4W - White.ico" :
"/DS4Windows;component/Resources/DS4W.ico";
PopulateControllerList(); PopulateControllerList();
PopulateToolText(); PopulateToolText();
PopulateContextMenu(); PopulateContextMenu();
@ -79,22 +85,28 @@ namespace DS4WinWPF.DS4Forms.ViewModels
private void ClearControllerList(object sender, EventArgs e) private void ClearControllerList(object sender, EventArgs e)
{ {
_colLocker.EnterWriteLock();
controllerList.Clear(); controllerList.Clear();
_colLocker.ExitWriteLock();
} }
private void UnhookEvents(object sender, EventArgs e) private void UnhookEvents(object sender, EventArgs e)
{ {
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
RemoveDeviceEvents(currentDev); RemoveDeviceEvents(currentDev);
} }
_colLocker.ExitReadLock();
} }
private void Service_HotplugController(ControlService sender, DS4Device device, int index) private void Service_HotplugController(ControlService sender, DS4Device device, int index)
{ {
SetupDeviceEvents(device); SetupDeviceEvents(device);
_colLocker.EnterWriteLock();
controllerList.Add(new ControllerHolder(device, index)); controllerList.Add(new ControllerHolder(device, index));
_colLocker.ExitWriteLock();
} }
private void ProfileListCol_CollectionChanged(object sender, private void ProfileListCol_CollectionChanged(object sender,
@ -115,6 +127,7 @@ namespace DS4WinWPF.DS4Forms.ViewModels
MenuItem item; MenuItem item;
int idx = 0; int idx = 0;
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
@ -156,6 +169,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
idx++; idx++;
} }
_colLocker.ExitReadLock();
items.Add(item); items.Add(item);
items.Add(new Separator()); items.Add(new Separator());
item = new MenuItem() { Header = "Open" }; item = new MenuItem() { Header = "Open" };
@ -188,7 +203,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
ProfileSelected?.Invoke(this, holder, item.Header.ToString()); ProfileSelected?.Invoke(this, holder, item.Header.ToString());
} }
private void DisconnectMenuItem_Click(object sender, System.Windows.RoutedEventArgs e) private void DisconnectMenuItem_Click(object sender,
System.Windows.RoutedEventArgs e)
{ {
MenuItem item = sender as MenuItem; MenuItem item = sender as MenuItem;
int idx = Convert.ToInt32(item.Tag); int idx = Convert.ToInt32(item.Tag);
@ -214,11 +230,13 @@ namespace DS4WinWPF.DS4Forms.ViewModels
{ {
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
int idx = 0; int idx = 0;
_colLocker.EnterWriteLock();
foreach (DS4Device currentDev in controlService.slotManager.ControllerColl) foreach (DS4Device currentDev in controlService.slotManager.ControllerColl)
{ {
controllerList.Add(new ControllerHolder(currentDev, idx)); controllerList.Add(new ControllerHolder(currentDev, idx));
idx++; idx++;
} }
_colLocker.ExitWriteLock();
} }
private void StartPopulateText(object sender, EventArgs e) private void StartPopulateText(object sender, EventArgs e)
@ -234,12 +252,14 @@ namespace DS4WinWPF.DS4Forms.ViewModels
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
int idx = 1; int idx = 1;
//foreach (DS4Device currentDev in devices) //foreach (DS4Device currentDev in devices)
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
items.Add($"{idx}: {currentDev.ConnectionType} {currentDev.Battery}%{(currentDev.Charging ? "+" : "")}"); items.Add($"{idx}: {currentDev.ConnectionType} {currentDev.Battery}%{(currentDev.Charging ? "+" : "")}");
idx++; idx++;
} }
_colLocker.ExitReadLock();
TooltipText = string.Join("\n", items); TooltipText = string.Join("\n", items);
} }
@ -248,11 +268,13 @@ namespace DS4WinWPF.DS4Forms.ViewModels
{ {
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
//foreach (DS4Device currentDev in devices) //foreach (DS4Device currentDev in devices)
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
SetupDeviceEvents(currentDev); SetupDeviceEvents(currentDev);
} }
_colLocker.ExitReadLock();
} }
private void SetupDeviceEvents(DS4Device device) private void SetupDeviceEvents(DS4Device device)
@ -274,6 +296,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
DS4Device currentDev = sender as DS4Device; DS4Device currentDev = sender as DS4Device;
ControllerHolder item = null; ControllerHolder item = null;
int idx = 0; int idx = 0;
_colLocker.EnterWriteLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
if (currentDev == holder.Device) if (currentDev == holder.Device)
@ -289,8 +313,11 @@ namespace DS4WinWPF.DS4Forms.ViewModels
{ {
controllerList.RemoveAt(idx); controllerList.RemoveAt(idx);
RemoveDeviceEvents(currentDev); RemoveDeviceEvents(currentDev);
PopulateToolText();
} }
_colLocker.ExitWriteLock();
PopulateToolText();
} }
private void HookEvents(object sender, EventArgs e) private void HookEvents(object sender, EventArgs e)

View File

@ -61,7 +61,7 @@ namespace DS4WinWPF.DS4Forms
// This is your progress event! // This is your progress event!
// It will fire on every buffer fill so don't do anything expensive. // It will fire on every buffer fill so don't do anything expensive.
// Writing to the console IS expensive, so don't do the following in practice... // Writing to the console IS expensive, so don't do the following in practice...
vigemInstallBtn.Content = Properties.Resources.Downloading.Replace("*number*", vigemInstallBtn.Content = Properties.Resources.Downloading.Replace("*number*%",
x.PercentComplete.ToString("P")); x.PercentComplete.ToString("P"));
//Console.WriteLine(x.PercentComplete.ToString("P")); //Console.WriteLine(x.PercentComplete.ToString("P"));
}); });

View File

@ -358,6 +358,10 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.ru.resx">
<SubType>Designer</SubType>
<DependentUpon>Resources.resx</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Translations\Strings.resx"> <EmbeddedResource Include="Translations\Strings.resx">
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput> <LastGenOutput>Strings.Designer.cs</LastGenOutput>
@ -366,6 +370,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<DependentUpon>Strings.resx</DependentUpon> <DependentUpon>Strings.resx</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Translations\Strings.ru.resx">
<SubType>Designer</SubType>
<DependentUpon>Strings.resx</DependentUpon>
</EmbeddedResource>
<None Include="app.manifest" /> <None Include="app.manifest" />
<None Include="NLog.config"> <None Include="NLog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

View File

@ -0,0 +1,558 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActionExists" xml:space="preserve">
<value>Имя данного действия уже существует</value>
</data>
<data name="AddingToList" xml:space="preserve">
<value>Добавить в список...</value>
</data>
<data name="AddPrograms" xml:space="preserve">
<value>Добавить программы</value>
</data>
<data name="ALocactionNeeded" xml:space="preserve">
<value>Для продолжения выберите место для сохранения настроек.</value>
</data>
<data name="AlwaysRainbow" xml:space="preserve">
<value>Всегда режим радуги</value>
</data>
<data name="AssignProfile" xml:space="preserve">
<value>Назначить *number*-му контроллеру</value>
</data>
<data name="Battery" xml:space="preserve">
<value>Уровень заряда: *number*%</value>
</data>
<data name="BestUsedRightSide" xml:space="preserve">
<value>Удобно использовать правую часть тачпада как кнопку мыши</value>
</data>
<data name="Browse" xml:space="preserve">
<value>Обзор…</value>
</data>
<data name="CannotMoveFiles" xml:space="preserve">
<value>Невозможно переместить файлы в новое место. Пожалуйста переименуйте папку с DS4Tool в "DS4Windows"</value>
</data>
<data name="CannotWriteHere" xml:space="preserve">
<value>Невозможно записать в текущее местоположение. Скопировать настройки в AppData?</value>
</data>
<data name="ChargeController" xml:space="preserve">
<value>Зарядите батарею</value>
</data>
<data name="Charged" xml:space="preserve">
<value>Заряжено</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка: *number*%</value>
</data>
<data name="CheckBattery" xml:space="preserve">
<value>Проверить аккумулятор</value>
</data>
<data name="CloseDS4W" xml:space="preserve">
<value>Закрыть DS4Windows?</value>
</data>
<data name="CloseMinimize" xml:space="preserve">
<value>Закрывать DS4Windows через значок уведомления</value>
</data>
<data name="Color" xml:space="preserve">
<value>Цвет</value>
</data>
<data name="ColorByBattery" xml:space="preserve">
<value>Цвет от заряда %</value>
</data>
<data name="Connecting" xml:space="preserve">
<value>Подключение...</value>
</data>
<data name="ContextEdit" xml:space="preserve">
<value>Редактировать профиль контроллера *number*</value>
</data>
<data name="ContextNew" xml:space="preserve">
<value>Создать профиль контроллера *number*</value>
</data>
<data name="ControllerWasRemoved" xml:space="preserve">
<value>Контроллер *Mac address* отключён или связь утеряна!</value>
</data>
<data name="CopyComplete" xml:space="preserve">
<value>Копирование завершено, пожалуйста перезапустите DS4Windows и удалите настройки из папки программы</value>
</data>
<data name="CopyFullColor" xml:space="preserve">
<value>Нажмите для копирования полного цвета</value>
</data>
<data name="CouldNotOpenDS4" xml:space="preserve">
<value>Внимание: Не удалось открыть DS4 *Mac adress* в приоритетном режиме</value>
</data>
<data name="Day" xml:space="preserve">
<value>день</value>
</data>
<data name="Days" xml:space="preserve">
<value>дней</value>
</data>
<data name="DeleteProfile" xml:space="preserve">
<value>Удалить профиль?</value>
</data>
<data name="DimByBattery" xml:space="preserve">
<value>Затемнение от заряда %</value>
</data>
<data name="DinputOnly" xml:space="preserve">
<value>Выключить режим XInput и использовать только DInput. Настройка "Скрыть контроллер DS4" должна быть выключена!</value>
</data>
<data name="DisconnectBT" xml:space="preserve">
<value>Отключить Bluetooth</value>
</data>
<data name="Disconnected" xml:space="preserve">
<value>Отключен</value>
</data>
<data name="Downloading" xml:space="preserve">
<value>Загрузка *number*%</value>
</data>
<data name="DownloadVersion" xml:space="preserve">
<value>Загрузить версию *number* ?</value>
</data>
<data name="DownText" xml:space="preserve">
<value>Вниз</value>
</data>
<data name="DS4Update" xml:space="preserve">
<value>Доступна новая версия DS4Windows!</value>
</data>
<data name="DS4WindowsCannotEditHere" xml:space="preserve">
<value>DS4Windows не может изменить настройки! Это приведёт сейчас к закрытию!</value>
</data>
<data name="EditProfile" xml:space="preserve">
<value>Редактировать</value>
</data>
<data name="FallBack" xml:space="preserve">
<value>Вернуть</value>
</data>
<data name="FallBackTo" xml:space="preserve">
<value>Вернуть на *button*</value>
</data>
<data name="FifthMouseDown" xml:space="preserve">
<value>5-я кнопка мыши Вниз</value>
</data>
<data name="FifthMouseUp" xml:space="preserve">
<value>5-я кнопка мыши Вверх</value>
</data>
<data name="FlashAtTip" xml:space="preserve">
<value>Нажмите для изменения цвета вспышки. Чёрный = стандартный цвет</value>
</data>
<data name="FlushHID" xml:space="preserve">
<value>Очищать запросы HID</value>
</data>
<data name="FlushHIDTip" xml:space="preserve">
<value>Очищать очереди HID после каждого считывания</value>
</data>
<data name="FoundController" xml:space="preserve">
<value>Найден контроллер:</value>
</data>
<data name="FourthMouseDown" xml:space="preserve">
<value>4-я кнопка мыши Вниз</value>
</data>
<data name="FourthMouseUp" xml:space="preserve">
<value>4-я кнопка мыши Вверх</value>
</data>
<data name="Full" xml:space="preserve">
<value>Заряжена</value>
</data>
<data name="GyroReadout" xml:space="preserve">
<value>Нажмите для просмотра текущих назначений гироскопа</value>
</data>
<data name="GyroX" xml:space="preserve">
<value>Гиро X, наклон влево и вправо</value>
</data>
<data name="GyroY" xml:space="preserve">
<value>Гиро Y, наклон вперёд и назад</value>
</data>
<data name="GyroZ" xml:space="preserve">
<value>Гиро Z, наклон вверх и вниз</value>
</data>
<data name="Hour" xml:space="preserve">
<value>час</value>
</data>
<data name="Hours" xml:space="preserve">
<value>часов</value>
</data>
<data name="HoverOverItems" xml:space="preserve">
<value>Наведите указатель мыши на пункты для получения подробного описания</value>
</data>
<data name="IfRemovingDS4Windows" xml:space="preserve">
<value>При удалении DS4Windows, вы можете удалить параметры настройки в папке профиля программы</value>
</data>
<data name="InputDelay" xml:space="preserve">
<value>Задержка ввода: {0} мс</value>
</data>
<data name="InstallComplete" xml:space="preserve">
<value>Установка завершена!</value>
</data>
<data name="InstallDriver" xml:space="preserve">
<value>Установите этот драйвер</value>
</data>
<data name="InstallFailed" xml:space="preserve">
<value>Установка не удалась. Пожалуйста повторите</value>
</data>
<data name="Installing" xml:space="preserve">
<value>Установка...</value>
</data>
<data name="Jitter" xml:space="preserve">
<value>Использовать Sixaxis для помощи в вычислении движений тачпада</value>
</data>
<data name="KeepThisSize" xml:space="preserve">
<value>Запоминать размер окна после закрытия</value>
</data>
<data name="LanguagePackApplyRestartRequired" xml:space="preserve">
<value>Выбранный языковой пакет будет применен после перезапуска приложения DS4Windows.</value>
</data>
<data name="LatencyNotOverTen" xml:space="preserve">
<value>Задержка *number*-го контроллера сейчас меньше 10 мс</value>
</data>
<data name="LatencyOverTen" xml:space="preserve">
<value>Задержка *number*-го контроллера больше 10 мс</value>
</data>
<data name="LaunchProgram" xml:space="preserve">
<value>Запустить *program*</value>
</data>
<data name="LightByBatteryTip" xml:space="preserve">
<value>Также затенять по времени простоя</value>
</data>
<data name="Loading" xml:space="preserve">
<value>Загрузка...</value>
</data>
<data name="LoadProfile" xml:space="preserve">
<value>Загрузить *profile*</value>
</data>
<data name="Macro" xml:space="preserve">
<value>Макрос</value>
</data>
<data name="MakeNewProfile" xml:space="preserve">
<value>Создать новый профиль</value>
</data>
<data name="NA" xml:space="preserve">
<value>Н/Д</value>
</data>
<data name="New" xml:space="preserve">
<value>Создать</value>
</data>
<data name="NoMacroRecorded" xml:space="preserve">
<value>Нет записанных макросов</value>
</data>
<data name="noneProfile" xml:space="preserve">
<value>(отсутствует)</value>
</data>
<data name="NoneText" xml:space="preserve">
<value>отсутствует</value>
</data>
<data name="NoProfileLoaded" xml:space="preserve">
<value>Профиль не загружен</value>
</data>
<data name="NotUsingProfile" xml:space="preserve">
<value>*number*-й контроллер не использует профиль</value>
</data>
<data name="NotValid" xml:space="preserve">
<value>Недопустимая операция</value>
</data>
<data name="OpeningInstaller" xml:space="preserve">
<value>Открытие установщика</value>
</data>
<data name="OpenScpDriver" xml:space="preserve">
<value>Пожалуйста, откройте SCPDrivers.exe</value>
</data>
<data name="OtherFileLocation" xml:space="preserve">
<value>, старые настройки из другой папки будут удалены</value>
</data>
<data name="PleaseDownloadUpdater" xml:space="preserve">
<value>Пожалуйста, скачайте Updater, поместите его в папку с программой и запустите снова</value>
</data>
<data name="PleaseImport" xml:space="preserve">
<value>Импортируйте или создайте профиль</value>
</data>
<data name="PlusNewProfile" xml:space="preserve">
<value>Новый профиль</value>
</data>
<data name="ProfileCannotRestore" xml:space="preserve">
<value>*Profile name* невозможно будет восстановить.</value>
</data>
<data name="ProfileFolderMoved" xml:space="preserve">
<value>Профили хранятся в папке с программой</value>
</data>
<data name="Programs" xml:space="preserve">
<value>Программы</value>
</data>
<data name="QuickCharge" xml:space="preserve">
<value>Автоотключение Bluetooth при подключении по USB</value>
</data>
<data name="QuitOtherPrograms" xml:space="preserve">
<value>Перед активацией функции "Спрятать DS4" вы должны выйти из игровых клиентов, таких как Steam, Uplay, Origin и пр.</value>
</data>
<data name="RecordText" xml:space="preserve">
<value>Запись</value>
</data>
<data name="RightClickPresets" xml:space="preserve">
<value>Правый клик для выбора пресета</value>
</data>
<data name="SaveRecordedMacro" xml:space="preserve">
<value>Сохранить записанный макрос?</value>
</data>
<data name="ScanCode" xml:space="preserve">
<value>Скан-код</value>
</data>
<data name="SearchingController" xml:space="preserve">
<value>Поиск контроллеров...</value>
</data>
<data name="SelectActionTitle" xml:space="preserve">
<value>Выберите действие для *action*</value>
</data>
<data name="SetRegularTrigger" xml:space="preserve">
<value>Назначить регулярный триггер</value>
</data>
<data name="SetUnloadTrigger" xml:space="preserve">
<value>Назначить выгружаемый триггер</value>
</data>
<data name="Shortcuts" xml:space="preserve">
<value>Ярлыки</value>
</data>
<data name="SixAxisReading" xml:space="preserve">
<value>Нажмите для считывания дополнительных возможностей Sixaxis</value>
</data>
<data name="Starting" xml:space="preserve">
<value>Запуск...</value>
</data>
<data name="StartText" xml:space="preserve">
<value>Запустить</value>
</data>
<data name="Step1" xml:space="preserve">
<value>Шаг 1: Установите драйвер DS4</value>
</data>
<data name="StopHText" xml:space="preserve">
<value>Ост. тяжёлый</value>
</data>
<data name="StopLText" xml:space="preserve">
<value>Ост. лёгкий</value>
</data>
<data name="StoppedDS4Tool" xml:space="preserve">
<value>Остановлена работа DS4Windows</value>
</data>
<data name="StoppedDS4Windows" xml:space="preserve">
<value>Остановлена работа DS4Windows</value>
</data>
<data name="StoppingDS4" xml:space="preserve">
<value>Остановка контроллеров DS4</value>
</data>
<data name="StoppingX360" xml:space="preserve">
<value>Остановка контроллеров X360</value>
</data>
<data name="StopText" xml:space="preserve">
<value>Остановить</value>
</data>
<data name="SwipeDown" xml:space="preserve">
<value>Ск-ж. вниз</value>
</data>
<data name="SwipeLeft" xml:space="preserve">
<value>Ск-ж. влево</value>
</data>
<data name="SwipeRight" xml:space="preserve">
<value>Ск-ж. вправо</value>
</data>
<data name="SwipeTouchpad" xml:space="preserve">
<value>Проводить пальцем по тачпаду для смены профиля</value>
</data>
<data name="SwipeUp" xml:space="preserve">
<value>Ск-ж. вверх</value>
</data>
<data name="TapAndHold" xml:space="preserve">
<value>Коснитесь и удерживайте для перетаскивания, задержка с одним касанием</value>
</data>
<data name="TestHText" xml:space="preserve">
<value>Тест. тяжёлого</value>
</data>
<data name="TestLText" xml:space="preserve">
<value>Тест. лёгкого</value>
</data>
<data name="TestText" xml:space="preserve">
<value>Проверка</value>
</data>
<data name="TextDocs" xml:space="preserve">
<value>Текстовый документ (*.txt)</value>
</data>
<data name="TiltDown" xml:space="preserve">
<value>Накл. вниз</value>
</data>
<data name="TiltLeft" xml:space="preserve">
<value>Накл. влево</value>
</data>
<data name="TiltRight" xml:space="preserve">
<value>Накл. вправо</value>
</data>
<data name="TiltUp" xml:space="preserve">
<value>Накл. вверх</value>
</data>
<data name="TouchpadMovementOff" xml:space="preserve">
<value>Движения тачпадом выключены</value>
</data>
<data name="TouchpadMovementOn" xml:space="preserve">
<value>Движения тачпадом включены</value>
</data>
<data name="TouchpadOffTip" xml:space="preserve">
<value>Повторное включение нажатием PS + Touchpad</value>
</data>
<data name="TwoFingerSwipe" xml:space="preserve">
<value>Проведение двумя пальцами по тачпаду влево или вправо</value>
</data>
<data name="TypeNewName" xml:space="preserve">
<value>введите сюда новое имя</value>
</data>
<data name="TypeProfileName" xml:space="preserve">
<value>введите сюда имя профиля</value>
</data>
<data name="Unassigned" xml:space="preserve">
<value>Не назначено</value>
</data>
<data name="UpText" xml:space="preserve">
<value>Вверх</value>
</data>
<data name="UpToDate" xml:space="preserve">
<value>У вас стоит последняя версия</value>
</data>
<data name="UseControllerForMapping" xml:space="preserve">
<value>Используйте контроллер для изменения назначений</value>
</data>
<data name="UsingExclusive" xml:space="preserve">
<value>Включен приоритетный режим</value>
</data>
<data name="UsingProfile" xml:space="preserve">
<value>Для *number*-го контроллера задействован профиль "*Profile name*"</value>
</data>
<data name="UsingShared" xml:space="preserve">
<value>Включен совместный режим</value>
</data>
<data name="UsingTPSwipes" xml:space="preserve">
<value>Это отключит возможность использования тачпада в качестве указателя</value>
</data>
<data name="ValidName" xml:space="preserve">
<value>Пожалуйста, введите допустимое имя</value>
</data>
<data name="WaitMS" xml:space="preserve">
<value>Задержка *number**мс*</value>
</data>
<data name="WillKeep" xml:space="preserve">
<value>Удержание</value>
</data>
<data name="XinputPorts" xml:space="preserve">
<value>Используйте иной порт, если у вас возникла проблема с другой программой эмулятора контроллера X360, такой как SCP's tool</value>
</data>
<data name="XMLFiles" xml:space="preserve">
<value>XML-файлы (*.xml)</value>
</data>
</root>

View File

@ -0,0 +1,309 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Accel" xml:space="preserve">
<value>Ускорение</value>
</data>
<data name="Action" xml:space="preserve">
<value>Действие</value>
</data>
<data name="AddDirectory" xml:space="preserve">
<value>Добавить каталог</value>
</data>
<data name="AddPrograms" xml:space="preserve">
<value>Добавить программы</value>
</data>
<data name="AddStartMenuPrograms" xml:space="preserve">
<value>Добавить программы меню Пуск</value>
</data>
<data name="AddSteamGames" xml:space="preserve">
<value>Добавить игры Steam</value>
</data>
<data name="All" xml:space="preserve">
<value>Все</value>
</data>
<data name="AutoProfiles" xml:space="preserve">
<value>Авто-Профили</value>
</data>
<data name="Battery" xml:space="preserve">
<value>Аккумулятор</value>
</data>
<data name="Browse" xml:space="preserve">
<value>Выбрать</value>
</data>
<data name="BrowseOtherPrograms" xml:space="preserve">
<value>Выбрать другие программы</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Отмена</value>
</data>
<data name="CheckUpdateNow" xml:space="preserve">
<value>Проверка обновлений</value>
</data>
<data name="CheckUpdateStartup" xml:space="preserve">
<value>Проверка обновлений при запуске</value>
</data>
<data name="Clear" xml:space="preserve">
<value>Очистить</value>
</data>
<data name="CloseMinimizes" xml:space="preserve">
<value>Сворачивать при закрытии</value>
</data>
<data name="Color" xml:space="preserve">
<value>Цвет</value>
</data>
<data name="Controller1Text" xml:space="preserve">
<value>Контроллер 1</value>
</data>
<data name="Controller2Text" xml:space="preserve">
<value>Контроллер 2</value>
</data>
<data name="Controller3Text" xml:space="preserve">
<value>Контроллер 3</value>
</data>
<data name="Controller4Text" xml:space="preserve">
<value>Контроллер 4</value>
</data>
<data name="Controllers" xml:space="preserve">
<value>Контроллеры</value>
</data>
<data name="ControlPanel" xml:space="preserve">
<value>Панель управления</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Удалить</value>
</data>
<data name="DriverSetup" xml:space="preserve">
<value>Настройка драйвера контроллера</value>
</data>
<data name="Duplicate" xml:space="preserve">
<value>Дублировать</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Редактировать</value>
</data>
<data name="EditAction" xml:space="preserve">
<value>Изменить действие</value>
</data>
<data name="Export" xml:space="preserve">
<value>Экспорт</value>
</data>
<data name="Full" xml:space="preserve">
<value>Полностью</value>
</data>
<data name="Gyro" xml:space="preserve">
<value>Гироскоп</value>
</data>
<data name="HideUnchecked" xml:space="preserve">
<value>Скрыть не выбранные</value>
</data>
<data name="Import" xml:space="preserve">
<value>Импорт</value>
</data>
<data name="LeftStick" xml:space="preserve">
<value>Левый стик</value>
</data>
<data name="Log" xml:space="preserve">
<value>Журнал</value>
</data>
<data name="Name" xml:space="preserve">
<value>Название</value>
</data>
<data name="New" xml:space="preserve">
<value>Новый</value>
</data>
<data name="NewAction" xml:space="preserve">
<value>Новое действие</value>
</data>
<data name="NewProfile" xml:space="preserve">
<value>Новый профиль</value>
</data>
<data name="None" xml:space="preserve">
<value>Нет</value>
</data>
<data name="Path" xml:space="preserve">
<value>Путь</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Профиль</value>
</data>
<data name="ProfileFolder" xml:space="preserve">
<value>Папка профиля</value>
</data>
<data name="QuickCharge" xml:space="preserve">
<value>Быстрая зарядка</value>
</data>
<data name="RecordText" xml:space="preserve">
<value>Запись</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Удалить</value>
</data>
<data name="RemoveAction" xml:space="preserve">
<value>Удалить действие</value>
</data>
<data name="RightStick" xml:space="preserve">
<value>Правый стик</value>
</data>
<data name="Rumble" xml:space="preserve">
<value>Вибрация</value>
</data>
<data name="RunAtStartup" xml:space="preserve">
<value>Запускать при запуске системы</value>
</data>
<data name="Save" xml:space="preserve">
<value>Сохранить</value>
</data>
<data name="SaveProfile" xml:space="preserve">
<value>Сохранить</value>
</data>
<data name="Settings" xml:space="preserve">
<value>Настройки</value>
</data>
<data name="ShowNotifications" xml:space="preserve">
<value>Показать уведомления</value>
</data>
<data name="StartMinimized" xml:space="preserve">
<value>Запускать свернутым</value>
</data>
<data name="StartText" xml:space="preserve">
<value>Старт</value>
</data>
<data name="Status" xml:space="preserve">
<value>Статус</value>
</data>
<data name="StopText" xml:space="preserve">
<value>Стоп</value>
</data>
<data name="TouchScroll" xml:space="preserve">
<value>Прокрутка</value>
</data>
<data name="TouchSlide" xml:space="preserve">
<value>Скольжение</value>
</data>
<data name="TouchTap" xml:space="preserve">
<value>Касание</value>
</data>
<data name="Trigger" xml:space="preserve">
<value>Триггер</value>
</data>
<data name="WarningsOnly" xml:space="preserve">
<value>Только предупреждения</value>
</data>
</root>