diff --git a/DS4Windows/App.xaml.cs b/DS4Windows/App.xaml.cs index dacfcfb5..2baa5c09 100644 --- a/DS4Windows/App.xaml.cs +++ b/DS4Windows/App.xaml.cs @@ -1193,10 +1193,11 @@ private void SetUICulture(string culture) CultureInfo ci = CultureInfo.GetCultureInfo(culture); LocalizeDictionary.Instance.SetCurrentThreadCulture = true; LocalizeDictionary.Instance.Culture = ci; + DS4Forms.RuntimeXamlTranslator.Initialize(ci); // fixes the culture in threads CultureInfo.DefaultThreadCurrentCulture = ci; CultureInfo.DefaultThreadCurrentUICulture = ci; - //DS4WinWPF.Properties.Resources.Culture = ci; + DS4WinWPF.Properties.Resources.Culture = ci; Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; } diff --git a/DS4Windows/DS4Forms/AudioHapticsControl.xaml.cs b/DS4Windows/DS4Forms/AudioHapticsControl.xaml.cs index 5e90bc96..56ed5c97 100644 --- a/DS4Windows/DS4Forms/AudioHapticsControl.xaml.cs +++ b/DS4Windows/DS4Forms/AudioHapticsControl.xaml.cs @@ -277,8 +277,8 @@ private void UpdateStatus(AudioHapticsProfileSettings settings) { if (settings == null) { - statusText.Text = "Select a controller"; - sourceStatusText.Text = "No source"; + statusText.Text = Properties.Resources.AHStatusSelectController; + sourceStatusText.Text = Properties.Resources.AHStatusNoSource; statusDot.Fill = FindBrush("MutedForegroundColor", Brushes.Gray); return; } @@ -286,7 +286,7 @@ private void UpdateStatus(AudioHapticsProfileSettings settings) sourceStatusText.Text = SourceDisplayName(settings); if (!settings.Enabled) { - statusText.Text = "Off"; + statusText.Text = Properties.Resources.AHStatusOff; statusDot.Fill = FindBrush("MutedForegroundColor", Brushes.Gray); return; } @@ -296,7 +296,7 @@ private void UpdateStatus(AudioHapticsProfileSettings settings) Program.rootHub?.DS4Controllers[deviceIndex] != null; if (!liveController) { - statusText.Text = "Saved to profile"; + statusText.Text = Properties.Resources.AHStatusSavedToProfile; statusDot.Fill = FindBrush("AccentColor", Brushes.DodgerBlue); return; } @@ -304,7 +304,7 @@ private void UpdateStatus(AudioHapticsProfileSettings settings) AudioHapticsRuntimeStatus runtime = Program.rootHub.GetAudioHapticsStatus(deviceIndex); statusText.Text = runtime.Active && - !settings.AutomaticGameDetection ? "Active" : runtime.Message; + !settings.AutomaticGameDetection ? Properties.Resources.AHStatusActive : runtime.Message; statusDot.Fill = runtime.Active ? FindBrush("SuccessColor", Brushes.LimeGreen) : FindBrush("AccentColor", Brushes.DodgerBlue); @@ -312,13 +312,13 @@ private void UpdateStatus(AudioHapticsProfileSettings settings) private static string SourceDisplayName(AudioHapticsProfileSettings settings) => settings.Source switch { - AudioHapticsSourceKind.ControllerAudio => "Controller audio", + AudioHapticsSourceKind.ControllerAudio => Properties.Resources.AHSourceControllerAudio, AudioHapticsSourceKind.AppSession when - settings.AutomaticGameDetection => "Automatic game detection", + settings.AutomaticGameDetection => Properties.Resources.AHSourceAutoGameDetection, AudioHapticsSourceKind.AppSession => string.IsNullOrWhiteSpace(settings.DisplayName) - ? (string.IsNullOrWhiteSpace(settings.ExecutableName) ? "Selected app" : settings.ExecutableName) + ? (string.IsNullOrWhiteSpace(settings.ExecutableName) ? Properties.Resources.AHSourceSelectedApp : settings.ExecutableName) : settings.DisplayName, - _ => "System audio · default output", + _ => Properties.Resources.AHSourceSystemAudioDefault, }; private Brush FindBrush(string key, Brush fallback) => TryFindResource(key) as Brush ?? fallback; diff --git a/DS4Windows/DS4Forms/MappingLiveInputControl.xaml.cs b/DS4Windows/DS4Forms/MappingLiveInputControl.xaml.cs index 8f6c287f..65ca733a 100644 --- a/DS4Windows/DS4Forms/MappingLiveInputControl.xaml.cs +++ b/DS4Windows/DS4Forms/MappingLiveInputControl.xaml.cs @@ -82,7 +82,7 @@ internal void RenderSnapshot(DS4State raw, InputDeviceType type) { projection.Update(raw, type); if (!projection.Valid) { RenderStatus(MappingLiveInputStatus.Waiting); return; } - liveStatus.Text = "Live"; + liveStatus.Text = Properties.Resources.MLLive; RenderStick(leftStickPlot, leftStickDot, leftStickValue, projection.LeftX, projection.LeftY, projection.LeftPresent); RenderStick(rightStickPlot, rightStickDot, rightStickValue, projection.RightX, projection.RightY, projection.RightPresent); leftTriggerName.Text = projection.LeftTriggerName; @@ -91,7 +91,7 @@ internal void RenderSnapshot(DS4State raw, InputDeviceType type) rightTriggerMeter.Value = projection.RightTrigger; leftTriggerValue.Text = $"{projection.LeftTrigger:0}%"; rightTriggerValue.Text = $"{projection.RightTrigger:0}%"; - pressedButtons.Text = projection.PressedButtons.Length == 0 ? "No buttons pressed" : projection.PressedButtons; + pressedButtons.Text = projection.PressedButtons.Length == 0 ? Properties.Resources.MLNoButtonsPressed : projection.PressedButtons; pressedButtons.ToolTip = pressedButtons.Text; } @@ -110,21 +110,22 @@ internal void RenderStatus(MappingLiveInputStatus status) { liveStatus.Text = status switch { - MappingLiveInputStatus.Disconnected => "Disconnected", - MappingLiveInputStatus.Replaced => "Controller changed", - MappingLiveInputStatus.Stale => "No recent input", - _ => "Waiting" + MappingLiveInputStatus.Disconnected => Properties.Resources.Disconnected, + MappingLiveInputStatus.Replaced => Properties.Resources.MLControllerChanged, + MappingLiveInputStatus.Stale => Properties.Resources.MLNoRecentInput, + _ => Properties.Resources.MLWaiting }; pressedButtons.Text = status switch { - MappingLiveInputStatus.Replaced => "Reopen the editor to preview the new controller.", - MappingLiveInputStatus.Disconnected => "Controller disconnected. Reconnect and reopen the editor.", - MappingLiveInputStatus.Stale => "Waiting for fresh controller input…", - _ => snapshot.HasBoundDevice ? "Waiting for controller input…" : - "Open this profile from a connected controller." + MappingLiveInputStatus.Replaced => Properties.Resources.MLReopenForNewController, + MappingLiveInputStatus.Disconnected => Properties.Resources.MLControllerDisconnectedReopen, + MappingLiveInputStatus.Stale => Properties.Resources.MLWaitingForFreshInput, + _ => snapshot.HasBoundDevice ? Properties.Resources.MLWaitingForInput : + Properties.Resources.MLOpenFromConnectedController }; pressedButtons.ToolTip = pressedButtons.Text; - leftStickValue.Text = rightStickValue.Text = "X —\nY —"; + leftStickValue.Text = rightStickValue.Text = + DS4WinWPF.Translations.Strings.ResourceManager.GetString("MappingLive.AxisPlaceholder", DS4WinWPF.Translations.Strings.Culture); leftTriggerValue.Text = rightTriggerValue.Text = "—"; leftTriggerMeter.Value = rightTriggerMeter.Value = 0; leftStickPlot.Opacity = rightStickPlot.Opacity = 0.35; diff --git a/DS4Windows/DS4Forms/RuntimeXamlTranslator.cs b/DS4Windows/DS4Forms/RuntimeXamlTranslator.cs new file mode 100644 index 00000000..67ddcba7 --- /dev/null +++ b/DS4Windows/DS4Forms/RuntimeXamlTranslator.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using DS4WinWPF.Translations; + +namespace DS4WinWPF.DS4Forms +{ + /// + /// Translates plain English text written directly in XAML (Text, Content, Header, + /// ToolTip, Title, and inline Runs) when the selected language is not English. + /// XAML keeps its English literals, so markup stays readable and tests that inspect + /// it keep working; the English value in Translations/Strings.resx is the lookup key. + /// Bound and styled values are left alone, and text already localized through + /// {lex:Loc} no longer matches an English entry. + /// + internal static class RuntimeXamlTranslator + { + private static readonly Regex Whitespace = new(@"\s+", RegexOptions.Compiled); + private static readonly ConditionalWeakTable visited = new(); + + private static Dictionary> exactKeys; + private static Dictionary> looseKeys; + private static Dictionary englishValues; + private static CultureInfo culture; + private static bool registered; + + internal static void Initialize(CultureInfo selectedCulture) + { + culture = selectedCulture; + if (culture.TwoLetterISOLanguageName == "en" || culture.Equals(CultureInfo.InvariantCulture)) + { + exactKeys = null; + looseKeys = null; + return; + } + + BuildLookup(); + if (!registered) + { + // Loaded is only broadcast to elements with instance handlers, so it would + // skip most controls. Every element gets SizeChanged on its first layout, + // before it is rendered, including template and late-shown content. + EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.SizeChangedEvent, + new SizeChangedEventHandler(OnElementSized), true); + registered = true; + } + } + + private static void BuildLookup() + { + exactKeys = new Dictionary>(StringComparer.Ordinal); + looseKeys = new Dictionary>(StringComparer.Ordinal); + englishValues = new Dictionary(StringComparer.Ordinal); + ResourceSet english = Strings.ResourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); + if (english == null) + { + return; + } + + foreach (DictionaryEntry entry in english.Cast().OrderBy(entry => (string)entry.Key, StringComparer.Ordinal)) + { + if (entry.Value is not string value || string.IsNullOrWhiteSpace(value)) + { + continue; + } + + string key = (string)entry.Key; + englishValues[key] = value; + AddKey(exactKeys, value, key); + AddKey(looseKeys, Loose(value), key); + } + } + + private static void AddKey(Dictionary> lookup, string text, string key) + { + if (!lookup.TryGetValue(text, out List keys)) + { + lookup[text] = keys = new List(); + } + + keys.Add(key); + } + + private static string Loose(string text) => + Whitespace.Replace(text, string.Empty).ToLowerInvariant(); + + internal static string Translate(string english) + { + if (exactKeys == null || string.IsNullOrWhiteSpace(english)) + { + return null; + } + + // The same English text can live under several keys; use the first one the + // selected language actually translates. + string normalized = Whitespace.Replace(english, " ").Trim(); + IEnumerable candidates = Candidates(exactKeys, english) + .Concat(Candidates(exactKeys, normalized)) + .Concat(Candidates(looseKeys, Loose(english))); + foreach (string key in candidates) + { + string translated = Strings.ResourceManager.GetString(key, culture); + if (!string.IsNullOrEmpty(translated) && translated != englishValues[key]) + { + return translated; + } + } + + return null; + } + + private static IEnumerable Candidates(Dictionary> lookup, string text) => + lookup.TryGetValue(text, out List keys) ? keys : Enumerable.Empty(); + + private static void OnElementSized(object sender, SizeChangedEventArgs e) + { + if (exactKeys == null || sender is not FrameworkElement element || + visited.TryGetValue(element, out _)) + { + return; + } + + visited.Add(element, null); + + TranslateProperty(element, FrameworkElement.ToolTipProperty); + switch (element) + { + case Window: + TranslateProperty(element, Window.TitleProperty); + break; + case TextBlock textBlock: + TranslateTextBlock(textBlock); + break; + case HeaderedContentControl: + TranslateProperty(element, HeaderedContentControl.HeaderProperty); + break; + case HeaderedItemsControl: + TranslateProperty(element, HeaderedItemsControl.HeaderProperty); + break; + case ListView { View: GridView gridView }: + foreach (GridViewColumn column in gridView.Columns) + { + TranslateProperty(column, GridViewColumn.HeaderProperty); + } + break; + } + + if (element is ContentControl) + { + TranslateProperty(element, ContentControl.ContentProperty); + } + } + + private static void TranslateTextBlock(TextBlock textBlock) + { + // A set Text (literal or bound) is mirrored into an internal Run, so the + // inlines are only examined when the text came from element content. + if (textBlock.ReadLocalValue(TextBlock.TextProperty) != DependencyProperty.UnsetValue) + { + TranslateProperty(textBlock, TextBlock.TextProperty); + return; + } + + // Literal element content becomes Runs; translate the whole block when it is + // plain text, otherwise each Run (e.g. inside a Hyperlink) on its own. + if (textBlock.Inlines.All(inline => inline is Run or LineBreak) && + textBlock.Inlines.OfType().All(IsLocalLiteral)) + { + string combined = string.Concat(textBlock.Inlines.Select(inline => inline is Run run ? run.Text : "\n")); + string translated = Translate(combined); + if (translated != null) + { + textBlock.Inlines.Clear(); + textBlock.Inlines.Add(new Run(translated)); + return; + } + } + + TranslateInlines(textBlock.Inlines); + } + + private static void TranslateInlines(InlineCollection inlines) + { + foreach (Inline inline in inlines.ToList()) + { + switch (inline) + { + case Run run: + TranslateProperty(run, Run.TextProperty); + break; + case Span span: + TranslateInlines(span.Inlines); + break; + } + } + } + + private static bool IsLocalLiteral(DependencyObject target) => + IsLocalLiteral(target, Run.TextProperty); + + // A binding or markup extension is stored as an expression, not a string, so + // only text that was written as a literal is ever replaced. + private static bool IsLocalLiteral(DependencyObject target, DependencyProperty property) => + target.ReadLocalValue(property) is string; + + private static bool TranslateProperty(DependencyObject target, DependencyProperty property) + { + if (target.GetValue(property) is not string english || !IsLocalLiteral(target, property)) + { + return false; + } + + string translated = Translate(english); + if (translated == null) + { + return false; + } + + target.SetValue(property, translated); + return true; + } + } +} diff --git a/DS4Windows/DS4Forms/Switch2StickCalibrationWindow.xaml.cs b/DS4Windows/DS4Forms/Switch2StickCalibrationWindow.xaml.cs index 16766d2e..7f1fbf22 100644 --- a/DS4Windows/DS4Forms/Switch2StickCalibrationWindow.xaml.cs +++ b/DS4Windows/DS4Forms/Switch2StickCalibrationWindow.xaml.cs @@ -36,7 +36,7 @@ internal Switch2StickCalibrationWindow(Switch2RuntimeInputDevice runtime) private async void Reset_Click(object sender, RoutedEventArgs e) { if (viewModel.CanStart && MessageBox.Show(this, viewModel.ResetConfirmation, - "Reset PC stick calibration", MessageBoxButton.YesNo, MessageBoxImage.Question, + Properties.Resources.Switch2CalibResetDialogTitle, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) await viewModel.ResetAsync(); } diff --git a/DS4Windows/DS4Forms/TriggerLabControl.xaml.cs b/DS4Windows/DS4Forms/TriggerLabControl.xaml.cs index f31fbb69..f012c38d 100644 --- a/DS4Windows/DS4Forms/TriggerLabControl.xaml.cs +++ b/DS4Windows/DS4Forms/TriggerLabControl.xaml.cs @@ -65,39 +65,39 @@ private sealed class FullPullModeChoice { new FullPullModeChoice { - Name = "Off", + Name = Properties.Resources.TLModeOff, Mode = TwoStageTriggerMode.Disabled, - Description = "Only the regular trigger action runs.", + Description = Properties.Resources.TLModeOffDesc, }, new FullPullModeChoice { - Name = "Add at full pull", + Name = Properties.Resources.TLModeAddAtFullPull, Mode = TwoStageTriggerMode.Normal, - Description = "Keep the regular trigger action active and also run the full-pull action at the end of travel.", + Description = Properties.Resources.TLModeAddAtFullPullDesc, }, new FullPullModeChoice { - Name = "Replace at full pull", + Name = Properties.Resources.TLModeReplaceAtFullPull, Mode = TwoStageTriggerMode.ExclusiveButtons, - Description = "Release the regular trigger action and replace it with the full-pull action at the end of travel.", + Description = Properties.Resources.TLModeReplaceAtFullPullDesc, }, new FullPullModeChoice { - Name = "Hair trigger", + Name = Properties.Resources.TLModeHairTrigger, Mode = TwoStageTriggerMode.HairTrigger, - Description = "Run both actions at full pull, then release both as soon as the trigger backs away from the end stop.", + Description = Properties.Resources.TLModeHairTriggerDesc, }, new FullPullModeChoice { - Name = "Hip fire", + Name = Properties.Resources.TLModeHipFire, Mode = TwoStageTriggerMode.HipFire, - Description = "Wait for the chosen delay, then run the regular or full-pull action based on how far the trigger was pressed.", + Description = Properties.Resources.TLModeHipFireDesc, }, new FullPullModeChoice { - Name = "Hip fire (exclusive)", + Name = Properties.Resources.TLModeHipFireExclusive, Mode = TwoStageTriggerMode.HipFireExclusiveButtons, - Description = "Wait for the chosen delay and run only one action: regular pull or full pull.", + Description = Properties.Resources.TLModeHipFireExclusiveDesc, }, }; @@ -183,7 +183,7 @@ public void RefreshSettings() IsEnabled = available; if (!available) { - labStatusText.Text = "Select a controller or profile to open Trigger Lab."; + labStatusText.Text = Properties.Resources.TLSelectToOpen; return; } @@ -231,13 +231,13 @@ private UIElement BuildSideCard(SideUi ui) }; heading.Children.Add(triggerGraphic); StackPanel title = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; - title.Children.Add(new TextBlock { Text = ui.IsLeft ? "Left Trigger" : "Right Trigger", FontSize = 17, FontWeight = FontWeights.SemiBold }); - title.Children.Add(new TextBlock { Text = $"Shape the {(ui.IsLeft ? "L2" : "R2")} trigger feel", Foreground = FindBrush("MutedForegroundColor", Brushes.Gray) }); + title.Children.Add(new TextBlock { Text = ui.IsLeft ? Properties.Resources.TLLeftTrigger : Properties.Resources.TLRightTrigger, FontSize = 17, FontWeight = FontWeights.SemiBold }); + title.Children.Add(new TextBlock { Text = string.Format(Properties.Resources.TLShapeTriggerFeelFormat, ui.IsLeft ? "L2" : "R2"), Foreground = FindBrush("MutedForegroundColor", Brushes.Gray) }); Grid.SetColumn(title, 1); heading.Children.Add(title); StackPanel active = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; ui.ActiveLabel = new TextBlock { - Text = "Active", + Text = Properties.Resources.TLActiveLabel, Margin = new Thickness(0, 0, 8, 0), VerticalAlignment = VerticalAlignment.Center, }; @@ -255,9 +255,9 @@ private UIElement BuildSideCard(SideUi ui) profileRow.Children.Add(ui.Profile); StackPanel profileActions = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(8, 0, 0, 0) }; Grid.SetColumn(profileActions, 1); - profileActions.Children.Add(MakeIconButton("\uE74E", "Save new trigger profile", (_, _) => SaveCustomProfile(ui))); - ui.RenameProfile = MakeIconButton("\uE70F", "Rename trigger profile", (_, _) => RenameCustomProfile(ui)); - ui.DeleteProfile = MakeIconButton("\uE74D", "Delete trigger profile", (_, _) => DeleteCustomProfile(ui)); + profileActions.Children.Add(MakeIconButton("\uE74E", Properties.Resources.TLSaveProfileTip, (_, _) => SaveCustomProfile(ui))); + ui.RenameProfile = MakeIconButton("\uE70F", Properties.Resources.TLRenameProfileTip, (_, _) => RenameCustomProfile(ui)); + ui.DeleteProfile = MakeIconButton("\uE74D", Properties.Resources.TLDeleteProfileTip, (_, _) => DeleteCustomProfile(ui)); profileActions.Children.Add(ui.RenameProfile); profileActions.Children.Add(ui.DeleteProfile); profileRow.Children.Add(profileActions); @@ -272,24 +272,24 @@ private UIElement BuildSideCard(SideUi ui) Grid modes = new Grid(); for (int i = 0; i < 3; i++) modes.ColumnDefinitions.Add(new ColumnDefinition()); - ui.Feedback = MakeModeButton("Feedback", ui, TriggerLabMode.Feedback, 0); - ui.Weapon = MakeModeButton("Weapon", ui, TriggerLabMode.Weapon, 1); - ui.Vibration = MakeModeButton("Vibration", ui, TriggerLabMode.Vibration, 2); + ui.Feedback = MakeModeButton(Properties.Resources.TLModeFeedback, ui, TriggerLabMode.Feedback, 0); + ui.Weapon = MakeModeButton(Properties.Resources.TLModeWeapon, ui, TriggerLabMode.Weapon, 1); + ui.Vibration = MakeModeButton(Properties.Resources.TLModeVibration, ui, TriggerLabMode.Vibration, 2); modes.Children.Add(ui.Feedback); modes.Children.Add(ui.Weapon); modes.Children.Add(ui.Vibration); root.Children.Add(modes); - root.Children.Add(MakeMeter("Start", ui, out ui.Start, out ui.StartValue)); - root.Children.Add(MakeMeter("Wall", ui, out ui.Wall, out ui.WallValue)); - root.Children.Add(MakeMeter("Force", ui, out ui.Force, out ui.ForceValue)); + root.Children.Add(MakeMeter(Properties.Resources.TLMeterStart, "Start", ui, out ui.Start, out ui.StartValue)); + root.Children.Add(MakeMeter(Properties.Resources.TLMeterWall, "Wall", ui, out ui.Wall, out ui.WallValue)); + root.Children.Add(MakeMeter(Properties.Resources.TLMeterForce, "Force", ui, out ui.Force, out ui.ForceValue)); root.Children.Add(BuildFullPullSection(ui)); root.Children.Add(BuildGameRumbleVibrationSection(ui)); Grid actions = new Grid { Margin = new Thickness(0, 14, 0, 0) }; actions.ColumnDefinitions.Add(new ColumnDefinition()); actions.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(8) }); actions.ColumnDefinitions.Add(new ColumnDefinition()); - Button preview = new Button { Content = "\u25B6 Preview", MinHeight = 38, Style = FindResource("BridgeSecondaryButtonStyle") as Style }; + Button preview = new Button { Content = "\u25B6 " + Properties.Resources.TLPreview, MinHeight = 38, Style = FindResource("BridgeSecondaryButtonStyle") as Style }; preview.Click += (_, _) => Preview(ui); - Button reset = new Button { Content = $"\u21BB Reset {(ui.IsLeft ? "L2" : "R2")}", MinHeight = 38, Style = FindResource("BridgeSecondaryButtonStyle") as Style }; + Button reset = new Button { Content = "\u21BB " + string.Format(Properties.Resources.TLResetFormat, ui.IsLeft ? "L2" : "R2"), MinHeight = 38, Style = FindResource("BridgeSecondaryButtonStyle") as Style }; reset.Click += (_, _) => ResetSide(ui); Grid.SetColumn(reset, 2); actions.Children.Add(preview); actions.Children.Add(reset); root.Children.Add(actions); return root; @@ -307,13 +307,15 @@ private Border BuildGameRumbleVibrationSection(SideUi ui) StackPanel copy = new StackPanel(); copy.Children.Add(new TextBlock { - Text = "Game rumble vibration", + Text = Properties.Resources.TLGameRumbleTitle, FontSize = 15, FontWeight = FontWeights.SemiBold, }); copy.Children.Add(new TextBlock { - Text = $"Stream the game's {(ui.IsLeft ? "heavy / left" : "light / right")} HID rumble motor to {(ui.IsLeft ? "L2" : "R2")} as a low-latency vibration effect.", + Text = string.Format(Properties.Resources.TLGameRumbleDescFormat, + ui.IsLeft ? Properties.Resources.TLHeavyLeft : Properties.Resources.TLLightRight, + ui.IsLeft ? "L2" : "R2"), Margin = new Thickness(0, 4, 14, 0), Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), TextWrapping = TextWrapping.Wrap, @@ -324,7 +326,7 @@ private Border BuildGameRumbleVibrationSection(SideUi ui) { Style = FindResource("LabToggle") as Style, VerticalAlignment = VerticalAlignment.Center, - ToolTip = $"Independently enable game-rumble vibration for {(ui.IsLeft ? "L2" : "R2")}. This does not link the other trigger.", + ToolTip = string.Format(Properties.Resources.TLGameRumbleTipFormat, ui.IsLeft ? "L2" : "R2"), }; ui.GameRumbleVibration.Click += (_, _) => GameRumbleVibrationChanged(ui); @@ -361,7 +363,7 @@ private Border BuildFullPullSection(SideUi ui) }); heading.Children.Add(new TextBlock { - Text = "Full-pull action", + Text = Properties.Resources.TLFullPullActionTitle, FontSize = 15, FontWeight = FontWeights.SemiBold, VerticalAlignment = VerticalAlignment.Center, @@ -375,7 +377,7 @@ private Border BuildFullPullSection(SideUi ui) Padding = new Thickness(7, 3, 7, 3), Child = new TextBlock { - Text = "END OF TRAVEL", + Text = Properties.Resources.TLEndOfTravelBadge, FontSize = 9, FontWeight = FontWeights.Bold, Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), @@ -386,7 +388,7 @@ private Border BuildFullPullSection(SideUi ui) content.Children.Add(heading); content.Children.Add(new TextBlock { - Text = $"When {(ui.IsLeft ? "L2" : "R2")} is pressed completely, run the action below using the selected behavior.", + Text = string.Format(Properties.Resources.TLFullPullDescFormat, ui.IsLeft ? "L2" : "R2"), Margin = new Thickness(0, 4, 0, 10), Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), TextWrapping = TextWrapping.Wrap, @@ -401,14 +403,14 @@ private Border BuildFullPullSection(SideUi ui) StackPanel actionText = new StackPanel(); actionText.Children.Add(new TextBlock { - Text = "Assigned action", + Text = Properties.Resources.TLAssignedActionLabel, FontSize = 10, FontWeight = FontWeights.SemiBold, Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), }); ui.FullPullActionName = new TextBlock { - Text = "Unassigned", + Text = Properties.Resources.Unassigned, Margin = new Thickness(0, 2, 10, 0), FontWeight = FontWeights.SemiBold, TextTrimming = TextTrimming.CharacterEllipsis, @@ -417,7 +419,7 @@ private Border BuildFullPullSection(SideUi ui) actionContent.Children.Add(actionText); TextBlock changeLabel = new TextBlock { - Text = "Change ›", + Text = Properties.Resources.TLChangeLabel, Foreground = FindBrush("AccentColor", Brushes.DodgerBlue), FontWeight = FontWeights.SemiBold, VerticalAlignment = VerticalAlignment.Center, @@ -449,7 +451,7 @@ private Border BuildFullPullSection(SideUi ui) modeRow.ColumnDefinitions.Add(new ColumnDefinition()); modeRow.Children.Add(new TextBlock { - Text = "Behavior", + Text = Properties.Resources.TLBehaviorLabel, FontWeight = FontWeights.SemiBold, Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), VerticalAlignment = VerticalAlignment.Center, @@ -490,7 +492,7 @@ private Border BuildFullPullSection(SideUi ui) }); ui.HipFireDelayRow.Children.Add(new TextBlock { - Text = "Delay", + Text = Properties.Resources.TLDelayLabel, FontWeight = FontWeights.SemiBold, Foreground = FindBrush("MutedForegroundColor", Brushes.Gray), VerticalAlignment = VerticalAlignment.Center, @@ -550,7 +552,7 @@ private Button MakeModeButton(string text, SideUi ui, TriggerLabMode mode, int c return button; } - private Grid MakeMeter(string label, SideUi ui, out Slider slider, out TextBlock value) + private Grid MakeMeter(string label, string property, SideUi ui, out Slider slider, out TextBlock value) { Grid grid = new Grid { Margin = new Thickness(0, 15, 0, 0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(46) }); @@ -561,7 +563,6 @@ private Grid MakeMeter(string label, SideUi ui, out Slider slider, out TextBlock Grid.SetColumn(slider, 1); grid.Children.Add(slider); value = new TextBlock { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center, FontWeight = FontWeights.SemiBold }; Grid.SetColumn(value, 2); grid.Children.Add(value); - string property = label; slider.ValueChanged += (_, e) => MeterChanged(ui, property, (int)e.NewValue); return grid; } @@ -581,7 +582,7 @@ private void LoadSide(SideUi ui, TriggerLabEffectSettings effect, { Id = profile.Id, Name = profile.Name, - Description = "Saved custom effect.", + Description = Properties.Resources.TLSavedCustomEffect, IsCustom = true, })); ui.Profile.ItemsSource = profiles; @@ -626,7 +627,7 @@ private void RefreshFullPullUi(SideUi ui) ui.HipFireDelay.IsEnabled = available; if (!available) { - ui.FullPullActionName.Text = "Select a controller or profile"; + ui.FullPullActionName.Text = Properties.Resources.TLSelectControllerOrProfile; ui.FullPullModeDescription.Text = string.Empty; ui.HipFireDelayRow.Visibility = Visibility.Collapsed; return; @@ -916,7 +917,7 @@ private static string EnsureAutoCustomProfile(TriggerLabProfileSettings settings .FirstOrDefault(profile => profile.Id == profileId); if (custom == null) { - custom = new TriggerLabCustomProfile { Id = "custom", Name = "Custom" }; + custom = new TriggerLabCustomProfile { Id = "custom", Name = Properties.Resources.TLCustom }; settings.CustomProfiles.Insert(0, custom); } custom.Mode = effect.Mode; custom.StartPercent = effect.StartPercent; custom.WallPercent = effect.WallPercent; custom.ForcePercent = effect.ForcePercent; @@ -925,7 +926,7 @@ private static string EnsureAutoCustomProfile(TriggerLabProfileSettings settings private void SaveCustomProfile(SideUi ui) { - string name = PromptName("Save trigger profile", $"Custom Trigger {CurrentSettings.CustomProfiles.Count + 1}"); + string name = PromptName(Properties.Resources.TLSaveProfileDialogTitle, string.Format(Properties.Resources.TLDefaultCustomTriggerNameFormat, CurrentSettings.CustomProfiles.Count + 1)); if (string.IsNullOrWhiteSpace(name)) return; Commit(settings => { @@ -941,7 +942,7 @@ private void RenameCustomProfile(SideUi ui) { TriggerLabCustomProfile profile = CurrentSettings.CustomProfiles.FirstOrDefault(item => item.Id == CurrentEffect(ui).ProfileId); if (profile == null) return; - string name = PromptName("Rename trigger profile", profile.Name); + string name = PromptName(Properties.Resources.TLRenameProfileTip, profile.Name); if (string.IsNullOrWhiteSpace(name)) return; Commit(settings => profile.Name = name); } @@ -950,7 +951,7 @@ private void DeleteCustomProfile(SideUi ui) { TriggerLabCustomProfile profile = CurrentSettings.CustomProfiles.FirstOrDefault(item => item.Id == CurrentEffect(ui).ProfileId); if (profile == null) return; - if (MessageBox.Show($"Delete {profile.Name}?", "Trigger Lab", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes) return; + if (MessageBox.Show(string.Format(Properties.Resources.TLDeleteConfirmFormat, profile.Name), Properties.Resources.TLDialogTitle, MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes) return; Commit(settings => { settings.CustomProfiles.Remove(profile); @@ -969,8 +970,8 @@ private string PromptName(string title, string initial) TextBox text = new TextBox { Text = initial, MaxLength = 48, MinHeight = 36, VerticalContentAlignment = VerticalAlignment.Center }; grid.Children.Add(text); StackPanel buttons = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 14, 0, 0) }; - Button cancel = new Button { Content = "Cancel", Width = 86, Height = 34, IsCancel = true }; - Button save = new Button { Content = "Save", Width = 86, Height = 34, Margin = new Thickness(8, 0, 0, 0), IsDefault = true, Style = FindResource("BridgePrimaryButtonStyle") as Style }; + Button cancel = new Button { Content = Properties.Resources.Cancel, Width = 86, Height = 34, IsCancel = true }; + Button save = new Button { Content = Properties.Resources.Save, Width = 86, Height = 34, Margin = new Thickness(8, 0, 0, 0), IsDefault = true, Style = FindResource("BridgePrimaryButtonStyle") as Style }; save.Click += (_, _) => dialog.DialogResult = true; buttons.Children.Add(cancel); buttons.Children.Add(save); Grid.SetRow(buttons, 1); grid.Children.Add(buttons); dialog.Content = grid; text.SelectAll(); text.Focus(); diff --git a/DS4Windows/DS4Forms/ViewModels/Switch2StickCalibrationViewModel.cs b/DS4Windows/DS4Forms/ViewModels/Switch2StickCalibrationViewModel.cs index bbe30c3c..0f95e8b2 100644 --- a/DS4Windows/DS4Forms/ViewModels/Switch2StickCalibrationViewModel.cs +++ b/DS4Windows/DS4Forms/ViewModels/Switch2StickCalibrationViewModel.cs @@ -47,16 +47,16 @@ internal Switch2StickCalibrationViewModel(Switch2RuntimeInputDevice runtime) InputDeviceType.Switch2JoyConRight => new[] { Switch2StickSide.Right }, _ => throw new ArgumentException("A Switch 2 controller is required.", nameof(runtime)), }; - SideLabels = Array.ConvertAll(sides, side => side == Switch2StickSide.Left ? "Left stick" : "Right stick"); + SideLabels = Array.ConvertAll(sides, side => side == Switch2StickSide.Left ? Properties.Resources.Switch2CalibLeftStick : Properties.Resources.Switch2CalibRightStick); ControllerLabel = runtime.DeviceType switch { - InputDeviceType.Switch2Pro => "Switch 2 Pro Controller", - InputDeviceType.Switch2JoyConJoined => "Joined Joy-Con 2", - InputDeviceType.Switch2JoyConLeft => "Joy-Con 2 (Left)", - _ => "Joy-Con 2 (Right)", - } + (runtime.Transport == Switch2Transport.Usb ? " · USB" : " · Bluetooth"); - Heading = "Choose a physical stick"; - Instructions = "Rotate the selected stick around its full edge, then let it rest in the center. Nothing is saved until you choose Save calibration."; + InputDeviceType.Switch2Pro => Properties.Resources.Switch2CalibProControllerName, + InputDeviceType.Switch2JoyConJoined => Properties.Resources.Switch2CalibJoinedJoyCon, + InputDeviceType.Switch2JoyConLeft => Properties.Resources.Switch2CalibJoyConLeft, + _ => Properties.Resources.Switch2CalibJoyConRight, + } + (runtime.Transport == Switch2Transport.Usb ? Properties.Resources.Switch2CalibUsbSuffix : Properties.Resources.Switch2CalibBluetoothSuffix); + Heading = Properties.Resources.Switch2CalibChoosePhysicalStick; + Instructions = Properties.Resources.Switch2CalibInitialInstructions; Poll(); } @@ -76,19 +76,19 @@ public int SelectedSideIndex public string SelectedSideLabel => SideLabels[selectedSideIndex]; public string CalibrationStatus => (sides[selectedSideIndex] == Switch2StickSide.Left ? runtime.HasLocalLeftStickCalibration : runtime.HasLocalRightStickCalibration) ? - "PC calibration is active for this stick." : "Using original controller calibration, or defaults if unavailable."; + Properties.Resources.Switch2CalibPcActive : Properties.Resources.Switch2CalibUsingOriginal; public string Heading { get; private set; } public string Instructions { get; private set; } public string ResultText { get; private set; } = string.Empty; public double Progress { get; private set; } - public string ProgressLabel { get; private set; } = "Not started"; + public string ProgressLabel { get; private set; } = Properties.Resources.Switch2CalibNotStarted; public bool IsBusy => busy; public bool CanStart => !closed && !busy && operation == null && ContextIsCurrent; public bool CanChooseSide => CanStart; public bool CanSave => !closed && !busy && operation != null && stage == Switch2RawStickCalibrationStage.Ready && ContextIsCurrent; public bool CanCancel => !closed && operation != null; - public string ResetConfirmation => $"Remove the PC calibration for the {SelectedSideLabel.ToLowerInvariant()} on this controller?\n\nThe original factory calibration will not be changed. Other sticks and controllers are unaffected."; + public string ResetConfirmation => string.Format(Properties.Resources.Switch2CalibResetConfirmFormat, SelectedSideLabel.ToLowerInvariant()); private bool ContextIsCurrent => !contextEnded && runtime.RuntimeState == Switch2RuntimeInputDeviceState.Active && @@ -109,10 +109,10 @@ private async Task BeginAsync(bool reset) var selected = sides[selectedSideIndex]; busy = true; ResultText = string.Empty; - Heading = reset ? "Preparing reset" : "Preparing calibration"; - Instructions = "Releasing this controller's mapped input…"; + Heading = reset ? Properties.Resources.Switch2CalibPreparingReset : Properties.Resources.Switch2CalibPreparingCalibration; + Instructions = Properties.Resources.Switch2CalibReleasingInput; Progress = 0; - ProgressLabel = "Please wait"; + ProgressLabel = Properties.Resources.Switch2CalibPleaseWait; RaiseAll(); Switch2RawStickCalibrationOperation started = null; var beginCancellation = new CancellationTokenSource(); @@ -128,9 +128,9 @@ private async Task BeginAsync(bool reset) } if (started == null) { - Heading = "Calibration could not start"; - Instructions = "Wait for live controller input and finish any other calibration, then try again. A remembered controller identity and writable PC calibration store are required."; - ProgressLabel = "Not started"; + Heading = Properties.Resources.Switch2CalibCouldNotStart; + Instructions = Properties.Resources.Switch2CalibCouldNotStartDetail; + ProgressLabel = Properties.Resources.Switch2CalibNotStarted; return false; } operation = started; @@ -140,7 +140,7 @@ private async Task BeginAsync(bool reset) catch { if (started != null) runtime.CancelRawStickCalibration(started); - if (!closed) ResultText = "Calibration could not start. No calibration was saved."; + if (!closed) ResultText = Properties.Resources.Switch2CalibCouldNotStartError; return false; } finally @@ -158,10 +158,10 @@ public async Task SaveAsync() var saving = operation; string side = SelectedSideLabel; busy = true; - Heading = saving.Reset ? "Resetting PC calibration" : "Saving PC calibration"; - Instructions = "Controller input remains released while the result is stored and applied."; + Heading = saving.Reset ? Properties.Resources.Switch2CalibResettingPc : Properties.Resources.Switch2CalibSavingPc; + Instructions = Properties.Resources.Switch2CalibInputReleasedWhileSaving; ResultText = string.Empty; - ProgressLabel = "Please wait"; + ProgressLabel = Properties.Resources.Switch2CalibPleaseWait; RaiseAll(); try { @@ -171,40 +171,40 @@ public async Task SaveAsync() if (result == Switch2RawStickCalibrationCommitResult.AppliedAndStored) { operation = null; - Heading = saving.Reset ? "PC calibration reset" : "Calibration saved"; - Instructions = "You can calibrate another stick or close this window."; - ResultText = saving.Reset ? $"{side}: the PC override was removed. Source calibration is active again." : - $"{side}: saved on this PC and applied to this controller connection."; + Heading = saving.Reset ? Properties.Resources.Switch2CalibResetDone : Properties.Resources.Switch2CalibSaveDone; + Instructions = Properties.Resources.Switch2CalibCanCalibrateAnother; + ResultText = saving.Reset ? string.Format(Properties.Resources.Switch2CalibResetResultFormat, side) : + string.Format(Properties.Resources.Switch2CalibSaveResultFormat, side); Progress = 100; - ProgressLabel = "Complete"; + ProgressLabel = Properties.Resources.Switch2CalibComplete; } else if (result == Switch2RawStickCalibrationCommitResult.StorageFailed && stillOwnsReceipt) { - ResultText = "The PC calibration file could not be updated. The previous live calibration is unchanged. Retry Save calibration or cancel."; + ResultText = Properties.Resources.Switch2CalibStorageFailed; UpdateProgress(); } else if ((result is Switch2RawStickCalibrationCommitResult.NotReady or Switch2RawStickCalibrationCommitResult.Busy) && stillOwnsReceipt) { - ResultText = "The operation is not ready to finish. Wait for valid samples or cancel and retry."; + ResultText = Properties.Resources.Switch2CalibNotReady; UpdateProgress(); } else { runtime.CancelRawStickCalibration(saving); operation = null; - Heading = "Calibration ended"; - Instructions = "Close this window and reopen calibration from the current controller before trying again."; - ProgressLabel = "Not applied"; + Heading = Properties.Resources.Switch2CalibEnded; + Instructions = Properties.Resources.Switch2CalibReopenBeforeRetry; + ProgressLabel = Properties.Resources.Switch2CalibNotApplied; ResultText = result == Switch2RawStickCalibrationCommitResult.StoredNotApplied ? - "The PC file was updated, but the change was not applied to the active connection. Reconnect to load it, or explicitly reset it. Cancellation cannot undo a write already in progress." : - "This operation is no longer current. It did not complete a calibration change."; + Properties.Resources.Switch2CalibStoredNotApplied : + Properties.Resources.Switch2CalibNoLongerCurrent; } } catch { runtime.CancelRawStickCalibration(saving); operation = null; - if (!closed) ResultText = "Calibration could not finish. The file outcome could not be confirmed; reconnect and check the selected stick before retrying."; + if (!closed) ResultText = Properties.Resources.Switch2CalibFinishFailed; } finally { @@ -218,11 +218,11 @@ public void Cancel() if (closed || operation == null) return; runtime.CancelRawStickCalibration(operation); operation = null; - Heading = "Calibration cancelled"; - Instructions = "Ordinary controller input can resume. You can start again when ready."; - ResultText = busy ? "A save already in progress may still update the PC file. Its final result will appear here." : - "The unsaved capture was discarded; the existing calibration was not changed."; - ProgressLabel = "Cancelled"; + Heading = Properties.Resources.Switch2CalibCancelled; + Instructions = Properties.Resources.Switch2CalibResumeInput; + ResultText = busy ? Properties.Resources.Switch2CalibSaveInProgress : + Properties.Resources.Switch2CalibDiscarded; + ProgressLabel = Properties.Resources.Switch2CalibCancelledStatus; Progress = 0; RaiseAll(); } @@ -240,24 +240,24 @@ private void UpdateProgress() if (!runtime.TryGetRawStickCalibrationProgress(operation, out var progress)) { operation = null; - Heading = "Calibration ended"; - Instructions = "The controller or calibration changed. Start again from the current controller."; - ProgressLabel = "Not saved"; + Heading = Properties.Resources.Switch2CalibEnded; + Instructions = Properties.Resources.Switch2CalibChangedRetry; + ProgressLabel = Properties.Resources.Switch2CalibNotSaved; return; } stage = progress.Stage; Progress = (stage == Switch2RawStickCalibrationStage.Rotate ? progress.RotationProgress : progress.StationaryProgress) * 100; (Heading, Instructions, ProgressLabel) = stage switch { - Switch2RawStickCalibrationStage.Rotate => ($"1 · Rotate the {SelectedSideLabel.ToLowerInvariant()}", - "Move slowly around the full outer edge in both directions. Keep moving until this step completes; pauses do not count.", - $"{Math.Max(0, Math.Ceiling(10 * (1 - progress.RotationProgress))):0} moving seconds remaining"), - Switch2RawStickCalibrationStage.Settle => ("2 · Release the stick", "Take your hand off the stick and let it return to center.", "Waiting for 2 seconds of rest"), - Switch2RawStickCalibrationStage.Center => ("3 · Hold still", "Leave the stick untouched while its center is measured. Touching it restarts the rest period.", - $"{Math.Max(0, Math.Ceiling(3 * (1 - progress.StationaryProgress))):0} still seconds remaining"), - Switch2RawStickCalibrationStage.Ready => (progress.Reset ? "Ready to reset" : "Ready to save", "Choose Save calibration to apply this result, or Cancel to discard it.", "Ready"), - Switch2RawStickCalibrationStage.InsufficientTravel => ("More stick travel is needed", "Cancel and try again. Reach the full edge in every direction, then let the stick center itself.", "Calibration rejected"), - _ => ("Calibration cancelled", "Start a new calibration when the controller is ready.", "Cancelled"), + Switch2RawStickCalibrationStage.Rotate => (string.Format(Properties.Resources.Switch2CalibRotateHeadingFormat, SelectedSideLabel.ToLowerInvariant()), + Properties.Resources.Switch2CalibRotateInstructions, + string.Format(Properties.Resources.Switch2CalibMovingSecondsFormat, Math.Max(0, Math.Ceiling(10 * (1 - progress.RotationProgress))).ToString("0"))), + Switch2RawStickCalibrationStage.Settle => (Properties.Resources.Switch2CalibSettleHeading, Properties.Resources.Switch2CalibSettleInstructions, Properties.Resources.Switch2CalibWaitingRest), + Switch2RawStickCalibrationStage.Center => (Properties.Resources.Switch2CalibCenterHeading, Properties.Resources.Switch2CalibCenterInstructions, + string.Format(Properties.Resources.Switch2CalibStillSecondsFormat, Math.Max(0, Math.Ceiling(3 * (1 - progress.StationaryProgress))).ToString("0"))), + Switch2RawStickCalibrationStage.Ready => (progress.Reset ? Properties.Resources.Switch2CalibReadyToReset : Properties.Resources.Switch2CalibReadyToSave, Properties.Resources.Switch2CalibChooseSaveOrCancel, Properties.Resources.Switch2CalibReady), + Switch2RawStickCalibrationStage.InsufficientTravel => (Properties.Resources.Switch2CalibMoreTravelNeeded, Properties.Resources.Switch2CalibReachFullEdge, Properties.Resources.Switch2CalibRejected), + _ => (Properties.Resources.Switch2CalibCancelled, Properties.Resources.Switch2CalibStartNewWhenReady, Properties.Resources.Switch2CalibCancelledStatus), }; } @@ -267,9 +267,9 @@ private void EndContext() pendingBegin?.Cancel(); if (operation != null) runtime.CancelRawStickCalibration(operation); operation = null; - Heading = "Controller context changed"; - Instructions = "The controller, profile or pair changed. Close this window and reopen calibration from the controller you want to use."; - ProgressLabel = "Calibration stopped"; + Heading = Properties.Resources.Switch2CalibContextChanged; + Instructions = Properties.Resources.Switch2CalibContextChangedDetail; + ProgressLabel = Properties.Resources.Switch2CalibStopped; // Preserve the explicit asynchronous disk outcome, if one exists. } diff --git a/DS4Windows/DS4Forms/ViewModels/TouchButtonUserControlViewModel.cs b/DS4Windows/DS4Forms/ViewModels/TouchButtonUserControlViewModel.cs index ada90cca..61eaf06f 100644 --- a/DS4Windows/DS4Forms/ViewModels/TouchButtonUserControlViewModel.cs +++ b/DS4Windows/DS4Forms/ViewModels/TouchButtonUserControlViewModel.cs @@ -38,9 +38,9 @@ public int DeviceIndex private EnumChoiceSelection[] touchButtonModes = new EnumChoiceSelection[] { - new EnumChoiceSelection("Click", TouchButtonActivationMode.Click), - new EnumChoiceSelection("Touch", TouchButtonActivationMode.Touch), - new EnumChoiceSelection("Release", TouchButtonActivationMode.Release), + new EnumChoiceSelection(Properties.Resources.TouchButtonModeClick, TouchButtonActivationMode.Click), + new EnumChoiceSelection(Properties.Resources.TouchButtonModeTouch, TouchButtonActivationMode.Touch), + new EnumChoiceSelection(Properties.Resources.TouchButtonModeRelease, TouchButtonActivationMode.Release), }; public EnumChoiceSelection[] TouchButtonModes => touchButtonModes; diff --git a/DS4Windows/DS4Forms/ViiperSetupProgress.xaml.cs b/DS4Windows/DS4Forms/ViiperSetupProgress.xaml.cs index fca128eb..9bc1e3c3 100644 --- a/DS4Windows/DS4Forms/ViiperSetupProgress.xaml.cs +++ b/DS4Windows/DS4Forms/ViiperSetupProgress.xaml.cs @@ -32,7 +32,7 @@ public ViiperSetupProgress(string logPath) public void ShowPreparing() { - phaseText.Text = "Verifying the DS4Windows package..."; + phaseText.Text = Properties.Resources.VPVerifyingPackage; Show(); logTimer.Start(); // Render the window before the protected package snapshot begins. diff --git a/DS4Windows/DS4Forms/ViiperSetupPrompt.xaml.cs b/DS4Windows/DS4Forms/ViiperSetupPrompt.xaml.cs index 25cb620f..d0aea39a 100644 --- a/DS4Windows/DS4Forms/ViiperSetupPrompt.xaml.cs +++ b/DS4Windows/DS4Forms/ViiperSetupPrompt.xaml.cs @@ -35,18 +35,15 @@ public ViiperSetupPrompt(string currentStatus, if (citrixUsbMonitorConflict) { - headingText.Text = "VIIPER paused for system safety"; - summaryText.Text = - "A conflicting Citrix USB monitor is active."; - requirementsText.Text = - "• Disable Citrix generic USB redirection only\n" + - "• Restart Windows before VIIPER starts again"; - installButton.Content = "Disable conflicting USB monitor"; + headingText.Text = Properties.Resources.VPCitrixHeading; + summaryText.Text = Properties.Resources.VPCitrixSummary; + requirementsText.Text = Properties.Resources.VPCitrixRequirements; + installButton.Content = Properties.Resources.VPDisableConflictingUsbMonitor; installPortableButton.Visibility = Visibility.Collapsed; portableWarningPanel.Visibility = Visibility.Collapsed; suppressPromptCheck.Visibility = Visibility.Collapsed; - notNowButton.Content = "Continue without virtual output"; - closeButton.ToolTip = "Continue without virtual output"; + notNowButton.Content = Properties.Resources.VPContinueWithoutVirtualOutput; + closeButton.ToolTip = Properties.Resources.VPContinueWithoutVirtualOutput; return; } @@ -59,43 +56,36 @@ public ViiperSetupPrompt(string currentStatus, if (verifiedUpdateRequired) { headingText.Text = usbipReplacementRequired - ? "USB-IP version must be replaced" - : "VIIPER verification failed"; + ? Properties.Resources.VPUsbipReplaceHeading + : Properties.Resources.VPVerificationFailedHeading; summaryText.Text = usbipReplacementRequired ? currentStatus - : "The installed VIIPER does not match this DS4Windows package."; - requirementsHeadingText.Text = "Verified update required"; + : Properties.Resources.VPVerificationFailedSummary; + requirementsHeadingText.Text = Properties.Resources.VPVerifiedUpdateRequired; requirementsText.Text = usbipReplacementRequired - ? "• Install and verify bundled VIIPER 0.1.9-rc4.6.6\n" + - "• Safely remove the unsupported USB-IP package\n" + - "• Restart, then finish installing USB-IP 0.9.7.7" - : "• Install the exact bundled VIIPER build\n" + - "• Keep your existing installation location\n" + - "• The unverified backend will not be started"; + ? Properties.Resources.VPUsbipReplaceRequirements + : Properties.Resources.VPVerificationFailedRequirements; installButton.Content = usbipReplacementRequired - ? "Repair VIIPER + USB-IP" - : "Install / Repair"; + ? Properties.Resources.VPRepairViiperUsbip + : Properties.Resources.VPInstallRepair; installPortableButton.Content = - "Keep DS4Windows portable"; + Properties.Resources.VPKeepPortable; existingViiperPanel.Visibility = Visibility.Collapsed; suppressPromptCheck.Visibility = Visibility.Collapsed; - notNowButton.Content = "Continue without virtual output"; - closeButton.ToolTip = "Continue without virtual output"; + notNowButton.Content = Properties.Resources.VPContinueWithoutVirtualOutput; + closeButton.ToolTip = Properties.Resources.VPContinueWithoutVirtualOutput; } else if (this.mandatoryRepairRequired) { - headingText.Text = "VIIPER setup required"; + headingText.Text = Properties.Resources.VPSetupRequiredHeading; summaryText.Text = currentStatus; - requirementsHeadingText.Text = "Required before DS4Windows can run"; - requirementsText.Text = - "• Install the bundled VIIPER 0.1.9-rc4.6.6 build\n" + - "• Install and verify USB-IP 0.9.7.7\n" + - "• Start DS4Windows only after the runtime probe passes"; - installButton.Content = "Install / Repair"; - installPortableButton.Content = "Keep DS4Windows portable"; + requirementsHeadingText.Text = Properties.Resources.VPRequiredBeforeRun; + requirementsText.Text = Properties.Resources.VPMandatoryRequirements; + installButton.Content = Properties.Resources.VPInstallRepair; + installPortableButton.Content = Properties.Resources.VPKeepPortable; suppressPromptCheck.Visibility = Visibility.Collapsed; - notNowButton.Content = "Continue without virtual output"; - closeButton.ToolTip = "Continue without virtual output"; + notNowButton.Content = Properties.Resources.VPContinueWithoutVirtualOutput; + closeButton.ToolTip = Properties.Resources.VPContinueWithoutVirtualOutput; } } diff --git a/DS4Windows/DS4WinWPF.csproj b/DS4Windows/DS4WinWPF.csproj index f7db86b5..ac198e96 100644 --- a/DS4Windows/DS4WinWPF.csproj +++ b/DS4Windows/DS4WinWPF.csproj @@ -525,6 +525,9 @@ Resources.resx + + Resources.resx + @@ -554,6 +557,9 @@ Strings.resx + + Strings.resx + Strings.resx diff --git a/DS4Windows/Properties/Resources.Designer.cs b/DS4Windows/Properties/Resources.Designer.cs index 6d3cc00d..ee965459 100644 --- a/DS4Windows/Properties/Resources.Designer.cs +++ b/DS4Windows/Properties/Resources.Designer.cs @@ -1673,5 +1673,1418 @@ public static string XMLFiles { return ResourceManager.GetString("XMLFiles", resourceCulture); } } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a controller. + /// + public static string AHStatusSelectController { + get { + return ResourceManager.GetString("AHStatusSelectController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No source. + /// + public static string AHStatusNoSource { + get { + return ResourceManager.GetString("AHStatusNoSource", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Off. + /// + public static string AHStatusOff { + get { + return ResourceManager.GetString("AHStatusOff", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saved to profile. + /// + public static string AHStatusSavedToProfile { + get { + return ResourceManager.GetString("AHStatusSavedToProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active. + /// + public static string AHStatusActive { + get { + return ResourceManager.GetString("AHStatusActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller audio. + /// + public static string AHSourceControllerAudio { + get { + return ResourceManager.GetString("AHSourceControllerAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic game detection. + /// + public static string AHSourceAutoGameDetection { + get { + return ResourceManager.GetString("AHSourceAutoGameDetection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected app. + /// + public static string AHSourceSelectedApp { + get { + return ResourceManager.GetString("AHSourceSelectedApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System audio · default output. + /// + public static string AHSourceSystemAudioDefault { + get { + return ResourceManager.GetString("AHSourceSystemAudioDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Live. + /// + public static string MLLive { + get { + return ResourceManager.GetString("MLLive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting. + /// + public static string MLWaiting { + get { + return ResourceManager.GetString("MLWaiting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller changed. + /// + public static string MLControllerChanged { + get { + return ResourceManager.GetString("MLControllerChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No recent input. + /// + public static string MLNoRecentInput { + get { + return ResourceManager.GetString("MLNoRecentInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reopen the editor to preview the new controller.. + /// + public static string MLReopenForNewController { + get { + return ResourceManager.GetString("MLReopenForNewController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller disconnected. Reconnect and reopen the editor.. + /// + public static string MLControllerDisconnectedReopen { + get { + return ResourceManager.GetString("MLControllerDisconnectedReopen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting for fresh controller input…. + /// + public static string MLWaitingForFreshInput { + get { + return ResourceManager.GetString("MLWaitingForFreshInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting for controller input…. + /// + public static string MLWaitingForInput { + get { + return ResourceManager.GetString("MLWaitingForInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open this profile from a connected controller.. + /// + public static string MLOpenFromConnectedController { + get { + return ResourceManager.GetString("MLOpenFromConnectedController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No buttons pressed. + /// + public static string MLNoButtonsPressed { + get { + return ResourceManager.GetString("MLNoButtonsPressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VIIPER paused for system safety. + /// + public static string VPCitrixHeading { + get { + return ResourceManager.GetString("VPCitrixHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A conflicting Citrix USB monitor is active.. + /// + public static string VPCitrixSummary { + get { + return ResourceManager.GetString("VPCitrixSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to • Disable Citrix generic USB redirection only + ///• Restart Windows before VIIPER starts again. + /// + public static string VPCitrixRequirements { + get { + return ResourceManager.GetString("VPCitrixRequirements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable conflicting USB monitor. + /// + public static string VPDisableConflictingUsbMonitor { + get { + return ResourceManager.GetString("VPDisableConflictingUsbMonitor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Continue without virtual output. + /// + public static string VPContinueWithoutVirtualOutput { + get { + return ResourceManager.GetString("VPContinueWithoutVirtualOutput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to USB-IP version must be replaced. + /// + public static string VPUsbipReplaceHeading { + get { + return ResourceManager.GetString("VPUsbipReplaceHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VIIPER verification failed. + /// + public static string VPVerificationFailedHeading { + get { + return ResourceManager.GetString("VPVerificationFailedHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The installed VIIPER does not match this DS4Windows package.. + /// + public static string VPVerificationFailedSummary { + get { + return ResourceManager.GetString("VPVerificationFailedSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verified update required. + /// + public static string VPVerifiedUpdateRequired { + get { + return ResourceManager.GetString("VPVerifiedUpdateRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to • Install and verify bundled VIIPER 0.1.9-rc4.6.6 + ///• Safely remove the unsupported USB-IP package + ///• Restart, then finish installing USB-IP 0.9.7.7. + /// + public static string VPUsbipReplaceRequirements { + get { + return ResourceManager.GetString("VPUsbipReplaceRequirements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to • Install the exact bundled VIIPER build + ///• Keep your existing installation location + ///• The unverified backend will not be started. + /// + public static string VPVerificationFailedRequirements { + get { + return ResourceManager.GetString("VPVerificationFailedRequirements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repair VIIPER + USB-IP. + /// + public static string VPRepairViiperUsbip { + get { + return ResourceManager.GetString("VPRepairViiperUsbip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Install standard. + /// + public static string VPInstallStandard { + get { + return ResourceManager.GetString("VPInstallStandard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keep DS4Windows portable. + /// + public static string VPKeepPortable { + get { + return ResourceManager.GetString("VPKeepPortable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VIIPER setup required. + /// + public static string VPSetupRequiredHeading { + get { + return ResourceManager.GetString("VPSetupRequiredHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Required before DS4Windows can run. + /// + public static string VPRequiredBeforeRun { + get { + return ResourceManager.GetString("VPRequiredBeforeRun", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to • Install the bundled VIIPER 0.1.9-rc4.6.6 build + ///• Install and verify USB-IP 0.9.7.7 + ///• Start DS4Windows only after the runtime probe passes. + /// + public static string VPMandatoryRequirements { + get { + return ResourceManager.GetString("VPMandatoryRequirements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Install / Repair. + /// + public static string VPInstallRepair { + get { + return ResourceManager.GetString("VPInstallRepair", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verifying the DS4Windows package.... + /// + public static string VPVerifyingPackage { + get { + return ResourceManager.GetString("VPVerifyingPackage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active. + /// + public static string TLActiveLabel { + get { + return ResourceManager.GetString("TLActiveLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left Trigger. + /// + public static string TLLeftTrigger { + get { + return ResourceManager.GetString("TLLeftTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right Trigger. + /// + public static string TLRightTrigger { + get { + return ResourceManager.GetString("TLRightTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shape the {0} trigger feel. + /// + public static string TLShapeTriggerFeelFormat { + get { + return ResourceManager.GetString("TLShapeTriggerFeelFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save new trigger profile. + /// + public static string TLSaveProfileTip { + get { + return ResourceManager.GetString("TLSaveProfileTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename trigger profile. + /// + public static string TLRenameProfileTip { + get { + return ResourceManager.GetString("TLRenameProfileTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete trigger profile. + /// + public static string TLDeleteProfileTip { + get { + return ResourceManager.GetString("TLDeleteProfileTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feedback. + /// + public static string TLModeFeedback { + get { + return ResourceManager.GetString("TLModeFeedback", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Weapon. + /// + public static string TLModeWeapon { + get { + return ResourceManager.GetString("TLModeWeapon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vibration. + /// + public static string TLModeVibration { + get { + return ResourceManager.GetString("TLModeVibration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + public static string TLMeterStart { + get { + return ResourceManager.GetString("TLMeterStart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wall. + /// + public static string TLMeterWall { + get { + return ResourceManager.GetString("TLMeterWall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Force. + /// + public static string TLMeterForce { + get { + return ResourceManager.GetString("TLMeterForce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preview. + /// + public static string TLPreview { + get { + return ResourceManager.GetString("TLPreview", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reset {0}. + /// + public static string TLResetFormat { + get { + return ResourceManager.GetString("TLResetFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game rumble vibration. + /// + public static string TLGameRumbleTitle { + get { + return ResourceManager.GetString("TLGameRumbleTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stream the game's {0} HID rumble motor to {1} as a low-latency vibration effect.. + /// + public static string TLGameRumbleDescFormat { + get { + return ResourceManager.GetString("TLGameRumbleDescFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to heavy / left. + /// + public static string TLHeavyLeft { + get { + return ResourceManager.GetString("TLHeavyLeft", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to light / right. + /// + public static string TLLightRight { + get { + return ResourceManager.GetString("TLLightRight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Independently enable game-rumble vibration for {0}. This does not link the other trigger.. + /// + public static string TLGameRumbleTipFormat { + get { + return ResourceManager.GetString("TLGameRumbleTipFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full-pull action. + /// + public static string TLFullPullActionTitle { + get { + return ResourceManager.GetString("TLFullPullActionTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to END OF TRAVEL. + /// + public static string TLEndOfTravelBadge { + get { + return ResourceManager.GetString("TLEndOfTravelBadge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to When {0} is pressed completely, run the action below using the selected behavior.. + /// + public static string TLFullPullDescFormat { + get { + return ResourceManager.GetString("TLFullPullDescFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Assigned action. + /// + public static string TLAssignedActionLabel { + get { + return ResourceManager.GetString("TLAssignedActionLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change ›. + /// + public static string TLChangeLabel { + get { + return ResourceManager.GetString("TLChangeLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Behavior. + /// + public static string TLBehaviorLabel { + get { + return ResourceManager.GetString("TLBehaviorLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delay. + /// + public static string TLDelayLabel { + get { + return ResourceManager.GetString("TLDelayLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a controller or profile. + /// + public static string TLSelectControllerOrProfile { + get { + return ResourceManager.GetString("TLSelectControllerOrProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a controller or profile to open Trigger Lab.. + /// + public static string TLSelectToOpen { + get { + return ResourceManager.GetString("TLSelectToOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saved custom effect.. + /// + public static string TLSavedCustomEffect { + get { + return ResourceManager.GetString("TLSavedCustomEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save trigger profile. + /// + public static string TLSaveProfileDialogTitle { + get { + return ResourceManager.GetString("TLSaveProfileDialogTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Trigger {0}. + /// + public static string TLDefaultCustomTriggerNameFormat { + get { + return ResourceManager.GetString("TLDefaultCustomTriggerNameFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom. + /// + public static string TLCustom { + get { + return ResourceManager.GetString("TLCustom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete {0}?. + /// + public static string TLDeleteConfirmFormat { + get { + return ResourceManager.GetString("TLDeleteConfirmFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger Lab. + /// + public static string TLDialogTitle { + get { + return ResourceManager.GetString("TLDialogTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Off. + /// + public static string TLModeOff { + get { + return ResourceManager.GetString("TLModeOff", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only the regular trigger action runs.. + /// + public static string TLModeOffDesc { + get { + return ResourceManager.GetString("TLModeOffDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add at full pull. + /// + public static string TLModeAddAtFullPull { + get { + return ResourceManager.GetString("TLModeAddAtFullPull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keep the regular trigger action active and also run the full-pull action at the end of travel.. + /// + public static string TLModeAddAtFullPullDesc { + get { + return ResourceManager.GetString("TLModeAddAtFullPullDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replace at full pull. + /// + public static string TLModeReplaceAtFullPull { + get { + return ResourceManager.GetString("TLModeReplaceAtFullPull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release the regular trigger action and replace it with the full-pull action at the end of travel.. + /// + public static string TLModeReplaceAtFullPullDesc { + get { + return ResourceManager.GetString("TLModeReplaceAtFullPullDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hair trigger. + /// + public static string TLModeHairTrigger { + get { + return ResourceManager.GetString("TLModeHairTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run both actions at full pull, then release both as soon as the trigger backs away from the end stop.. + /// + public static string TLModeHairTriggerDesc { + get { + return ResourceManager.GetString("TLModeHairTriggerDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hip fire. + /// + public static string TLModeHipFire { + get { + return ResourceManager.GetString("TLModeHipFire", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wait for the chosen delay, then run the regular or full-pull action based on how far the trigger was pressed.. + /// + public static string TLModeHipFireDesc { + get { + return ResourceManager.GetString("TLModeHipFireDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hip fire (exclusive). + /// + public static string TLModeHipFireExclusive { + get { + return ResourceManager.GetString("TLModeHipFireExclusive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wait for the chosen delay and run only one action: regular pull or full pull.. + /// + public static string TLModeHipFireExclusiveDesc { + get { + return ResourceManager.GetString("TLModeHipFireExclusiveDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Click. + /// + public static string TouchButtonModeClick { + get { + return ResourceManager.GetString("TouchButtonModeClick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Touch. + /// + public static string TouchButtonModeTouch { + get { + return ResourceManager.GetString("TouchButtonModeTouch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release. + /// + public static string TouchButtonModeRelease { + get { + return ResourceManager.GetString("TouchButtonModeRelease", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left stick. + /// + public static string Switch2CalibLeftStick { + get { + return ResourceManager.GetString("Switch2CalibLeftStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right stick. + /// + public static string Switch2CalibRightStick { + get { + return ResourceManager.GetString("Switch2CalibRightStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switch 2 Pro Controller. + /// + public static string Switch2CalibProControllerName { + get { + return ResourceManager.GetString("Switch2CalibProControllerName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Joined Joy-Con 2. + /// + public static string Switch2CalibJoinedJoyCon { + get { + return ResourceManager.GetString("Switch2CalibJoinedJoyCon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Joy-Con 2 (Left). + /// + public static string Switch2CalibJoyConLeft { + get { + return ResourceManager.GetString("Switch2CalibJoyConLeft", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Joy-Con 2 (Right). + /// + public static string Switch2CalibJoyConRight { + get { + return ResourceManager.GetString("Switch2CalibJoyConRight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to · USB. + /// + public static string Switch2CalibUsbSuffix { + get { + return ResourceManager.GetString("Switch2CalibUsbSuffix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to · Bluetooth. + /// + public static string Switch2CalibBluetoothSuffix { + get { + return ResourceManager.GetString("Switch2CalibBluetoothSuffix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose a physical stick. + /// + public static string Switch2CalibChoosePhysicalStick { + get { + return ResourceManager.GetString("Switch2CalibChoosePhysicalStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rotate the selected stick around its full edge, then let it rest in the center. Nothing is saved until you choose Save calibration.. + /// + public static string Switch2CalibInitialInstructions { + get { + return ResourceManager.GetString("Switch2CalibInitialInstructions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PC calibration is active for this stick.. + /// + public static string Switch2CalibPcActive { + get { + return ResourceManager.GetString("Switch2CalibPcActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Using original controller calibration, or defaults if unavailable.. + /// + public static string Switch2CalibUsingOriginal { + get { + return ResourceManager.GetString("Switch2CalibUsingOriginal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not started. + /// + public static string Switch2CalibNotStarted { + get { + return ResourceManager.GetString("Switch2CalibNotStarted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove the PC calibration for the {0} on this controller? + /// + ///The original factory calibration will not be changed. Other sticks and controllers are unaffected.. + /// + public static string Switch2CalibResetConfirmFormat { + get { + return ResourceManager.GetString("Switch2CalibResetConfirmFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preparing reset. + /// + public static string Switch2CalibPreparingReset { + get { + return ResourceManager.GetString("Switch2CalibPreparingReset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preparing calibration. + /// + public static string Switch2CalibPreparingCalibration { + get { + return ResourceManager.GetString("Switch2CalibPreparingCalibration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Releasing this controller's mapped input…. + /// + public static string Switch2CalibReleasingInput { + get { + return ResourceManager.GetString("Switch2CalibReleasingInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please wait. + /// + public static string Switch2CalibPleaseWait { + get { + return ResourceManager.GetString("Switch2CalibPleaseWait", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration could not start. + /// + public static string Switch2CalibCouldNotStart { + get { + return ResourceManager.GetString("Switch2CalibCouldNotStart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wait for live controller input and finish any other calibration, then try again. A remembered controller identity and writable PC calibration store are required.. + /// + public static string Switch2CalibCouldNotStartDetail { + get { + return ResourceManager.GetString("Switch2CalibCouldNotStartDetail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration could not start. No calibration was saved.. + /// + public static string Switch2CalibCouldNotStartError { + get { + return ResourceManager.GetString("Switch2CalibCouldNotStartError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resetting PC calibration. + /// + public static string Switch2CalibResettingPc { + get { + return ResourceManager.GetString("Switch2CalibResettingPc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saving PC calibration. + /// + public static string Switch2CalibSavingPc { + get { + return ResourceManager.GetString("Switch2CalibSavingPc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller input remains released while the result is stored and applied.. + /// + public static string Switch2CalibInputReleasedWhileSaving { + get { + return ResourceManager.GetString("Switch2CalibInputReleasedWhileSaving", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PC calibration reset. + /// + public static string Switch2CalibResetDone { + get { + return ResourceManager.GetString("Switch2CalibResetDone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration saved. + /// + public static string Switch2CalibSaveDone { + get { + return ResourceManager.GetString("Switch2CalibSaveDone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can calibrate another stick or close this window.. + /// + public static string Switch2CalibCanCalibrateAnother { + get { + return ResourceManager.GetString("Switch2CalibCanCalibrateAnother", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: the PC override was removed. Source calibration is active again.. + /// + public static string Switch2CalibResetResultFormat { + get { + return ResourceManager.GetString("Switch2CalibResetResultFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: saved on this PC and applied to this controller connection.. + /// + public static string Switch2CalibSaveResultFormat { + get { + return ResourceManager.GetString("Switch2CalibSaveResultFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Complete. + /// + public static string Switch2CalibComplete { + get { + return ResourceManager.GetString("Switch2CalibComplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The PC calibration file could not be updated. The previous live calibration is unchanged. Retry Save calibration or cancel.. + /// + public static string Switch2CalibStorageFailed { + get { + return ResourceManager.GetString("Switch2CalibStorageFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The operation is not ready to finish. Wait for valid samples or cancel and retry.. + /// + public static string Switch2CalibNotReady { + get { + return ResourceManager.GetString("Switch2CalibNotReady", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration ended. + /// + public static string Switch2CalibEnded { + get { + return ResourceManager.GetString("Switch2CalibEnded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close this window and reopen calibration from the current controller before trying again.. + /// + public static string Switch2CalibReopenBeforeRetry { + get { + return ResourceManager.GetString("Switch2CalibReopenBeforeRetry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not applied. + /// + public static string Switch2CalibNotApplied { + get { + return ResourceManager.GetString("Switch2CalibNotApplied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The PC file was updated, but the change was not applied to the active connection. Reconnect to load it, or explicitly reset it. Cancellation cannot undo a write already in progress.. + /// + public static string Switch2CalibStoredNotApplied { + get { + return ResourceManager.GetString("Switch2CalibStoredNotApplied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This operation is no longer current. It did not complete a calibration change.. + /// + public static string Switch2CalibNoLongerCurrent { + get { + return ResourceManager.GetString("Switch2CalibNoLongerCurrent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration could not finish. The file outcome could not be confirmed; reconnect and check the selected stick before retrying.. + /// + public static string Switch2CalibFinishFailed { + get { + return ResourceManager.GetString("Switch2CalibFinishFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration cancelled. + /// + public static string Switch2CalibCancelled { + get { + return ResourceManager.GetString("Switch2CalibCancelled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ordinary controller input can resume. You can start again when ready.. + /// + public static string Switch2CalibResumeInput { + get { + return ResourceManager.GetString("Switch2CalibResumeInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A save already in progress may still update the PC file. Its final result will appear here.. + /// + public static string Switch2CalibSaveInProgress { + get { + return ResourceManager.GetString("Switch2CalibSaveInProgress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The unsaved capture was discarded; the existing calibration was not changed.. + /// + public static string Switch2CalibDiscarded { + get { + return ResourceManager.GetString("Switch2CalibDiscarded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancelled. + /// + public static string Switch2CalibCancelledStatus { + get { + return ResourceManager.GetString("Switch2CalibCancelledStatus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The controller or calibration changed. Start again from the current controller.. + /// + public static string Switch2CalibChangedRetry { + get { + return ResourceManager.GetString("Switch2CalibChangedRetry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not saved. + /// + public static string Switch2CalibNotSaved { + get { + return ResourceManager.GetString("Switch2CalibNotSaved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 · Rotate the {0}. + /// + public static string Switch2CalibRotateHeadingFormat { + get { + return ResourceManager.GetString("Switch2CalibRotateHeadingFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move slowly around the full outer edge in both directions. Keep moving until this step completes; pauses do not count.. + /// + public static string Switch2CalibRotateInstructions { + get { + return ResourceManager.GetString("Switch2CalibRotateInstructions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} moving seconds remaining. + /// + public static string Switch2CalibMovingSecondsFormat { + get { + return ResourceManager.GetString("Switch2CalibMovingSecondsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2 · Release the stick. + /// + public static string Switch2CalibSettleHeading { + get { + return ResourceManager.GetString("Switch2CalibSettleHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Take your hand off the stick and let it return to center.. + /// + public static string Switch2CalibSettleInstructions { + get { + return ResourceManager.GetString("Switch2CalibSettleInstructions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting for 2 seconds of rest. + /// + public static string Switch2CalibWaitingRest { + get { + return ResourceManager.GetString("Switch2CalibWaitingRest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3 · Hold still. + /// + public static string Switch2CalibCenterHeading { + get { + return ResourceManager.GetString("Switch2CalibCenterHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leave the stick untouched while its center is measured. Touching it restarts the rest period.. + /// + public static string Switch2CalibCenterInstructions { + get { + return ResourceManager.GetString("Switch2CalibCenterInstructions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} still seconds remaining. + /// + public static string Switch2CalibStillSecondsFormat { + get { + return ResourceManager.GetString("Switch2CalibStillSecondsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready to reset. + /// + public static string Switch2CalibReadyToReset { + get { + return ResourceManager.GetString("Switch2CalibReadyToReset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready to save. + /// + public static string Switch2CalibReadyToSave { + get { + return ResourceManager.GetString("Switch2CalibReadyToSave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose Save calibration to apply this result, or Cancel to discard it.. + /// + public static string Switch2CalibChooseSaveOrCancel { + get { + return ResourceManager.GetString("Switch2CalibChooseSaveOrCancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready. + /// + public static string Switch2CalibReady { + get { + return ResourceManager.GetString("Switch2CalibReady", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More stick travel is needed. + /// + public static string Switch2CalibMoreTravelNeeded { + get { + return ResourceManager.GetString("Switch2CalibMoreTravelNeeded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel and try again. Reach the full edge in every direction, then let the stick center itself.. + /// + public static string Switch2CalibReachFullEdge { + get { + return ResourceManager.GetString("Switch2CalibReachFullEdge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration rejected. + /// + public static string Switch2CalibRejected { + get { + return ResourceManager.GetString("Switch2CalibRejected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start a new calibration when the controller is ready.. + /// + public static string Switch2CalibStartNewWhenReady { + get { + return ResourceManager.GetString("Switch2CalibStartNewWhenReady", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller context changed. + /// + public static string Switch2CalibContextChanged { + get { + return ResourceManager.GetString("Switch2CalibContextChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The controller, profile or pair changed. Close this window and reopen calibration from the controller you want to use.. + /// + public static string Switch2CalibContextChangedDetail { + get { + return ResourceManager.GetString("Switch2CalibContextChangedDetail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration stopped. + /// + public static string Switch2CalibStopped { + get { + return ResourceManager.GetString("Switch2CalibStopped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reset PC stick calibration. + /// + public static string Switch2CalibResetDialogTitle { + get { + return ResourceManager.GetString("Switch2CalibResetDialogTitle", resourceCulture); + } + } } } diff --git a/DS4Windows/Properties/Resources.fa.resx b/DS4Windows/Properties/Resources.fa.resx new file mode 100644 index 00000000..7c205e49 --- /dev/null +++ b/DS4Windows/Properties/Resources.fa.resx @@ -0,0 +1,830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + این اسم برای این اکشن قبلاً استفاده شده + + + در حال اضافه کردن به لیست... + + + افزودن برنامه‌ها + + + برای ادامه باید یه مسیر انتخاب کنی + + + همیشه حالت رنگین‌کمانی + + + اختصاص به کنترلر *number* + + + باتری: *number*٪ + + + بهتره سمت راست به‌عنوان ماوس استفاده بشه + + + مرور... + + + نرخ پولینگ سخت‌افزار DS4 هنگام اتصال از طریق بلوتوث رو مشخص می‌کنه. (با ذخیره‌ی پروفایل اعمال می‌شه) + + + نمی‌شه فایل‌ها رو به مکان جدید منتقل کرد، لطفاً اسم پوشه‌ی DS4Tool رو به "DS4Windows" تغییر بده + + + نمی‌شه توی مسیر فعلی نوشت. تنظیمات به appdata کپی بشن؟ + + + باتری رو شارژ کن + + + شارژ شده + + + در حال شارژ: *number*٪ + + + بررسی باتری + + + این کار همه‌ی کنترلرهای وصل‌شده رو قطع می‌کنه. ادامه بدم؟ + + + DS4Windows بسته بشه؟ + + + بستن پنجره‌ی اصلی فقط برنامه رو کوچیک می‌کنه. برای خروج کامل از آیکون نوار اعلان استفاده کن + + + رنگ + + + رنگ بر اساس درصد باتری + + + تأیید... + + + در حال اتصال... + + + ویرایش پروفایل کنترلر *number* + + + ساخت پروفایل برای کنترلر *number* + + + کنترلر *Mac address* قطع شد یا اتصالش رو از دست داد + + + کپی کامل شد، لطفاً DS4Windows رو دوباره اجرا کن و تنظیمات رو از پوشه‌ی برنامه پاک کن + + + برای کپی رنگ کامل کلیک کن + + + هشدار: نشد DS4 *Mac address* رو به‌صورت انحصاری باز کرد. + + + روز + + + روز + + + پروفایل حذف بشه؟ + + + کم‌نوری بر اساس درصد باتری + + + قطع بلوتوث + + + قطع شده + + + در حال دانلود *number*٪ + + + نسخه‌ی *number* الان دانلود بشه؟ + + + پایین + + + + ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + آپدیت جدید DS4Windows موجوده! + + + ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + DS4Windows نمی‌تونه تنظیمات رو اینجا ویرایش کنه، الان بسته می‌شه + + + ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ویرایش + + + بازگشت + + + بازگشت به *button* + + + فشردن دکمه‌ی پنجم ماوس + + + رها کردن دکمه‌ی پنجم ماوس + + + برای تغییر رنگ چشمک‌زن کلیک کن. مشکی = رنگ پیش‌فرض + + + پاک‌سازی صف HID + + + بعد از هر خوندن، صف HID پاک بشه + + + کنترلر پیدا شد: + + + فشردن دکمه‌ی چهارم ماوس + + + رها کردن دکمه‌ی چهارم ماوس + + + کامل + + + برای دیدن مقادیر ژیروسکوپ Sixaxis کلیک کن + + + تیک بزن تا وقتی تریگر فعاله ژیرو هم فعال باشه. بردار تا وقتی تریگر فعاله ژیرو غیرفعال بشه. + + + GyroX، خم شدن چپ و راست + + + GyroY، خم شدن جلو و عقب + + + GyroZ، خم شدن بالا و پایین + + + ساعت + + + ساعت + + + روی موارد نگه دار تا توضیحات بیشتری ببینی + + + اگه داری DS4Windows رو حذف می‌کنی، می‌تونی تنظیمات رو از مسیر لینک پوشه‌ی پروفایل پاک کنی + + + فاصله‌ی گزارش فیزیکی مشاهده‌شده: {0:0.##} ms + + + نصب کامل شد + + + درایورها رو اینجا نصب کن + + + نصب انجام نشد، دوباره امتحان کن + + + در حال نصب... + + + از Sixaxis برای کمک به محاسبه‌ی حرکت تاچ‌پد استفاده کن + + + اندازه‌ی این پنجره بعد از بستن حفظ بشه + + + تغییر زبان بعد از ری‌استارت شدن DS4Windows اعمال می‌شه. + + + تأخیر کنترلر *number* الان زیر ۱۰ میلی‌ثانیه‌ست + + + تأخیر کنترلر {0} بالای ۱۰ میلی‌ثانیه‌ست ({1} ms) + + + اجرای *program* + + + اگه فعال باشه، وقتی DS4 کامل شارژه، نور هم با idle timeout کم‌نور می‌شه + + + در حال بارگذاری... + + + بارگذاری *profile* + + + ماکرو + + + ماکرو ضبط شد + + + ساخت پروفایل جدید + + + دکمه‌ی چند‌اکشنی + + + N/A + + + جدید + + + هیچ ماکرویی ضبط نشد + + + (هیچ‌کدام) + + + هیچ‌کدام + + + هیچ پروفایلی بارگذاری نشده + + + کنترلر {0} از پروفایلی استفاده نمی‌کنه. سطح باتری {1}٪ ـه + + + نامعتبر + + + در حال باز کردن نصب‌کننده + + + لطفاً ScpDriver.exe رو باز کن + + + ، فایل‌های مکان دیگر حذف می‌شن + + + لطفاً الان Updater رو دانلود کن، بذارش توی پوشه‌ی برنامه‌ها و اگه سیستمت x86 ـه اسمش رو به DS4Updater.exe تغییر بده، بعد دوباره چک آپدیت بزن. با بسته شدن این پنجره، DS4Windows تلاش می‌کنه صفحه‌ی Release مربوط به DS4Updater رو باز کنه. + + + لطفاً یه پروفایل وارد کن یا بساز + + + پروفایل جدید + + + *Profile name* قابل بازیابی نیست. + + + پوشه‌ی پروفایل به پوشه‌ی برنامه منتقل شد + + + برنامه‌ها + + + غیرفعال‌سازی خودکار بلوتوث هنگام اتصال USB + + + قبل از فعال کردن «استفاده از HidHide برای جلوگیری از ورودی دوگانه»، برنامه‌هایی که الان کنترلر فیزیکی رو گرفتن ببند. + + + ضبط + + + برای تنظیم پریست‌های یه سری کنترل، راست‌کلیک کن + + + به ویندوز می‌گه بعد از لاگین، DS4Windows رو اجرا کنه + + + ماکروی ضبط‌شده ذخیره بشه؟ + + + کد اسکن + + + در حال جستجوی کنترلرها... + + + یه اکشن برای *action* انتخاب کن + + + یه ماکرو انتخاب کن + + + تنظیم تریگر معمولی + + + تنظیم تریگر رهاسازی + + + میان‌برها + + + کالیبراسیون شبیه‌سازی فرمون با sixaxis + + + (۱) کنترلر رو وسط نگه دار، ثابت نگهش دار و «X» رو بزن + + + (۲) کنترلر رو ۹۰ درجه به چپ (یا راست) بچرخون و «X» رو بزن + + + (۳) کنترلر رو ۹۰ درجه به راست (یا چپ) بچرخون و «X» رو بزن + + + وقتی همه‌ی نقاط کالیبراسیون تنظیم بشن، رنگ نوار نور سبز می‌شه. حین چرخوندن کنترلر، وقتی به نقطه‌ی کالیبراسیون می‌رسه نوار نور چشمک می‌زنه. کالیبراسیون رو با دکمه‌ی OK تأیید کن + + + بدون کنترلر نمی‌شه مقادیر شبیه‌سازی فرمون با ژیرو (sixaxis) رو کالیبره کرد. یه کنترلر رو از طریق بلوتوث یا USB وصل کن + + + گزینه‌ی محور شبیه‌سازی فرمون با ژیرو روی NONE ـه (شبیه‌سازی استفاده نمی‌شه). لطفاً قبل از کالیبره کردن، یه گزینه‌ی محور انتخاب کن + + + برای خوندن پیشرفته‌ی Sixaxis کلیک کن + + + در حال شروع... + + + شروع + + + مرحله‌ی ۱: نصب بک‌اند VIIPER + + + توقف سنگین + + + توقف سبک + + + DS4Windows متوقف شد + + + در حال متوقف کردن کنترلرهای ورودی DS4 + + + در حال متوقف کردن کنترلرهای مجازی خروجی + + + توقف + + + سوایپ پایین + + + سوایپ چپ + + + سوایپ راست + + + برای تغییر پروفایل، تاچ‌پد رو سوایپ کن + + + سوایپ بالا + + + برای درگ کردن لمس کن و نگه دار؛ لمس‌های تکی کمی تأخیر دارن + + + تست سنگین + + + تست سبک + + + تست + + + سند متنی (*.txt) + + + خم به پایین + + + خم به چپ + + + خم به راست + + + خم به بالا + + + حرکت تاچ‌پد الان خاموشه + + + حرکت تاچ‌پد الان روشنه + + + با فشردن PS+Touchpad دوباره فعالش کن + + + سوایپ دوانگشتی چپ یا راست روی تاچ‌پد + + + اسم جدید رو اینجا بنویس + + + اسم پروفایل رو اینجا بنویس + + + برای فعال کردن این حالت باید DS4Windows رو به‌عنوان Administrator اجرا کنی. + + + تخصیص‌نیافته + + + بالا + + + برنامه‌ی DS4Windows به‌روزه. + + + می‌تونی از خود کنترلر هم برای تغییر کنترل‌ها استفاده کنی + + + در حال استفاده از حالت انحصاری + + + کنترلر {0} داره از پروفایل «{1}» استفاده می‌کنه. سطح باتری {2}٪ ـه + + + در حال استفاده از حالت مشترک + + + این کار تاچ‌پد رو به‌عنوان ماوس غیرفعال می‌کنه + + + لطفاً یه اسم معتبر وارد کن + + + صبر کن *number* میلی‌ثانیه + + + نگه داشته می‌شه + + + فایل‌های XML (*.xml) + + + اجازه بده عملکرد ماوسِ تاچ‌پد با PS + کلیک تاچ‌پد روشن/خاموش بشه. + + + فعال‌سازی سرور UDP. آدرس و پورتی که سرور بهش گوش می‌ده. گزینه‌های آدرس: ۱۲۷.۰.۰.۱ فقط localhost | ۰.۰.۰.۰ همه‌ی آدرس‌ها | یه نام میزبان یا آی‌پی مشخص. + + + ^ABC = تطبیق در ابتدای رشته (^) | ABC$ = تطبیق در انتهای رشته ($) | *ABC = شامل شدن رشته (*) + + + اگه فعال باشه، تب Log پیام‌های جزئی رویدادهای پروفایل خودکار رو نشون می‌ده. + + + توی ماکرو، از مقدار کد اسکن کلیدهای صفحه‌کلید استفاده کن + + + با رها شدن کلید تریگر، ماکرو اجرا بشه + + + اگه یه تریگر چند ماکرو داشته باشه، به ترتیب هماهنگ اجراشون کن (ماکروی فشردن کلید قبل از اجرای ماکروی رهاسازی تموم می‌شه) + + + تا وقتی کلید تریگر نگه داشته شده، ماکرو تکرار بشه + + + بعد از تموم شدن اجرای ماکرو، آخرین وضعیت کلید حفظ بشه (یعنی اگه کلیدی توی حالت فشرده مونده باشه، خودکار به حالت پیش‌فرض برنمی‌گرده) + + + گردی گوشه‌های استیک مربعی + + + فایل Actions.xml خراب بود. از اول شروع می‌کنیم. + + + فعال‌سازی سرور OSC. گوش دادن به پورت روی همه‌ی آدرس‌ها. + + + کنترلر {0} داره از پروفایل موقت «{1}» استفاده می‌کنه + + + + + + + + + لمس شروع شد + + + لمس تموم شد + + + انصراف + ذخیره + + یه کنترلر انتخاب کن + بدون منبع + خاموش + روی پروفایل ذخیره شد + فعال + صدای کنترلر + تشخیص خودکار بازی + برنامه‌ی انتخاب‌شده + صدای سیستم · خروجی پیش‌فرض + + زنده + در انتظار + کنترلر عوض شد + ورودی اخیری نیست + ادیتور رو دوباره باز کن تا کنترلر جدید رو پیش‌نمایش کنی. + کنترلر قطع شد. دوباره وصل کن و ادیتور رو باز کن. + در انتظار ورودی تازه‌ی کنترلر… + در انتظار ورودی کنترلر… + این پروفایل رو از یه کنترلر وصل‌شده باز کن. + هیچ دکمه‌ای فشرده نشده + + VIIPER به‌خاطر ایمنی سیستم متوقف شد + یه مانیتور USB سیتریکس در تضاد، فعاله. + • فقط ریدایرکت عمومی USB سیتریکس رو غیرفعال کن +• قبل از اینکه VIIPER دوباره شروع بشه، ویندوز رو ری‌استارت کن + غیرفعال کردن مانیتور USB در تضاد + ادامه بدون خروجی مجازی + نسخه‌ی USB-IP باید جایگزین بشه + تأیید VIIPER ناموفق بود + VIIPER نصب‌شده با این پکیج DS4Windows مطابقت نداره. + آپدیت تأییدشده لازمه + • نصب و تأیید VIIPER 0.1.9-rc4.6.6 بسته‌بندی‌شده +• حذف امن پکیج USB-IP پشتیبانی‌نشده +• ری‌استارت، بعد تموم کردن نصب USB-IP 0.9.7.7 + • نصب دقیقاً همون نسخه‌ی VIIPER بسته‌بندی‌شده +• محل نصب فعلی حفظ می‌شه +• بک‌اند تأییدنشده شروع نمی‌شه + تعمیر VIIPER + USB-IP + نصب استاندارد + پرتابل نگه‌داشتن DS4Windows + راه‌اندازی VIIPER لازمه + لازم قبل از اینکه DS4Windows بتونه اجرا بشه + • نصب VIIPER 0.1.9-rc4.6.6 بسته‌بندی‌شده +• نصب و تأیید USB-IP 0.9.7.7 +• DS4Windows رو فقط بعد از قبول شدن probe رانتایم شروع کن + نصب / تعمیر + در حال تأیید پکیج DS4Windows... + + فعال + تریگر چپ + تریگر راست + احساس تریگر {0} رو شکل بده + ذخیره‌ی پروفایل تریگر جدید + تغییر نام پروفایل تریگر + حذف پروفایل تریگر + فیدبک + اسلحه + ویبره + شروع + دیواره + نیرو + پیش‌نمایش + ریست {0} + ویبره‌ی رامبل بازی + موتور رامبل HID {0} بازی رو به {1} به‌عنوان یه افکت ویبره‌ی کم‌تأخیر استریم کن. + سنگین / چپ + سبک / راست + ویبره‌ی رامبل بازی رو مستقل برای {0} فعال کن. تریگر دیگه رو لینک نمی‌کنه. + اکشن فشار کامل + انتهای مسیر + وقتی {0} کامل فشرده شد، اکشن زیر رو با رفتار انتخاب‌شده اجرا کن. + اکشن اختصاص‌یافته + تغییر › + رفتار + تأخیر + یه کنترلر یا پروفایل انتخاب کن + برای باز کردن Trigger Lab، یه کنترلر یا پروفایل انتخاب کن. + افکت سفارشی ذخیره‌شده. + ذخیره‌ی پروفایل تریگر + تریگر سفارشی {0} + سفارشی + {0} حذف بشه؟ + Trigger Lab + خاموش + فقط اکشن معمولی تریگر اجرا می‌شه. + افزودن در فشار کامل + اکشن معمولی تریگر رو فعال نگه دار و در انتهای مسیر، اکشن فشار کامل رو هم اجرا کن. + جایگزینی در فشار کامل + اکشن معمولی تریگر رو رها کن و در انتهای مسیر با اکشن فشار کامل جایگزینش کن. + تریگر مویی + هر دو اکشن رو در فشار کامل اجرا کن، بعد به‌محض دور شدن تریگر از انتهای مسیر، هر دو رو رها کن. + شلیک سریع + منتظر تأخیر انتخاب‌شده بمون، بعد بر اساس میزان فشار تریگر، اکشن معمولی یا فشار کامل رو اجرا کن. + شلیک سریع (انحصاری) + منتظر تأخیر انتخاب‌شده بمون و فقط یه اکشن اجرا کن: فشار معمولی یا فشار کامل. + + کلیک + لمس + رهاسازی + + استیک چپ + استیک راست + Switch 2 Pro Controller + Joy-Con 2 جفت‌شده + Joy-Con 2 (چپ) + Joy-Con 2 (راست) + · USB + · بلوتوث + یه استیک فیزیکی انتخاب کن + استیک انتخاب‌شده رو دور تا دور لبه‌ش بچرخون، بعد بذار توی مرکز بمونه. تا وقتی «ذخیره‌ی کالیبراسیون» رو انتخاب نکنی، چیزی ذخیره نمی‌شه. + کالیبراسیون PC برای این استیک فعاله. + از کالیبراسیون اصلی کنترلر استفاده می‌شه، یا پیش‌فرض‌ها اگه در دسترس نباشه. + شروع نشده + کالیبراسیون PC برای {0} روی این کنترلر حذف بشه؟ + +کالیبراسیون کارخانه‌ای اصلی تغییر نمی‌کنه. بقیه‌ی استیک‌ها و کنترلرها تحت‌تأثیر قرار نمی‌گیرن. + در حال آماده‌سازی ریست + در حال آماده‌سازی کالیبراسیون + در حال آزاد کردن ورودی مپ‌شده‌ی این کنترلر… + لطفاً صبر کن + کالیبراسیون نتونست شروع بشه + منتظر ورودی زنده‌ی کنترلر بمون و هر کالیبراسیون دیگه‌ای رو تموم کن، بعد دوباره امتحان کن. یه هویت کنترلرِ به‌خاطرسپرده‌شده و یه فضای ذخیره‌ی PC قابل‌نوشتن لازمه. + کالیبراسیون نتونست شروع بشه. هیچ کالیبراسیونی ذخیره نشد. + در حال ریست کالیبراسیون PC + در حال ذخیره‌ی کالیبراسیون PC + تا وقتی نتیجه ذخیره و اعمال بشه، ورودی کنترلر آزاد می‌مونه. + کالیبراسیون PC ریست شد + کالیبراسیون ذخیره شد + می‌تونی یه استیک دیگه رو کالیبره کنی یا این پنجره رو ببندی. + {0}: override این PC حذف شد. کالیبراسیون اصلی دوباره فعاله. + {0}: روی این PC ذخیره شد و روی این اتصال کنترلر اعمال شد. + کامل + فایل کالیبراسیون PC آپدیت نشد. کالیبراسیون زنده‌ی قبلی تغییر نکرده. دوباره ذخیره کن یا لغو کن. + عملیات هنوز آماده‌ی اتمام نیست. منتظر نمونه‌های معتبر بمون یا لغو و دوباره امتحان کن. + کالیبراسیون تموم شد + قبل از امتحان دوباره، این پنجره رو ببند و کالیبراسیون رو از کنترلر فعلی دوباره باز کن. + اعمال نشد + فایل PC آپدیت شد، ولی تغییر روی اتصال فعال اعمال نشد. برای بارگذاریش دوباره وصل شو، یا صراحتاً ریستش کن. لغو نمی‌تونه یه نوشتن در حال انجام رو undo کنه. + این عملیات دیگه معتبر نیست. یه تغییر کالیبراسیون رو تموم نکرد. + کالیبراسیون نتونست تموم بشه. نتیجه‌ی فایل قابل‌تأیید نبود؛ قبل از تلاش دوباره، دوباره وصل شو و استیک انتخاب‌شده رو چک کن. + کالیبراسیون لغو شد + ورودی معمولی کنترلر می‌تونه ادامه پیدا کنه. هر وقت آماده بودی دوباره شروع کن. + یه ذخیره‌سازی که در حال انجامه ممکنه هنوز فایل PC رو آپدیت کنه. نتیجه‌ی نهاییش همین‌جا نشون داده می‌شه. + capture ذخیره‌نشده کنار گذاشته شد؛ کالیبراسیون موجود تغییر نکرد. + لغو شد + کنترلر یا کالیبراسیون تغییر کرد. از کنترلر فعلی دوباره شروع کن. + ذخیره نشد + ۱ · {0} رو بچرخون + به‌آرومی دور تا دور لبه‌ی بیرونی در هر دو جهت حرکت کن. تا تموم شدن این مرحله حرکت رو ادامه بده؛ توقف‌ها حساب نمی‌شن. + {0} ثانیه‌ی حرکتی باقی‌مونده + ۲ · استیک رو رها کن + دستت رو از روی استیک بردار و بذار به مرکز برگرده. + در انتظار ۲ ثانیه استراحت + ۳ · بی‌حرکت نگهش دار + تا وقتی مرکزش اندازه‌گیری می‌شه، استیک رو دست نزن. لمس کردنش دوره‌ی استراحت رو از اول شروع می‌کنه. + {0} ثانیه‌ی بی‌حرکتی باقی‌مونده + آماده‌ی ریست + آماده‌ی ذخیره + برای اعمال این نتیجه «ذخیره‌ی کالیبراسیون» رو انتخاب کن، یا برای کنار گذاشتنش Cancel رو بزن. + آماده + مسیر بیشتری از استیک لازمه + لغو کن و دوباره امتحان کن. توی هر جهت به لبه‌ی کامل برس، بعد بذار استیک خودش به مرکز برگرده. + کالیبراسیون رد شد + وقتی کنترلر آماده بود، یه کالیبراسیون جدید شروع کن. + زمینه‌ی کنترلر تغییر کرد + کنترلر، پروفایل یا جفت تغییر کرد. این پنجره رو ببند و کالیبراسیون رو از کنترلری که می‌خوای استفاده کنی دوباره باز کن. + کالیبراسیون متوقف شد + ریست کالیبراسیون PC استیک + diff --git a/DS4Windows/Properties/Resources.resx b/DS4Windows/Properties/Resources.resx index a030d126..23c9366a 100644 --- a/DS4Windows/Properties/Resources.resx +++ b/DS4Windows/Properties/Resources.resx @@ -655,4 +655,176 @@ Touch Ended + + Cancel + Save + + Select a controller + No source + Off + Saved to profile + Active + Controller audio + Automatic game detection + Selected app + System audio · default output + + Live + Waiting + Controller changed + No recent input + Reopen the editor to preview the new controller. + Controller disconnected. Reconnect and reopen the editor. + Waiting for fresh controller input… + Waiting for controller input… + Open this profile from a connected controller. + No buttons pressed + + VIIPER paused for system safety + A conflicting Citrix USB monitor is active. + • Disable Citrix generic USB redirection only +• Restart Windows before VIIPER starts again + Disable conflicting USB monitor + Continue without virtual output + USB-IP version must be replaced + VIIPER verification failed + The installed VIIPER does not match this DS4Windows package. + Verified update required + • Install and verify bundled VIIPER 0.1.9-rc4.6.6 +• Safely remove the unsupported USB-IP package +• Restart, then finish installing USB-IP 0.9.7.7 + • Install the exact bundled VIIPER build +• Keep your existing installation location +• The unverified backend will not be started + Repair VIIPER + USB-IP + Install standard + Keep DS4Windows portable + VIIPER setup required + Required before DS4Windows can run + • Install the bundled VIIPER 0.1.9-rc4.6.6 build +• Install and verify USB-IP 0.9.7.7 +• Start DS4Windows only after the runtime probe passes + Install / Repair + Verifying the DS4Windows package... + + Active + Left Trigger + Right Trigger + Shape the {0} trigger feel + Save new trigger profile + Rename trigger profile + Delete trigger profile + Feedback + Weapon + Vibration + Start + Wall + Force + Preview + Reset {0} + Game rumble vibration + Stream the game's {0} HID rumble motor to {1} as a low-latency vibration effect. + heavy / left + light / right + Independently enable game-rumble vibration for {0}. This does not link the other trigger. + Full-pull action + END OF TRAVEL + When {0} is pressed completely, run the action below using the selected behavior. + Assigned action + Change › + Behavior + Delay + Select a controller or profile + Select a controller or profile to open Trigger Lab. + Saved custom effect. + Save trigger profile + Custom Trigger {0} + Custom + Delete {0}? + Trigger Lab + Off + Only the regular trigger action runs. + Add at full pull + Keep the regular trigger action active and also run the full-pull action at the end of travel. + Replace at full pull + Release the regular trigger action and replace it with the full-pull action at the end of travel. + Hair trigger + Run both actions at full pull, then release both as soon as the trigger backs away from the end stop. + Hip fire + Wait for the chosen delay, then run the regular or full-pull action based on how far the trigger was pressed. + Hip fire (exclusive) + Wait for the chosen delay and run only one action: regular pull or full pull. + + Click + Touch + Release + + Left stick + Right stick + Switch 2 Pro Controller + Joined Joy-Con 2 + Joy-Con 2 (Left) + Joy-Con 2 (Right) + · USB + · Bluetooth + Choose a physical stick + Rotate the selected stick around its full edge, then let it rest in the center. Nothing is saved until you choose Save calibration. + PC calibration is active for this stick. + Using original controller calibration, or defaults if unavailable. + Not started + Remove the PC calibration for the {0} on this controller? + +The original factory calibration will not be changed. Other sticks and controllers are unaffected. + Preparing reset + Preparing calibration + Releasing this controller's mapped input… + Please wait + Calibration could not start + Wait for live controller input and finish any other calibration, then try again. A remembered controller identity and writable PC calibration store are required. + Calibration could not start. No calibration was saved. + Resetting PC calibration + Saving PC calibration + Controller input remains released while the result is stored and applied. + PC calibration reset + Calibration saved + You can calibrate another stick or close this window. + {0}: the PC override was removed. Source calibration is active again. + {0}: saved on this PC and applied to this controller connection. + Complete + The PC calibration file could not be updated. The previous live calibration is unchanged. Retry Save calibration or cancel. + The operation is not ready to finish. Wait for valid samples or cancel and retry. + Calibration ended + Close this window and reopen calibration from the current controller before trying again. + Not applied + The PC file was updated, but the change was not applied to the active connection. Reconnect to load it, or explicitly reset it. Cancellation cannot undo a write already in progress. + This operation is no longer current. It did not complete a calibration change. + Calibration could not finish. The file outcome could not be confirmed; reconnect and check the selected stick before retrying. + Calibration cancelled + Ordinary controller input can resume. You can start again when ready. + A save already in progress may still update the PC file. Its final result will appear here. + The unsaved capture was discarded; the existing calibration was not changed. + Cancelled + The controller or calibration changed. Start again from the current controller. + Not saved + 1 · Rotate the {0} + Move slowly around the full outer edge in both directions. Keep moving until this step completes; pauses do not count. + {0} moving seconds remaining + 2 · Release the stick + Take your hand off the stick and let it return to center. + Waiting for 2 seconds of rest + 3 · Hold still + Leave the stick untouched while its center is measured. Touching it restarts the rest period. + {0} still seconds remaining + Ready to reset + Ready to save + Choose Save calibration to apply this result, or Cancel to discard it. + Ready + More stick travel is needed + Cancel and try again. Reach the full edge in every direction, then let the stick center itself. + Calibration rejected + Start a new calibration when the controller is ready. + Controller context changed + The controller, profile or pair changed. Close this window and reopen calibration from the controller you want to use. + Calibration stopped + Reset PC stick calibration diff --git a/DS4Windows/Translations/Strings.fa.resx b/DS4Windows/Translations/Strings.fa.resx new file mode 100644 index 00000000..a5ad7f62 --- /dev/null +++ b/DS4Windows/Translations/Strings.fa.resx @@ -0,0 +1,3765 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + شتاب‌سنج + + + عملیات + + + افزودن پوشه + + + افزودن برنامه‌ها + + + افزودن از منوی استارت + + + افزودن بازی‌های استیم + + + همه + + + پروفایل‌های خودکار + + + باتری + + + مرور + + + مرور سایر برنامه‌ها + + + انصراف + + + بررسی به‌روزرسانی + + + بررسی به‌روزرسانی هنگام اجرای DS4Windows + + + پاک کردن + + + کوچک کردن برنامه هنگام بستن + + + رنگ + + + کنترلر ۱ + + + کنترلر ۲ + + + کنترلر ۳ + + + کنترلر ۴ + + + کنترلرها + + + کنترل پنل + + + حذف + + + نصب درایور کنترلر + + + تکثیر + + + ویرایش + + + ویرایش عملیات + + + صادر کردن + + + کامل + + + ژیروسکوپ + + + پنهان کردن موارد انتخاب‌نشده + + + وارد کردن + + + استیک چپ + + + گزارش + + + نام + + + جدید + + + عملیات جدید + + + پروفایل جدید + + + هیچ‌کدام + + + مسیر + + + پروفایل + + + پوشه‌ی پروفایل‌ها + + + شارژ سریع + + + ضبط + + + حذف + + + حذف عملیات + + + استیک راست + + + ویبره + + + اجرا هنگام روشن شدن سیستم + + + ذخیره + + + ذخیره‌ی پروفایل + + + تنظیمات + + + نمایش اعلان‌ها + + + شروع به‌صورت کوچک‌شده + + + شروع + + + وضعیت + + + توقف + + + پیمایش لمسی + + + کشیدن لمسی + + + ضربه‌ی لمسی + + + ماشه + + + فقط هشدارها + + + حداکثر ثانیه‌ی ویبره + + + توقف خودکار ویبره پس از این تعداد ثانیه (۰ = غیرفعال بودن توقف خودکار) + + + عنوان پنجره + + + جابه‌جایی به بالا + + + جابه‌جایی به پایین + + + تست کنترلر + + + فعال‌سازی ارسال داده به DS4 + + + ارسال دوره‌ای اطلاعات نوار نور و ویبره به کنترلر DS4. +اگر کنترلر از دریافت این داده‌ها پشتیبانی نمی‌کند، تیک آن را بردارید. +این تغییرات هنگام اتصال کنترلر اعمال می‌شوند. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + اعمال + + + HidNinja + + + نام سفارشی فایل اجرایی + + + برخی بازی‌ها در صورت شناسایی DS4Windows.exe / InputMapper.exe در حال اجرا، کنترلر را مسدود می‌کنند. +راه‌حل این است که نام فایل را به چیز دیگری تغییر دهید تا این مسدودسازی دور زده شود. +مشخص کردن یک نام جدید در اینجا به به‌روزرسان اجازه می‌دهد نام فایل را بشناسد. + + + XInputChecker + + + کنترلر ۵ + + + کنترلر ۶ + + + کنترلر ۷ + + + کنترلر ۸ + + + خروجی کنترلر را به‌صورت کنترلر استاندارد XInput یا DS4 تنظیم می‌کند. +ژیروسکوپ به‌عنوان یک جویستیک شبیه‌ماوس تنظیم می‌شود. + + + کنترلر با ماوس + + + تنظیم کنترلر به‌صورت یک کنترلر استاندارد + + + کنترلر + + + خروجی کنترلر را به کنترل پیش‌فرض صفحه‌کلید و ماوس (KB+M) تنظیم می‌کند. +برای بازی‌های اول‌شخصی که از کنترلر پشتیبانی نمی‌کنند مفید است. +ژیروسکوپ به‌عنوان ماوس پیش‌فرض تنظیم شده است. + + + کنترل KB+M همراه با ماوس ژیروسکوپ + + + خروجی کنترلر را به کنترل پیش‌فرض صفحه‌کلید و ماوس (KB+M) تنظیم می‌کند. +برای بازی‌های اول‌شخصی که از کنترلر پشتیبانی نمی‌کنند مفید است. + + + کنترل KB+M + + + دکمه‌ها و محورهای کنترل را به‌صورت استاندارد تنظیم می‌کند. +ژیروسکوپ را به‌عنوان ماوس پیش‌فرض تنظیم می‌کند. + + + کنترلر با ماوس ژیروسکوپ + + + تنظیم خروجی کنترلر به‌صورت ترکیبی از ماوس (استیک راست) + XInput + + + کنترلر با دوربین دقیق + + + توضیحات + + + می‌خواهید یک پیش‌تنظیم انتخاب کنید؟ انتخاب «خیر» باعث می‌شود ویرایشگر پروفایل با یک پروفایل خالی برای کنترلر باز شود. + + + پیش‌تنظیم‌ها + + + تغییرات + + + بستن + + + پروفایل‌ها + + + هیچ کنترلری متصل نیست (حداکثر {0}) + + + آستانه‌ی فلیک + + + زمان فلیک + + + حداقل آستانه‌ی زاویه + + + کالیبراسیون دنیای واقعی + + + دکمه‌ی چهارم ماوس + + + انتخاب یک کلید + + + حالت دو مرحله‌ای + + + استیک مربعی + + + انتخاب آیکون + + + تلورانس حداقل تعداد واحدهایی است که استیک آنالوگ باید در ناحیه‌ی فعال جابه‌جا شود تا خروجی در مپر به‌عنوان تغییریافته ثبت شود. این تنظیم برای استیک‌های فرسوده که نمی‌توانند موقعیت ثابتی داشته باشند مفید است. مقدار بر حسب واحد خام استیک بیان می‌شود. + + + پویا + + + بیدار شدن از حالت تعلیق + + + حداقل مسافت محاسبه‌شده‌ی خروجی، پیش از ارسال رویداد ماوس به سیستم + + + تلورانس حداقل تعداد واحدهای دستگاهی است که شتاب‌سنج باید در ناحیه‌ی فعال بچرخد تا خروجی در مپر به‌عنوان تغییریافته ثبت شود. مقدار بر حسب واحد خام شتاب‌سنج بیان می‌شود. + + + دکمه‌ی پنجم ماوس + + + ابزارها + + + بررسی هر + + + ماوس مطلق + + + نرخ پولینگ بلوتوث DS4 + + + غیرفعال‌کردن کلید توسط + + + ماشه‌ی دو ضربه‌ای + + + ناحیه‌ی مرده Y + + + قدیمی (Legacy) + + + روشن + + + آزمایش سبک + + + نمایش پیام‌های دیباگ پروفایل خودکار + + + یک‌بار پخش + + + ویرایش ماکرو + + + تکرار هنگام نگه‌داشتن + + + چند محل ذخیره‌سازی شناسایی شد + + + قطع اتصال بلوتوث + + + انتخاب یک ماکرو + + + چسبیدن به مرکز + + + اولویت فرایند + + + سرور UDP + + + پیش‌فرض + + + شتاب دلتا + + + SixAxis: محور X برعکس شده تا خواندن آن راحت‌تر باشد + + + باتری: ۰٪ + + + ماکرو ضبط شد + + + نسخه‌ی ۳٫۳ برنامه‌ی DS4Windows نیازمند نصب .NET 8 Desktop Runtime روی سیستم شماست +[https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer) + +لطفاً برای تأیید مطالعه‌ی این پیام، روی OK کلیک کنید. برای یادآوری مجدد در اجرای بعدی برنامه، روی Cancel کلیک کنید. + Can use Markdown syntax + + + ضبط یک ماکرو + + + حفظ وضعیت کلید + + + تغییر نام + + + نگه‌داشتن ماشه + + + وظیفه + + + فعلی + + + مانیتور نمایش مطلق + + + چشمک‌زدن نوار نور در تأخیر بالا + + + غیرفعال کردن کنترلر مجازی + + + کد اسکن + + + در برخی موقعیت‌ها، محدود کردن حداکثر مقدار خروجی استیک آنالوگ مفید است. «حداکثر خروجی» مقدار نهایی خروجی استیک را محدود می‌کند. + + + ماوس مطلق راست + + + تغییر نور + + + دکمه‌ها + + + پروفایل انتخاب‌شده + + + از طریق اعلان + + + اجرای همگام‌شده + + + آفست محور X + + + حالت نوار نور + + + درجه‌دوم (Easeout Quad) + + + بارگذاری پیش‌تنظیم + + + پشتیبانی از کنترلرهای شناخته‌شده‌ی DualShock 4 + + + حالت خروجی ماشه‌ی DS4 + + + به Trackball مجازی اصطکاک اضافه می‌کند. کاهش اصطکاک زمان حرکت نهایی نشانگر ماوس را افزایش می‌دهد + + + خطی + + + از آنجا که سایر مپرها (مثل Steam Input) به‌طور پیش‌فرض از چند نوع دستگاه پشتیبانی می‌کنند، DS4Windows به‌طور پیش‌فرض فقط خواندن از کنترلرهای DS4 را فعال می‌کند. می‌توانید پشتیبانی مپر از سایر انواع دستگاه را اینجا مشخص کنید. هنگام استفاده‌ی هم‌زمان از DS4Windows با مپرهای دیگر احتیاط کنید. + + + محل ذخیره‌ی پروفایل‌ها و تنظیمات را انتخاب کنید + + + پشتیبانی از کنترلر JoyCon + + + حداقل قطع فیلتر 1€ + + + مقیاس عمودی + + + رد کردن این نسخه + + + تنظیم ماشه‌ی لغو بارگذاری + + + افزودن ویبره + + + کنترلر شبیه‌سازی‌شده + + + دریافت آخرین نسخه ناموفق بود + + + استفاده‌ی اجباری از هر دو سطح شدت درصدی (عمومی و مخصوص DualSense) + + + تکرار هنگام نگه‌داشتن + + + پشتیبانی دستگاه + + + فعال‌سازی گزارش کامل + + + دائمی + + + لغو ماکروی جاری + + + آستانه‌ای که با رسیدن استیک به آن، عملیات اجرا می‌شود + + + توصیه می‌شود غیرفعال بماند. + +- غیرفعال: مقیاس ویبره به‌صورت بومی توسط خودِ کنترلر و بر اساس سطح توان تعیین‌شده تنظیم می‌شود (کیفیت بهتر) + +- فعال: هم مقیاس‌بندی عمومی ویبره‌ی DS4Windows و هم کنترل بومی DualSense به‌طور هم‌زمان فعال خواهند بود + + + بارگذاری یک پروفایل + + + پشتیبانی از کنترلر DS4 + + + اولین اجرا + + + پنجره‌ی به‌روزرسانی + + + حالت + + + پشتیبانی پیشرفته + + + حداکثر خروجی + + + پشتیبانی از کنترلر DualSense + + + Anti-deadzone به‌عنوان یک آفست برای یک محور عمل می‌کند و حداقل مقدار خروجی تولیدشده پس از خروج محور از ناحیه‌ی مرده‌ی تعیین‌شده را مشخص می‌کند. هدف اصلی آن کمک به تطبیق محور با مقدار ناحیه‌ی مرده‌ی تعیین‌شده در یک بازی است. برای مثال، ناحیه‌ی مرده‌ی معمول برای XInput LS در بازی‌ها حدود ۸۰۰۰ (۲۵٪) است. بدون تعیین anti-deadzone، محور باید هم از ناحیه‌ی مرده‌ی تعیین‌شده در DS4Windows و هم از ناحیه‌ی مرده‌ی تعیین‌شده‌ی بازی عبور کند. + + + تغییرات با اتصال دستگاه جدید اعمال می‌شوند + + + شعاعی + + + منحنی خروجی + + + تاچ‌پد + + + پوسته‌ی برنامه + + + حرکت روی تاچ‌پد را بر اساس یک زاویه‌ی چرخش مشخص تنظیم می‌کند. زمانی مفید است که حرکت معمول روی تاچ‌پد یک خط مستقیم نباشد. بازه‌ی مقدار از ۱۸۰- تا ۱۸۰ است. پیش‌فرض ۰ است. + + + نمایش پیام‌های گزارش اضافی هنگام اتصال کنترلر + + + گزینه‌های دستگاه + + + تلورانس + + + فشردن ماشه‌ی لغو بارگذاری + + + پشتیبانی مپر برای دستگاه‌های فعال‌شده + + + اتصال + + + بررسی صحت داده برای دستگاه بی‌سیم ناموفق بود. دستگاه بسته می‌شود. + + + فعال‌سازی سوییچ تاچ‌پد + + + عبوری (Passthru) + + + تغییر وضعیت + + + چرخش حول محور عمودی (Yaw) + + + ماکرو + + + نوع ناحیه‌ی مرده + + + شناسه + + + لطفاً نام جدید فایل XML پروفایل انتخاب‌شده را وارد کنید. + + + تخصیص‌نیافته + + + استفاده از هموارسازی + + + نگه‌داشتن به مدت + + + مقدمه + + + شش‌محوره (شتاب‌سنج) + + + ضریب + + + تغییر حساسیت ماوس + + + عرض + + + اجرای برنامه همراه با پروفایل + + + عملیاتی که با عبور حرکت استیک از یک آستانه اجرا می‌شود. برای تطبیق کلیدهای عملیات راه رفتن یا دویدن مفید است. حالت معکوس باعث می‌شود عملیات تا رسیدن به آستانه اجرا شود + + + پشتیبانی از دستگاه DS4 + + + صادر کردن عملیات‌ها + + + کالیبراسیون استیک + + + غلت (Roll) + + + پشتیبانی از کنترلر مجازی + + + اضافی + + + انتخاب ماشه‌ی Shift + + + صفحه‌کلید و ماوس نسبی + + + درخواست‌شده + + + قطع اتصال هنگام بی‌کاری + + + حالت خروجی + + + برخی فلگ‌های استفاده‌شده برای کنترلرهای DS4 غیر سونی را تغییر می‌دهد. ممکن است پشتیبانی از ویبره و نوار نور را برای برخی کنترلرهای تقلبی DS4 برطرف کند + + + شماره‌ی XInput + + + پلاگین دستگاه ViGEm با خطا مواجه شد. کد خطا: {0}. احتمالاً یک مشکل داخلی در ViGEmBus است. اتصال بسته می‌شود. اگر مشکل ادامه داشت، لطفاً DS4Windows را ببندید و ویندوز را ری‌استارت کنید. + + + مشخص می‌کند آیا اجرای این ماکرو باید ماکروی در حال اجرا را متوقف کند یا نه + + + استفاده از پوشه‌ی سفارشی Steam + + + تنظیم‌کننده‌ی بومی سطح توانِ ویبره‌ی DualSense. + +- در حالت دقیق، [حداقل // حداکثر] ویبره برابر خواهد بود با [۱٪ /// سطح توان انتخاب‌شده] + - مثال (۶۲٪): [حداقل = ۱٪ /// حداکثر = ۶۲٪] + +- در حالت قدیمی (Legacy)، [حداقل /// حداکثر] ویبره تقریباً برابر خواهد بود با [سطح توان − ۱۲٪ /// سطح توان + ۱۲٪] + - مثال (۶۲٪): [حداقل = ۵۰٪ /// حداکثر = ۷۴٪] + + + سفید + + + پیوند پروفایل/شناسه + + + ماوس مطلق بالا + + + نوع دستگاه + + + رهاکردن ماشه‌ی لغو بارگذاری + + + آفست محور Y + + + تأخیر شلیک بدون نشانه‌روی (Hip Fire) + + + اسلات‌های خروجی + + + عادی + + + ساعت + + + ماکرو فعال است؛ یک کلید برای غیرفعال‌سازی انتخاب کنید، یا برای ذخیره این پنجره را ببندید + + + اجرای یک برنامه + + + دکمه‌ی بیرونی + + + -انتخاب یک عملیات- + + + ماوس مطلق چپ + + + فقط با ViGEmBus نسخه‌ی ۱٫۱۷٫۳۳۳٫۰ و جدیدتر کار می‌کند + + + کالیبراسیون فرمان شش‌محوره + + + ناحیه‌ی مرده‌ی دکمه‌ی بیرونی + + + بتا فیلتر 1€ + + + سنگین + + + ضد شعاع (Anti Radius) + + + معکوس‌کردن موتورها + + + استفاده از بسته‌ی زبان + + + این قابلیت به‌دلیل مشکلات درایور، فعلاً در برنامه غیرفعال است. امیدواریم در به‌روزرسانی‌های بعدی رفع شود. + + + درجه‌دوم + + + رنگ و طول + + + فعال‌سازی سرور کنترل + + + چرخش حول محور عرضی (Pitch) + + + کلیدهای میانبر/درباره‌ی برنامه + + + تنظیمات کنترلر مجازی + + + قطع اتصال + + + Appdata + + + حرکت‌های خیلی کوچک روی تاچ‌پد را محدود می‌کند. حرکت ناخواسته‌ی نشانگر ماوس هنگام نگه‌داشتن انگشت تقریباً ثابت روی تاچ‌پد را کاهش می‌دهد + + + تغییر نام پروفایل + + + حداکثر مسافت حرکت + + + رنگی + + + درگاه + + + پشتیبانی از دستگاه Switch Pro + + + فعال‌سازی سرور + + + کنترل و مانیتورینگ OSC خارجی + + + سایر + + + دسترسی مشترک + + + ترتیب ماکرو + + + کوچک کردن به نوار وظیفه به‌جای سینی سیستم (System Tray) + + + مرکز Y + + + برای کنترلرهای متصلی که از این پروفایل استفاده می‌کنند، کنترلر مجازی ساخته/متصل نشود (با ذخیره‌ی پروفایل اعمال می‌شود) + + + گزینه‌های ماوس مطلق + + + گزارش + اعلان + + + پشتیبانی از دستگاه DualSense + + + فعال‌سازی سرویس مانیتورینگ + + + ناحیه‌ی مرده + + + حالت اتصال (Link Mode) + + + حساسیت مورد استفاده برای فعال‌سازی عملکرد اسکرول چرخ ماوس با چند لمس + + + مشکی + + + آزمایش سنگین + + + نمایش اعلان تعویض پروفایل + + + منوی پیش‌تنظیم + + + پذیرفتن + + + جابجایی ماوس + + + فعال + + + افزودن + + + حساسیت ماوس + + + قطع بلوتوث هنگام توقف + + + ماوس + + + حالت LED بی‌صدا (Mute) + + + استفاده از کنترلر + + + کلاینت تنظیمات HidHide + + + کشیدن روی تاچ‌پد برای تعویض پروفایل + + + حساسیت + + + پشتیبانی از کنترلرهای DualSense (PS5). مدل پایه و DS Edge + + + محل ذخیره‌سازی + + + پشتیبانی از دستگاه DS3 + + + بازگشت به پروفایل پیش‌فرض در صورت ناشناخته بودن + + + تأیید + + + شبیه‌ساز (Copycat) + + + پیش‌فرض (آنالوگ + دکمه‌ها) + + + اعلان + + + درج توقف + + + تأیید + + + زمان‌بندی ضد بازگشت ناگهانی (Anti Snapback) + + + اتصال بیرونی (Outer Bind) + + + برای کسانی که نصب معمولی را ترجیح می‌دهند. تنظیمات در %appdata%\DS4Windows ذخیره می‌شود + + + ذخیره‌ی پیش‌تنظیم + + + کنترلرهای شناسایی‌شده + + + آنالوگ + + + سفارشی + + + ماوس مطلق پایین + + + دسترسی انحصاری + + + بررسی عمر باتری + + + دقت افزایش‌یافته + + + روز + + + کشش کامل دکمه + + + پشتیبانی از کنترلرهای Switch Pro (نینتندو سوییچ) + + + نمایش تعویض پروفایل از طریق + + + دسترسی HidGuardian + + + خاموش کردن موقت DS4Windows + + + .NET 5 Runtime روی سیستم شما یافت نشد. لطفاً برای سازگاری با نسخه‌های آینده‌ی DS4Windows، آن را دانلود و نصب کنید. با بستن این پنجره به صفحه‌ی دانلود .NET 5 Runtime هدایت می‌شوید. + + + مرکز X + + + پشتیبانی از کنترلرهای JoyCon (نینتندو سوییچ) + + + انتخاب اولویت بلادرنگ (Real-time) نیازمند اجرای برنامه در حالت مدیر (Admin) است. + + + مقیاس عمودی ماوس + + + ضد بازگشت ناگهانی (Anti Snapback) + + + استیک فلیک (Flick Stick) + + + از طریق نوار نور + + + ماشه‌ی ضربه‌ای + + + پوشه‌ی برنامه + + + تیره + + + چرخش + + + لطفاً .NET Runtime را به‌روزرسانی کنید + + + ضبط یک ماکرو + + + دکمه‌ی چند-عملیاتی + + + حرکت جهت‌دار (Swipe) + + + مدت‌زمان نرم‌شدن (Easing) + + + ماشه‌ی لغو بارگذاری + + + با یک ضربه‌ی لمسی روی تاچ‌پد، کلیک چپ ماوس فعال می‌شود. حداکثر بازه‌ی زمانی برابر با (مقدار × ۲) میلی‌ثانیه است. + + + کنترل‌ها + + + جویستیک ماوس + + + لغو بارگذاری با رهاشدن ماشه + + + مکعبی (Easeout Cubic) + + + .NET 8 یافت نشد + + + [آزمایشی] استفاده از شبیه‌سازی ژیروسکوپ کنترلر DS3 + + + غیرفعال + + + حالت LED بازیکن + + + حالت دقیق (توصیه‌شده): +- حس ویبره‌ی DualShock 4 / ایکس‌باکس ۳۶۰ را بهتر شبیه‌سازی می‌کند +- افکت‌های ویبره‌ی مدنظر بازی را دقیق‌تر اجرا می‌کند +- ویبره عمق بیشتری دارد. در یک سطح توان یکسان، اختلاف بین حداقل و حداکثر فعال‌سازی ویبره در بازی بیشتر است +و از خیلی کم تا حداکثر شدتِ سطح توانِ تعیین‌شده متغیر است + +حالت قدیمی (Legacy): +- به‌طور کلی قوی‌تر، اما بدون عمق +- حسی «تیزتر» دارد +- حداقل و حداکثر فعال‌سازی در بازی، به‌ترتیب، کمی پایین‌تر و کمی بالاتر از شدتِ سطح توانِ انتخاب‌شده خواهد بود + +غیرفعال: +- ویبره را کاملاً غیرفعال می‌کند + + + افکت ماشه + + + ناحیه‌ی مرده X + + + ارتفاع + + + اجرا هنگام رهاشدن ماشه + + + تنظیمات اختصاصی ویبره‌ی DualSense + + + + = ساعت‌گرد. - = پادساعت‌گرد. + +تنظیم چرخش برای اصلاح جهت‌گیری استیک آنالوگ در صورتی است که هنگام حرکت‌دادن استیک، انگشت شست کمی جابه‌جا می‌شود. برای مثال، هنگامی که استیک کاملاً به سمت شمال حرکت می‌کند، ممکن است شست کمی از مرکز جابه‌جا شده باشد. مقدار استفاده‌شده، تعداد درجه‌هایی است که برای تنظیم مقدار نهایی خروجی محور به کار می‌رود. بازه‌ی مقدار از ۱۸۰- تا ۱۸۰ است. پیش‌فرض ۰ است. + + + تأخیر ورودی: نامشخص + + + حداکثر ناحیه + + + گزینه‌های نوع کنترلر + + + برای ویرایش زمان، روی یک «توقف» دوبار کلیک کنید + + + کنترلر خروجی + + + نگه‌داشتن به مدت + + + خیر + + + تغییردهنده‌ی Shift + + + رنگ ثابت + + + عادی + + + شماره‌ی ورودی + + + کوچک کردن به نوار وظیفه + + + برای جبران لرزش دستگاه، محدودیت بیشتری در ابتدای منحنی اعمال می‌کند + + + باعث می‌شود «اتصال بیرونی» پیش از رسیدن به آستانه اجرا شود. با عبور از آستانه، عملیات رها می‌شود + + + کنترل‌ها (شتاب‌سنج) + + + اجرا به‌عنوان + + + برنامه + + + حداقل مسافت حرکت + + + حالت ویبره و سطح شدت: + + + ساخت ماکروی نوار نور + + + برای ضبط از صفحه‌کلید/ماوس + کنترلر ۱ استفاده کنید + + + بله + + + پس از برداشتن انگشت، به حرکت روی تاچ‌پد اینرسی (مومنتوم) اضافه می‌کند. باعث می‌شود نشانگر ماوس فراتر از فضای محدود تاچ‌پد هم حرکت کند + + + محوری (Axial) + + + ناحیه‌ی ضد-مرده (Anti-dead Zone) + + + دقیق + + + مکعبی + + + حداقل ضریب + + + شتاب ماوس + + + تفسیر پیام‌های مانیتورینگ + + + ماوس مطلق + + + پشتیبانی از کنترلر DS3 + + + دسترسی HidHide + + + نوع کنترلر مجازی خروجی را انتخاب کنید (با ذخیره‌ی پروفایل اعمال می‌شود) + + + عبوری (Passthru) + + + نرخ چشمک‌زدن + + + صفحه‌کلید و ماوس + + + تغییر رنگ نوار نور + + + ضبط تأخیرها + + + فشردن/تغییر وضعیت کلید + + + کالیبراسیون ژیروسکوپ + + + پنهان کردن کنترلر DS4 + + + تنظیم قدیمی و منسوخ. تلاش برای اعمال یک منحنی بر اساس مختصات خام ورودی، پیش از اعمال اطلاعات ناحیه‌ی مرده. رفتار نامنظمی دارد + + + HidHide + + + پشتیبانی از کنترلرهای DualShock 3 (PS3). نیازمند استفاده از درایور DsHidMini از پروژه‌ی ViGEm (nefarius) است. + + + کالیبراسیون خودکار مجدد استیک + + + آزمایش + + + تنظیمات محور (Axis) + + + پشتیبانی از کنترلر Switch Pro + + + پشتیبانی از دستگاه JoyCon + + + همیشه تنظیم حداکثر خروجی را اعمال کن. برای «حداکثر خروجی» برابر با ۱۰۰٪ و محدودکردن مقدار به یک خروجی دایره‌ای مفید است + + + فعال + + + برای کسانی که برنامه‌ی پرتابل را ترجیح می‌دهند. +نکته: اگر برنامه در پوشه‌ای با نیاز به دسترسی ادمین و بدون UAC باشد، این گزینه کار نمی‌کند + + + فعال‌سازی LED دکمه‌ی Home + + + نوار نور + + + ارائه‌دهنده‌ی ژیروسکوپ ترکیبی + + + تنظیمات دیگر را هنوز حذف نکن + + + پس از شروع چشمک‌زدن، به تنظیمات بلوتوث بروید و به «Wireless Controller» متصل شوید. اگر خواسته شد، کد جفت‌سازی ۰۰۰۰ را وارد کنید. بعد از جفت‌سازی، آماده‌اید. لذت ببرید! + + + از HidHide برای تنظیم و پنهان‌کردن کنترلرهای ورودی از سایر برنامه‌های در حال اجرا استفاده کنید. برخی بازی‌ها نیاز دارند فقط یک کنترلر وجود داشته باشد، وگرنه ورودی دوگانه در بازی مشکل ایجاد می‌کند. + + + مرحله‌ی ۳: اتصال کنترلر DualShock 4. +برای اتصال سیمی/USB: +کافی است یک کابل micro-USB را به سیستم و DualShock 4 وصل کنید. + +برای اتصال بلوتوث (اختیاری): دکمه‌ی PS و Share را به مدت ۳ ثانیه نگه دارید. نوار نور شروع به چشمک‌زدن دوتایی می‌کند. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + اگر قبلاً از یک کنترلر ۳۶۰ روی این سیستم استفاده کرده‌اید، می‌توانید این مرحله را رد کنید. + + + (اختیاری) مرحله‌ی ۴: نصب درایور HidHide + + + اگر بعد از نصب این پنجره دوباره ظاهر شد، ممکن است لازم باشد سیستم را ری‌استارت کنید. + + + مرحله‌ی ۱: نصب درایور ViGEmBus + + + تنظیمات بلوتوث + + + به DS4Windows خوش آمدید + + + (اختیاری) مرحله‌ی ۵: نصب درایور FakerInput + + + مرحله‌ی ۲: در ویندوز ۷، درایور ۳۶۰ را نصب کنید + + + از درایور FakerInput برای فراهم‌کردن صفحه‌کلید مجازی، ماوس نسبی و ماوس مطلق در سطح سیستم استفاده کنید. این کار باعث می‌شود رویدادهای مجازی صفحه‌کلید و ماوس در مواقعی که SendInput کار نمی‌کند نیز قابل استفاده باشند؛ مثل پردازش‌ها و بازی‌های دارای دسترسی بالا، پیام‌های UAC و سیستم‌های ضدتقلبی که رویدادهای SendInput را مسدود می‌کنند. استفاده از FakerInput برای کارکرد DS4Windows با برخی بازی‌های دارای محافظت ضدتقلب مانند Valorant ضروری است. + + + مسیر پردازش. ^ABC = تطبیق در ابتدای رشته (^) | ABC$ = تطبیق در انتهای رشته ($) | *ABC = شامل شدن رشته (*) + + + عنوان پنجره. ^ABC = تطبیق در ابتدای رشته (^) | ABC$ = تطبیق در انتهای رشته ($) | *ABC = شامل شدن رشته (*) + + + پایان + + + انتخاب پیش‌تنظیم + + + ViGEmBus نصب نیست + + + نسخه‌ی پشتیبانی‌نشده‌ی ViGEmBus پیدا شد ({0}). لطفاً حداقل نسخه‌ی ۱٫۱۷٫۳۳۳٫۰ از ViGEmBus را نصب کنید. + + + اتصال به ViGEmBus برقرار نشد. لطفاً وضعیت دستگاه System را در Device Manager، و نصب‌بودن Visual C++ 2017 Redistributable را بررسی کنید. + + + افزودن قانون عنوان پنجره + + + قانون عنوان پنجره + + + ارسال فیدبک بازی به کنترلر فیزیکی + + + پیشنهاد می‌شه روشن بمونه. ویبره، هپتیک‌های تبدیل‌شده‌ی DualSense، افکت‌های سازگار adaptive trigger و نور کنترلر رو از بازی به کنترلر فیزیکیِ وصل‌شده می‌فرسته. فقط وقتی خاموشش کن که کنترلر نتونه خروجی بگیره؛ غیرفعال کردنش این افکت‌های فیدبک بازی رو حذف می‌کنه. بعد از تغییر این تنظیم، کنترلر رو دوباره وصل کن. + + + DS4Windows - نسخه‌ی hbashton (نسخه‌ی + + + میانبرها + + + از HidHide برای جلوگیری از ورودی دوگانه استفاده کن: کنترلر فیزیکی رو از دید بازی‌ها پنهان می‌کنه در حالی که DS4Windows همچنان ازش استفاده می‌کنه، و از ورودی تکراری جلوگیری می‌کنه +کلیک روی سمت چپ تاچ‌پد: لمس چپ +کلیک روی سمت راست تاچ‌پد: لمس راست +کلیک تاچ‌پد با ۲ انگشت: چندلمسی +کلیک روی بخش بالایی تاچ‌پد: لمس بالا +PS + Options یا نگه‌داشتن PS به مدت ۱۰ ثانیه: قطع اتصال کنترلر (فقط روی بلوتوث) +لمس تاچ‌پد + PS: خاموش کردن حرکت تاچ‌پد (کلیک هنوز کار می‌کنه) +کلیک پایین‌سمت‌راست پد: کلیک راست (بهتره وقتی سمت راست به‌عنوان دکمه‌ی ماوس استفاده می‌شه) +دو انگشت بالا/پایین روی تاچ‌پد*: اسکرول بالا/پایین +لمس و نگه‌داشتن تاچ‌پد*: درگ با کلیک چپ ماوس +سوایپ دوانگشتی چپ یا راست روی تاچ‌پد: چرخش بین پروفایل‌ها +تغییردهنده‌ی Shift: نگه‌داشتن یه اکشن برای استفاده از یه سری کنترل دیگه +هنگام مپ کردن کیبورد و ماوس: +Toggle: کلید توی حالت «فشرده» می‌مونه تا دوباره فشرده بشه +Macro: چند کلید رو به یه ورودی اختصاص بده +Scan Code: کلیدها جور دیگه‌ای تفسیر می‌شن. ممکنه برای بعضی بازی‌ها لازم باشه +*اگه فعال باشه + + + مجوز + + + دست‌اندرکاران + + + کد منبع + + + مشارکت‌کنندگان + + + مترجم‌ها: + + + امکانات جانبی + + + آدرس پروژه: + + + توضیحات + + + از HidHide برای پنهان کردن و تنظیم هر کنترلر ورودی از سایر برنامه‌های در حال اجرا روی سیستمت استفاده کن. بعضی بازی‌ها نیاز دارن فقط یه کنترلر وجود داشته باشه وگرنه ورودی دوگانه توی بازی مشکل ایجاد می‌کنه. نوشته‌ی nefarius. + + + از درایور FakerInput برای فراهم کردن صفحه‌کلید مجازی، ماوس نسبی و ماوس مطلق در سطح سیستم استفاده کن. این کار باعث می‌شه رویدادهای مجازی کیبورد و ماوس حتی وقتی SendInput کار نمی‌کنه هم قابل استفاده باشن؛ مثل پردازش‌ها و بازی‌های دارای دسترسی بالا، پیام‌های UAC و سیستم‌های ضدتقلب که رویدادهای SendInput رو مسدود می‌کنن. استفاده از FakerInput برای کار کردن DS4Windows با بعضی بازی‌های دارای محافظت ضدتقلب مثل Valorant لازمه. + + + هیچ کنترلری انتخاب نشده + + + یه کنترلر وصل کن، بعد از کارت‌های دستگاه بالا-سمت‌چپ انتخابش کن. + + + کنترلر انتخاب‌شده + + + پروفایل + + + باتری + + + اتصال + + + فاصله و نرخ گزارش ورودی مشاهده‌شده + + + فاصله و نرخ تحویل ورودی مشاهده‌شده. کنترلرهای ترکیبی از ریتم گزارش ترکیبی خودشون استفاده می‌کنن. این زمان تکمیل کرنل یا تأخیر سرتاسری بازی نیست. + + + پروفایل فعال + + + تنظیمات زیر روی این پروفایل ذخیره می‌شن + + + دستگاه شبیه‌سازی‌شده + + + از طریق پروفایل فعال اعمال می‌شه + + + وضعیت کنترلر + + + کنترل‌های سریع پروفایل + + + هر تغییری روی پروفایل فعال کنترلر انتخاب‌شده ذخیره و خودکار اعمال می‌شه. + + + کنترلر شبیه‌سازی‌شده + + + کنترلر مجازی که به بازی‌ها نشون داده می‌شه. + + + تغییر این تنظیم پروفایل رو ذخیره می‌کنه، بعد یه بار خروجی رو به‌صورت کنترل‌شده ری‌لود می‌کنه. + + + پخش صدا روی کنترلر + + + صدای انتخاب‌شده رو به کنترلر استریم می‌کنه. از اسپیکر داخلیش استفاده می‌کنه مگه اینکه «فقط هدست» صدا رو منحصراً به پورت AUX بفرسته. + + + فقط هدست (بی‌صدا کردن اسپیکر کنترلر) + + + اسپیکر داخلی رو بی‌صدا می‌کنه در حالی که استریم از طریق هدستی که به پورت AUX کنترلر وصله ادامه پیدا می‌کنه. + + + منبع صدا + + + پیش‌فرض میکس معمولی خروجی رو می‌گیره. یه برنامه انتخاب کن تا فقط صدای همون استریم بشه. + + + بازخوانی منابع صوتی در حال اجرا + + + Audio Haptics داره این استریم رو تأمین می‌کنه. برای انتخاب منبع دیگه، «پخش این برنامه از طریق کنترلر» رو خاموش کن. + + + استفاده از هدست روی USB + + + Switch 2 Pro خودت رو با USB وصل کن و هدفون یا هدست بزن. توی تنظیمات بازی یا صدای ویندوز، Headphones (Switch 2 Pro Controller) رو انتخاب کن. صدا رو از همون‌جا تنظیم کن. + + + برای چت صوتی، Microphone (Switch 2 Pro Controller) رو انتخاب کن و از هدستی با میکروفون استفاده کن. + + + مستقل از کنترلر مجازیت کار می‌کنه. صدای هدست بلوتوث هنوز پشتیبانی نمی‌شه. + + + باز کردن تنظیمات صدای ویندوز + + + انتخاب کن صدای بازی و چت صوتیت کجا بره. + + + سطح‌های خروجی + + + اسپیکر کنترلر + + + هدست / AUX + + + جک هدست کنترلر رو مستقل از اسپیکر داخلیش کنترل می‌کنه. + + + پردازش اسپیکر + + + محدوده‌ی دینامیک + + + جزئیات کم‌صدا رو بالا می‌بره و افکت‌های بلند رو بدون تأخیر پیش‌بینی، امن مهار می‌کنه. + + + خاموش + + + متعادل + + + قوی + + + بیس / بدنه + + + حدود ۲۰۰ هرتز بدنه اضافه می‌کنه و در همون حال ساب‌بیس غیرقابل‌استفاده رو فیلتر می‌کنه. + + + میکروفون + + + سطح میکروفون + + + حذف نویز + + + NVIDIA AI + + + اکشن‌های سریع + + + برو توی ادیتور کامل یا کنترلر فیزیکی انتخاب‌شده رو مدیریت کن. + + + ویرایش پروفایل فعال + + + جزئیات کنترلر + + + کنترل‌های نوار نور + + + از کنترل‌های نوار نور پروفایل استفاده کن یا یه رنگ سفارشی موقت انتخاب کن + + + قطع اتصال + + + فعال + + + Audio Haptics + + + فیدبک کنترلر بر پایه‌ی صدا + + + کم + + + متوسط + + + زیاد + + + منبع + + + بازخوانی نشست‌های صوتی در حال اجرا + + + صدای سیستم فقط از خروجی پیش‌فرض ویندوز استفاده می‌کنه، نه هر خروجی Sonar. یه برنامه انتخاب کن تا صداش روی هر خروجی‌ای دنبال بشه. + + + دنبال کردن خودکار بازی‌ها + + + با استفاده از رکوردهای بازی ویندوز و منیفست‌های لانچرهای نصب‌شده، به صدای بازی فعال سوییچ می‌کنه. + + + بازی‌های شناسایی‌شده توسط ویندوز، استیم، Epic یا GOG رو دنبال می‌کنه. برنامه‌ی انتخاب‌شده به‌عنوان جایگزین باقی می‌مونه. + + + پخش برنامه از طریق کنترلر + + + این برنامه‌ی انتخاب‌شده رو هم به اسپیکر کنترلر و هدست AUX استریم می‌کنه. + + + وقتی فعاله، جایگزین «منبع صدای کنترلر» توی بخش Advanced می‌شه. انتخاب منبع دیگه از اونجا این override رو آزاد می‌کنه. + + + فقط هدست + + + برنامه‌ی گرفته‌شده رو فقط از طریق پورت AUX کنترلر می‌فرسته. + + + صدای برنامه‌ی گرفته‌شده رو به هدفونِ وصل‌شده به کنترلر می‌فرسته و اسپیکر کنترلر رو بی‌صدا می‌کنه. + + + حالت + + + ترکیب + + + فیدبک بر پایه‌ی صدا رو به هپتیک و ویبره‌ی بازی اضافه می‌کنه. + + + جایگزینی + + + فقط از فیدبک بر پایه‌ی صدا استفاده کن. + + + پاسخ + + + تمرکز فرکانسی و شدت + + + تمرکز بیس + + + انتخاب کن کدوم بازه‌ی فرکانس پایین تبدیل به ویبره بشه. + + + پاسخ + + + کنترل کن هپتیک چقدر شدید واکنش نشون بده، مخصوصاً به قله‌ها. + + + ملایم + + + دینامیک + + + تهاجمی + + + شیب افزایش + + + کنترل کن هپتیک با صدا چقدر سریع بالا بیاد. + + + شیب کند + + + شیب متوسط + + + شیب سریع + + + شیب آنی + + + محو شدن + + + کنترل کن هپتیک بعد از افت صدا چقدر سریع محو بشه. + + + محو سریع + + + محو متوسط + + + محو کند + + + محو طولانی + + + Audio Haptics غیرفعاله. + + + صدای سیستم + + + ورودی زنده + + + کنترلر فیزیکی · قبل از ریمپ + + + در انتظار + + + استیک چپ + + + استیک راست + + + فشرده‌شده + + + یه کنترلر وصل کن، بعد این ادیتور رو دوباره باز کن. + + + بای‌پس لب + + + طراحی افکت + + + لینک‌شده + + + از یه طراحی افکت مشترک برای L2 و R2 استفاده کن. پریست‌ها، حالت‌ها و اسلایدرها بین دو طرف آینه می‌شن؛ سوییچ Active هر تریگر مستقل می‌مونه. + + + جدا + + + برای L2 و R2 طراحی افکت جداگونه تنظیم کن. برگشتن به Split آخرین تنظیمات مستقلت رو، از جمله اینکه کدوم تریگر فعال بود، برمی‌گردونه. + + + فعال + + + افکت‌های فعالِ لب، خروجی adaptive trigger بازی که وارد می‌شه رو override می‌کنن. + + + راه‌اندازی کنترلر مجازی VIIPER + + + بستن + + + VIIPER نیاز به توجه داره + + + این پروفایل از خروجی کنترلر مجازی VIIPER استفاده می‌کنه. + + + چیزهایی که DS4Windows نیاز داره + + + • سرور/هلپر VIIPER +• درایور USB/IP ویندوز usbip-win2 + + + وضعیت فعلی + + + یه VIIPER رقیب شناسایی شد + + + این فایل اجرایی elevate یا انتخاب نمی‌شه. Install یا Repair از بک‌اند تأییدشده‌ی Program Files استفاده می‌کنه و فقط فایل‌های قدیمیِ شناخته‌شده‌ی VIIPER رو حذف می‌کنه: + + + این پیام راه‌اندازی رو دیگه نشون نده + + + می‌تونی بعداً از Settings → VIIPER Virtual Controller Support دوباره پیام‌های راه‌اندازی رو روشن کنی. + + + «پرتابل نگه‌داشتن DS4Windows» این برنامه رو دقیقاً همون‌جایی که هست می‌ذاره، در حالی که بک‌اند elevated VIIPER رو توی Program Files محافظت‌شده نصب می‌کنه. Standard هم فقط فایل‌های متعلق به پکیجِ DS4Windows رو به Program Files منتقل می‌کنه. پروفایل‌ها، تنظیمات و فایل‌های ناشناخته همیشه حفظ می‌شن. + + + الان نه + + + پرتابل نگه‌داشتن DS4Windows + + + نصب استاندارد + + + راه‌اندازی VIIPER + + + در حال راه‌اندازی VIIPER + + + DS4Windows داره بک‌اند کامل کنترلر رو تأیید می‌کنه. + + + در حال آماده‌سازی پکیج تأییدشده... + + + • تأیید فایل‌های پکیج‌شده + + + • نصب VIIPER 0.1.9-rc4.6.6 + + + • تأیید USB-IP 0.9.7.7 + + + • تأیید استارتاپ و API + + + این پنجره رو باز نگه دار. راه‌اندازی خودکار تموم می‌شه. + + + تنظیم پروفایل‌های سوایپ + + + پروفایل‌هایی که سوایپ دوانگشتی تاچ‌پد اجازه داره بینشون سوییچ کنه رو تیک بزن. اگه هیچی تیک نخوره، سوایپ بین همه‌ی پروفایل‌ها می‌چرخه (رفتار پیش‌فرض). + + + انتخاب همه + + + پاک کردن همه + + + کالیبراسیون استیک Switch 2 + + + استیک‌هات رو کالیبره کن + + + بستن پنجره، capture و فعال‌سازی زنده رو لغو می‌کنه. یه ذخیره‌سازی که از قبل در حال نوشتن روی دیسکه ممکنه هنوز تموم بشه؛ بستن پنجره اون نوشتن رو لغو نمی‌کنه. + + + _بستن + + + استیک فیزیکی + + + _شروع کالیبراسیون + + + ذخیره‌ی _کالیبراسیون + + + _لغو capture + + + کالیبراسیون روی همین PC برای این استیک فیزیکی ذخیره می‌شه، نه توی یه پروفایل یا حافظه‌ی کنترلر. رکوردهای USB و بلوتوث ممکنه جدا باشن. ورودی مپ‌شده‌ی کنترلر تا وقتی کالیبراسیون فعاله، آزاد می‌مونه. + + + _ریست کالیبراسیون PC این استیک… + + + کالیبراسیون استیک + + + لطفاً استیکت رو چند بار به سمت‌ها حرکت بده و رهاش کن، بعد که تموم شد Save رو بزن. + + + حالت فعال‌سازی دکمه + + + + انتخاب پیش‌تنظیم + + + اندازه‌ی این پنجره پس از بسته‌شدن حفظ شود + + + حفظ اندازه + + + نقشه‌ی کنترلر + + + یک کنترل را مستقیماً روی کنترلر انتخاب کنید. + + + DualShock 4 + + + DualSense + + + DualSense Edge + + + Switch 2 Pro + + + جفت Joy-Con + + + Joy-Con L (عمودی) + + + Joy-Con R (عمودی) + + + Joy-Con L (افقی) + + + Joy-Con R (افقی) + + + دکمه‌های جهت‌نما + + + معکوس + + + معکوس X + + + معکوس Y + + + چرخش ۹۰ درجه + + + چرخش ۹۰- درجه + + + دکمه‌های روبرو + + + WASD + + + کلیدهای جهت‌نما + + + Cross + + + Circle + + + Square + + + Triangle + + + L1 + + + R1 + + + L2 + + + R2 + + + Share + + + Options + + + Guide + + + Capture + + + C + + + قطع صدا + + + Function چپ + + + Function راست + + + پدال پایین‌چپ + + + پدال پایین‌راست + + + لمس چپ + + + لمس چندگانه + + + لمس راست + + + لمس بالا + + + L3 + + + LSU + + + LSR + + + LSD + + + LSL + + + R3 + + + RSU + + + RSR + + + RSD + + + RSL + + + بالا + + + راست + + + پایین + + + چپ + + + نکته: روی کنترل‌های پشتیبانی‌شده راست‌کلیک کنید تا پیش‌تنظیم‌ها را ببینید. + + + نگاشت دکمه‌ها + + + برای تغییر عملکرد یک ردیف، روی آن دو بار کلیک کنید. + + + نمایش پیش‌نمایش زنده + + + فقط فهرست + + + اکشن‌های ویژه + + + L2/R2 + + + ساخته‌شده با Trigger Lab + + + این افکت محافظت‌شده‌ی پروفایل، خروجی ماشه‌ی تطبیقی ورودی از بازی را بازنویسی می‌کند. آن را در Trigger Lab ویرایش کنید. + + + محافظت‌شده + + + قرائت‌های کنترلر + + + LS + + + نیرو + + + واحد + + + میلی‌ثانیه + + + معکوس + + + ثانیه + + + این دکمه هنگام استفاده‌ی استیک چپ از Flick Stick برای کالیبراسیون رزرو شده است. + + + پروفایل را ذخیره کنید، سپس در بازی روی دکمه‌ی انتخاب‌شده برای چرخش ۳۶۰ درجه‌ی نگاه با ماوس ضربه بزنید. فقط در حالت Flick Stick فعال است. + + + اگر چرخش کمتر از حد انتظار بود، Real World Calibration را افزایش دهید؛ اگر بیشتر از حد بود، کاهش دهید. برای آزادسازی دکمه، «تخصیص‌نیافته» را انتخاب کنید. + + + RS + + + چرخش: + + + این دکمه هنگام استفاده‌ی استیک راست از Flick Stick برای کالیبراسیون رزرو شده است. + + + L2 و R2 + + + X + + + Z + + + R + + + G + + + B + + + خالی + + + چشمک در + + + تپش در + + + هنگام شارژ: + + + تپش + + + رنگین‌کمان + + + رنگ بر اساس درصد باتری + + + ثانیه/چرخه + + + جبران لرزش + + + دوبار ضربه + + + پایین‌راست به‌عنوان کلیک راست ماوس + + + عملکرد کلیک عبوری (حالت DS4) + + + شروع با خاموش‌بودن Slide/Scroll + + + حداقل آستانه + + + توپک ردیاب + + + اصطکاک: + + + Y + + + X+Y + + + غیرفعال‌کردن معکوس‌سازی + + + انگشت روی تاچ‌پد + + + PS + + + کلیک تاچ‌پد + + + سمت چپ + + + سمت راست + + + کشیدن به بالا + + + کشیدن به پایین + + + کشیدن به چپ + + + کشیدن به راست + + + استیک خروجی + + + محورهای خروجی + + + افقی و عمودی + + + فقط افقی + + + فقط عمودی + + + حداقل X + + + حداقل Y + + + معکوس X + + + معکوس Y + + + هموارسازی + + + گزینه‌های هموارسازی + + + حداکثر ناحیه X: + + + حداکثر ناحیه Y: + + + بازگشت به مرکز هنگام رهاسازی: + + + کج‌شدن به بالا + + + کج‌شدن به پایین + + + کج‌شدن به چپ + + + کج‌شدن به راست + + + ماشه‌ها + + + رفتار چرخش - چرخاننده‌ی ژیرو + + + شرط ارزیابی + + + و + + + یا + + + محور فرمان + + + محور X چپ + + + محور Y چپ + + + محور X راست + + + محور Y راست + + + محور L+R ماشه + + + محور X در VJoy1 + + + محور Y در VJoy1 + + + محور Z در VJoy1 + + + محور X در VJoy2 + + + محور Y در VJoy2 + + + محور Z در VJoy2 + + + دامنه‌ی فرمان + + + کالیبره کردن + + + کالیبراسیون ژیرو + + + حساسیت ژیرو: + + + محور X + + + میانگین وزنی + + + وزن هموارسازی + + + محور X + + + وزن + + + درجه/ثانیه + + + زمان تأخیر + + + Trigger Lab + + + گزینه‌های نینتندو + + + این تنظیمات با پروفایل ذخیره می‌شوند و برای کنترلرهایی که از آن‌ها پشتیبانی می‌کنند اعمال می‌شوند. + + + چطور می‌خواهید بازی کنید؟ + + + به منوها اشاره کنید. با کج‌کردن نشانه بگیرید. بازی را حس کنید. با آنچه می‌خواهید انجام دهید شروع کنید؛ تنظیمات دقیق در هر بخش پنهان شده است. + + + با این پروفایل برای هر کنترلری ذخیره می‌شود. ویژگی‌هایی که کنترلر شما پشتیبانی نمی‌کند بی‌اثرند. ماوس روی میز و نشانه‌گیری حرکتی ویژگی‌های جداگانه‌ای هستند. + + + ماوس روی میز + + + برای اشاره یا نشانه‌گیری، Joy-Con را بلغزانید. برای اسکرول از استیک آن استفاده کنید. + + + برای حرکت‌دادن ماوس، Joy-Con را بلغزانید + + + Joy-Con را روی یک سطح حرکت دهید تا نشانگر ماوس را کنترل کنید. + + + لبه‌ی سنسور را روی میز یا زیرماوسی قرار دهید، سپس Joy-Con را بلغزانید. بلند کردن آن اجازه می‌دهد بدون حرکت نشانگر، دوباره جای‌گذاری کنید. + + + برای نشانه‌گیری یا اشاره به منوها بلغزانید. تا زمانی که سنسور سطح را لمس می‌کند از استیک برای اسکرول استفاده کنید. + + + کلیک‌های ماوس را در نگاشت دکمه‌ها تخصیص دهید. برای عملکردهای متفاوت فقط روی میز، از سنسور IR متناظر به‌عنوان Shift Modifier استفاده کنید. + + + کدام Joy-Con: + + + خودکار + + + هر دو + + + اسکرول استیک: + + + انتخاب کنید که استیک فقط عمودی اسکرول کند یا در هر چهار جهت. + + + بالا / پایین + + + چهارجهته + + + حساسیت چپ: + + + حساسیت راست: + + + تشخیص سطح + + + اگر سطح شما تشخیص داده نمی‌شود، حالت Relaxed را امتحان کنید. این تنظیمات روی عملکردهای دکمه‌ی مبتنی بر سطح و نشانه‌گیری نیز اثر می‌گذارد. + + + تشخیص سطح چپ: + + + دقیق + + + ملایم + + + تشخیص سطح راست: + + + نشانه‌گیری با کج‌کردن + + + نشانه‌گیری دقیق با دست‌ها، با یا بدون نشانگر ماوس. + + + انتخاب کنید کج‌کردن چه کاری انجام دهد + + + دکمه‌های نگاشته‌شده‌ی کج‌کردن (بدون ماوس) + + + نشانگر ماوس + + + استیک نشانه‌گیری مجازی + + + اکشن‌های سریع کج‌کردن + + + کنترل‌های حرکتی خود بازی + + + زمان نشانه‌گیری: + + + همیشه روشن + + + نگه‌داشتن ZL / L2 + + + نگه‌داشتن ZR / R2 + + + سفارشی — تنظیمات ژیرو را ببینید + + + گزینه‌های ماشه از چیدمان دکمه‌های شما پیروی می‌کنند. ترکیب‌های سفارشی و toggle-to-aim در تنظیمات ژیرو موجودند. + + + سرعت نشانه‌گیری ماوس: + + + باز کردن تنظیمات کامل ژیرو… + + + دکمه‌های نشانه‌گیری، خروجی استیک، حساسیت و هموارسازی را انتخاب کنید. + + + تنظیم دقیق نشانه‌گیری + + + کاهش رانش جانبی ژیرو + + + به کاهش رانش جانبی ژیرو کمک می‌کند. اگر وسایل الکترونیکی نزدیک روی نشانه‌گیری اثر می‌گذارند، این را خاموش کنید. + + + برای پایدارسازی نشانه‌گیری، حرکات بسیار کوچک ژیرو را نادیده بگیرید. برای حداکثر حساسیت روی ۰ تنظیم کنید. + + + نادیده‌گرفتن حرکات کوچک: + + + برای چرخش بیشتر، استیک را همراه با نشانه‌گیری ژیرو استفاده کنید. برای خاموش‌کردن این ویژگی روی ۰ تنظیم کنید. + + + نشانه‌گیری کمکی با استیک: + + + حرکت هموارتر ماوس + + + حرکت ماوس را بین به‌روزرسانی‌های کنترلر هموارتر می‌کند. این باعث سریع‌ترشدن خود کنترلر نمی‌شود. + + + حساسیت حرکت جانبی را در شبیه‌سازهای سازگار تنظیم کنید. ۱ سطح معمولی است. + + + حساسیت چرخش شبیه‌ساز: + + + حفظ تراز نشانه‌گیری حرکتی + + + هنگام کج‌کردن کنترلر، تراز نشانه‌گیری حرکتی را حفظ می‌کند. + + + توقف موقت نشانه‌گیری با یک دکمه + + + با یک دکمه نشانه‌گیری حرکتی را موقتاً متوقف کنید تا بتوانید کنترلر را دوباره جای‌گذاری کنید. + + + برای توقف موقت نگه دارید یا برای تغییر وضعیت توقف فشار دهید. با توقف استفاده از ژیرو، توقف موقت پاک می‌شود. + + + تنظیمات نشانه‌گیری برای ویرایش: + + + دکمه‌های نگه‌داشتن برای قفل‌کردن: + + + دکمه‌های فشار برای تغییر وضعیت قفل: + + + پایدارسازی نشانه‌گیری هنگام فشردن دکمه + + + حرکت نشانه‌گیری ناشی از فشردن یا رهاکردن دکمه‌ها را کاهش می‌دهد. + + + یک حالتی که قبلاً در بالا فعال کرده‌اید را تنظیم دقیق کنید. این گزینه‌ها خروجی نشانه‌گیری شما را عوض نمی‌کنند. + + + منبع فعال‌سازی: + + + دکمه‌هایی که نشانه‌گیری را پایدار می‌کنند: + + + ناحیه‌ی مرده: + + + توقف با فشار: + + + توقف با رهاسازی: + + + ناحیه‌ی مرده پس از رهاسازی: + + + دکمه‌هایی که نشانه‌گیری را کند می‌کنند: + + + میرایی: + + + پس از رهاسازی: + + + پایدارسازی نشانه‌گیری هنگام لمس میز + + + برای نشانه‌گیری هنگام لمس سطح، سنسور IR چپ یا راست را در منوی ماشه‌ی ژیرو انتخاب کنید. + + + نشانه‌گیری را حول فشردن دکمه‌ها متوقف کنید، حرکات کوچک را نادیده بگیرید یا حساسیت را هنگام نگه‌داشتن دکمه کاهش دهید. + + + سنسور نوری چپ + + + دکمه‌های ناحیه‌ی مرده / پایدارسازی کلیک: + + + دکمه‌های میرایی: + + + سنسور نوری راست + + + نشانه‌گیری دوگانه با Joy-Con + + + بگذارید دو دست شما نشانه‌گیری را به اشتراک بگذارند، یا بین آن‌ها جابه‌جا شوید. + + + نشانه‌گیری با هر دو Joy-Con (DJG) + + + بگذارید یک جفت متصل نشانه‌گیری حرکتی را به اشتراک بگذارند. برای استفاده از منبع حرکتی تکی معمولی خاموش کنید. + + + انتخاب کنید کدام دست حرکت را تأمین می‌کند. این کار Joy-Conهای شما را جفت نمی‌کند یا نشانه‌گیری ماوس را روشن نمی‌کند. + + + برای نشانه‌گیری با ماوس یا استیک، از «نشانه‌گیری با کج‌کردن» ← «زمان نشانه‌گیری: همیشه روشن» شروع کنید. انتخاب یک دکمه در آنجا یک کنترل روشن/خاموش جداگانه اضافه می‌کند؛ دستی را انتخاب نمی‌کند. + + + راه‌اندازی نشانه‌گیری حرکتی… + + + انتخاب کنید دو دست چگونه با هم کار کنند + + + دست اصلی، جابه‌جایی سمت و دکمه‌های توقف. + + + حالت: + + + هر دو دست — جابه‌جایی دست اصلی + + + یک دست در هر لحظه + + + هر دو دست — توقف هر سمت + + + دست ترجیحی نشانه‌گیری: + + + دستی را که نشانه‌گیری شما را هدایت می‌کند انتخاب کنید، یا هنگام توقف هر سمت به‌طور جداگانه هر دو را ترکیب کنید. + + + ترکیب هر دو + + + رفتار دکمه: + + + هنگام نگه‌داشتن + + + فشار برای تغییر وضعیت + + + دکمه‌های Joy-Con چپ + + + دکمه‌های Joy-Con راست + + + حس بازخورد بازی + + + ضربه‌ها، بافت‌ها و افکت‌های ماشه را به‌صورت HD Rumble حس کنید. + + + قدرت کلی ویبره را تنظیم کنید. ۱۰۰٪ سطح معمولی است؛ ۰٪ ویبره‌ی بدنه را خاموش می‌کند. + + + قدرت ویبره‌ی بدنه: + + + شامل ویبره‌ی ماشه‌ی Xbox + + + ویبره‌های ماشه‌ی Xbox را در سمت متناظر کنترلر خود حس کنید. این تنظیم با Advanced مشترک است. + + + تغییر حس ویبره‌ی ماشه + + + با تغییر قدرت ویبره‌ی ماشه، حس آن نیز تغییر می‌کند. + + + قدرت ویبره‌ی ماشه: + + + حس ثابت ویبره: + + + شامل ویبره‌های دقیق DualSense + + + ویبره‌های دقیق DualSense را به HD Rumble چپ و راست تبدیل می‌کند. + + + شامل افکت‌های ماشه‌ی DualSense + + + افکت‌های ماشه‌ی DualSense را به ویبره تبدیل می‌کند. ماشه‌های Switch 2 نمی‌توانند مقاومت فیزیکی اضافه کنند. + + + استفاده از ویبره‌ی بدنه به سبک Xbox + + + به‌جای پیروی از جزئیات ویبره‌ی هر بازی، حسی یکدست و به سبک Xbox به ویبره‌ی بدنه بدهید. + + + حس ویبره‌ی بدنه: + + + ویبره را برای هماهنگی با صدای تأخیردار بازی به تأخیر بیندازید. برای سریع‌ترین پاسخ روی ۰ بگذارید. + + + تأخیر ویبره‌ی بازی: + + + از طریق جک هدفون Switch 2 Pro خود بشنوید و چت کنید. + + + صدا مستقیماً از طریق Windows عبور می‌کند. این مستقل از کنترلر مجازی انتخابی شما کار می‌کند؛ نیازی به تغییر وضعیت صدای DS4Windows نیست. + + + فقط USB. صدای هدست بلوتوث هنوز پشتیبانی نمی‌شود. یک کابل AUX معمولی صدا را خارج می‌کند، اما نمی‌تواند میکروفون هدست را آزمایش کند. + + + به دکمه‌ها یک وظیفه‌ی دوم بدهید + + + برای دسترسی به مجموعه‌ی دیگری از اکشن‌ها، یک دکمه را نگه دارید یا وضعیتش را تغییر دهید. + + + مثال: عملکرد معمول یک دکمه را حفظ کنید، سپس هنگام نگه‌داشتن دکمه‌ی دیگری، وظیفه‌ی دیگری به آن بدهید. + + + مجموعه‌ی اکشن برای ویرایش: + + + برای تعویض اکشن‌ها یک دکمه را فشار دهید: + + + این میان‌بر Shift Modifier را برای شما باز می‌کند. برای اکشن دوم جدید، Switch 2 Mode Shift از قبل انتخاب شده است. ماشه‌های shift موجود حفظ می‌شوند. + + + ویرایش اکشن دوم… + + + باز کردن نگاشت دکمه‌ها + + + اکشن را در پنجره انتخاب کنید، سپس این پروفایل را ذخیره کنید. یک دکمه‌ی shift برای تعویض اکشن‌ها رزرو می‌شود، بنابراین عملکرد معمول بازی آن ارسال نمی‌شود. + + + اکشن‌های دوم خودکار (اختیاری) + + + وقتی در پایین فعال شود، نشانه‌گیری در اکشن‌های دوم شروع می‌شود. دکمه‌های نگه‌داشتن یا تغییر وضعیت شما به‌جای آن به اکشن‌های معمول برمی‌گردند. این گزینه‌ها نشانه‌گیری را فعال نمی‌کنند. + + + شروع خودکار در اکشن‌های دوم هنگامی که: + + + نشانه‌گیری با ماوس فعال است + + + نشانه‌گیری با استیک فعال است + + + فرمان‌گیری حرکتی + + + با یک استیک اشاره کنید، اسکرول کنید یا ضربه بزنید + + + استیک‌هایی را که به عملکرد ماوس یا دکمه تخصیص داده‌اید، تنظیم دقیق کنید. + + + اسکرول استیک + + + ابتدا اکشن‌های اسکرول را در نگاشت دکمه‌ها تخصیص دهید. ضربه یک‌بار اسکرول می‌کند؛ نگه‌داشتن اسکرول را ادامه می‌دهد. + + + استیک چپ: + + + نگه‌داشتن + + + استیک راست: + + + اکشن‌های دکمه‌ی استیک + + + نگه‌داشتن، اکشن را فشرده نگه می‌دارد. ضربه، هر بار که استیک را به آن جهت حرکت می‌دهید، یک‌بار آن را فعال می‌کند. + + + استیک چپ + + + استیک راست + + + سرعت ماوس استیک + + + سرعت استیک‌های نگاشته‌شده به حرکت ماوس را تنظیم کنید. ۵ سرعت معمولی است؛ ۰ حرکت را متوقف می‌کند. + + + چیدمان و باتری + + + برچسب‌های دکمه‌های خود را تطبیق دهید، یک Joy-Con تکی را به‌صورت افقی نگه دارید، یا در باتری صرفه‌جویی کنید. + + + Xbox از موقعیت دکمه‌ها پیروی می‌کند. Nintendo از برچسب‌های چاپ‌شده‌ی A، B، X و Y پیروی می‌کند. + + + چیدمان دکمه‌های روبرو: + + + Xbox + + + Nintendo + + + سبک نگه‌داشتن Joy-Con: + + + جهت شروع را انتخاب کنید. انتخابی که در تب Controllers انجام شود، برای آن Joy-Con اولویت دارد. + + + عمودی + + + افقی + + + قطع خودکار بلوتوث + + + برای صرفه‌جویی در باتری پس از عدم‌فعالیت، یا پس از یک زمان مشخص حتی هنگام بازی‌کردن، قطع کنید. + + + هنگام بی‌کاری + + + پس از یک زمان مشخص + + + قطع پس از: + + + روز + + + ساعت + + + دقیقه + + + برای غیرفعال‌کردن تایمر، مدت را روی صفر تنظیم کنید. تا زمانی که اینجا تغییر نکند، پروفایل‌های موجود تنظیم Idle Disconnect خود را حفظ می‌کنند. + + + ویبره هنگام اتصال + + + هنگام آماده‌شدن کنترلر، یک ویبره‌ی کوتاه پخش کنید. + + + تصحیح رانش و دامنه‌ی استیک + + + اگر استیک حس نادرستی دارد یا نشانه‌گیری رانش می‌کند، از کالیبراسیون هدایت‌شده استفاده کنید. + + + کالیبراسیون استیک + + + مراحل هدایت‌شده را دنبال کنید تا مرکز و دامنه‌ی استیک تصحیح شود. تنظیمات کارخانه‌ای بدون تغییر باقی می‌مانند. + + + کالیبره‌کردن استیک‌ها… + + + کنترلر را روی یک سطح پایدار قرار دهید و پس از شروع، حداقل پنج ثانیه بی‌حرکت نگه دارید. + + + شروع مجدد کالیبراسیون ژیرو + + + رانش ژیرو را تصحیح کنید. کنترلر را حداقل پنج ثانیه بی‌حرکت نگه دارید. + + + کنترلر را به‌آرامی به شکل عدد ۸ بچرخانید. ورودی بازی در حین کالیبراسیون متوقف می‌شود. + + + کالیبره‌کردن تصحیح رانش + + + اگر تصحیح رانش جانبی نادرست به‌نظر می‌رسد، از این استفاده کنید. + + + پیشرفته + + + Xbox 360 + + + Xbox One / Series + + + A + + + چیدمان روبروی Nintendo + + + Plus، Minus، Home، Capture، L/R، ZL/ZR + + + حذف پرش دکمه (Debouncing) + + + تبدیل ویبره‌ی impulse-trigger مربوط به Xbox + + + ویبره‌های ماشه‌ی Xbox را از طریق ماشه‌ها یا موتورهای ویبره‌ی کنترلر خود حس کنید. مستقل از Trigger Lab عمل می‌کند. + + + ارسال ویبره‌ی impulse به ماشه‌های تطبیقی + + + DualSense و Edge: از ماشه‌های تطبیقی برای ویبره‌ی impulse مربوط به Xbox استفاده می‌کنند. برای استفاده از ویبره‌ی بدنه، خاموش کنید. به تبدیل impulse در بالا نیاز دارد. + + + ویژگی‌های کنترلر PlayStation + + + هپتیک‌های DualSense + + + بلندگوی داخلی را بی‌صدا می‌کند و همزمان همان جریان را از طریق هدستی که به پورت AUX کنترلر متصل است ادامه می‌دهد. + + + بی‌صداکردن بلندگوی کنترلر با دکمه‌ی Mute + + + وقتی «دکمه‌ی Mute ورودی/خروجی را بی‌صدا می‌کند» فعال باشد، روشن‌شدن LED بی‌صدایی خروجی بلندگوی کنترلر را خاموش می‌کند. این تنظیم هنگام خاموش‌بودن کلید اصلی اثری ندارد. + + + منبع صدا: + + + برای صدای بازی، نقطه‌پایانی مجازی Wireless Controller ایجادشده توسط خروجی VIIPER PlayStation را انتخاب کنید. اولین جفت استریو به بلندگوی فیزیکی کنترلر منعکس می‌شود. + + + Audio Haptics در حال حاضر برنامه‌ی انتخاب‌شده را به این کنترلر می‌فرستد. برای رهاکردن آن override، منبع صدای دیگری را اینجا انتخاب کنید. + + + بلندگوی DualSense (USB): + + + فقط برای DualSense فیزیکی متصل با USB استفاده می‌شود. کنترلرهای بلوتوث صدا را مستقیماً به کنترلر استریم می‌کنند. + + + بلندی بلندگو: + + + دامنه‌ی دینامیک: + + + پردازش بلندگوی بلوتوث. Balanced جزئیات آرام‌تر را بالا می‌برد و افکت‌های بلند را مهار می‌کند. Strong دامنه را بیشتر تنگ می‌کند. پردازش پیش از کدگذاری بومی (Opus در DualSense، SBC در DualShock 4) و بدون تأخیر look-ahead اعمال می‌شود. + + + تقویت بیس/بدنه: + + + تا ۶ dB حول ۲۰۰ هرتز اضافه می‌کند و همزمان ساب‌بیس غیرقابل‌استفاده را فیلتر می‌کند. فقط روی جریان بلندگوی بلوتوث کنترلر اعمال می‌شود. + + + بی‌صداکردن میکروفون کنترلر با دکمه‌ی Mute + + + وقتی «دکمه‌ی Mute ورودی/خروجی را بی‌صدا می‌کند» فعال باشد، روشن‌شدن LED بی‌صدایی ورودی میکروفون کنترلر را خاموش می‌کند. این تنظیم هنگام خاموش‌بودن کلید اصلی اثری ندارد. + + + سطح میکروفون: + + + سطح فیزیکی میکروفون و سیگنال ایمن‌شده‌ی نمایش‌داده‌شده به Windows را تنظیم می‌کند. + + + حذف نویز: + + + Balanced پاک‌سازی صوت با RNNoise را اعمال می‌کند. Strong نویز باقیمانده‌ی سطح‌پایین را نیز کاهش می‌دهد. Off فقط gain، فیلتر بالاگذر و محافظت از کلیپینگ را حفظ می‌کند. + + + صدای پیشرفته + + + بلندی هدست / AUX: + + + جک هدست را مستقل از بلندگوی کنترلر کنترل می‌کند. DualShock 4 کل دامنه‌ی اسلایدر را به بهره‌ی هدست مستندشده‌ی ۰ تا ۸۰ سونی نگاشت می‌کند. + + + مسیریابی میکروفون USB/قدیمی، نقطه‌پایانی میکروفون فیزیکی کنترلر Windows را دریافت می‌کند و آن را به یک دستگاه رندر صوتی مجازی مانند VB-CABLE Input می‌فرستد. مسیریابی میکروفون بلوتوث VIIPER به این نقاط پایانی نیاز ندارد. + + + میکروفون کنترلر: + + + خروجی مجازی: + + + دکمه‌ی Mute در DualSense + + + دکمه‌ی Mute ورودی/خروجی را بی‌صدا می‌کند + + + از دکمه‌ی Mute کنترلر به‌عنوان یک کنترل اصلی برای اهداف بلندگو و میکروفون انتخاب‌شده در بالا استفاده می‌کند. LED بی‌صدایی هنگام بی‌صدابودن آن اهداف روشن و در حالت فعال بودن آن‌ها خاموش است. + + + فعال‌کردن نور دکمه‌ی Mute + + + وضعیت فیزیکی دکمه‌ی Mute در DualSense را تا زمانی که این پروفایل فعال است، در LED بی‌صدایی کنترلر منعکس می‌کند. این فقط نور را کنترل می‌کند، نه مسیریابی میکروفون Windows را. + + + دکمه‌ی Mute پروفایل‌ها را تعویض می‌کند + + + هنگام تغییر وضعیت Mute، بین پروفایل‌های انتخاب‌شده جابه‌جا می‌شود. فعال‌کردن «دکمه‌ی Mute ورودی/خروجی را بی‌صدا می‌کند» این گزینه را خاموش و خاکستری می‌کند، بدون پاک‌کردن انتخاب‌های پروفایل ذخیره‌شده. + + + پروفایل هنگام Mute: + + + اختیاری. وقتی دکمه‌ی فیزیکی Mute در DualSense روشن می‌شود، به این پروفایل تعویض کن. + + + برای جلوگیری از تغییر پروفایل هنگام روشن‌شدن Mute، خالی بگذارید. + + + پروفایل هنگام خاموش‌شدن Mute: + + + اختیاری. وقتی دکمه‌ی فیزیکی Mute در DualSense خاموش می‌شود، به این پروفایل تعویض کن. + + + برای جلوگیری از تغییر پروفایل هنگام خاموش‌شدن Mute، خالی بگذارید. + + + برای قرائت + + + Game Bar + + + فعال‌کردن سازگاری کنترلر با Game Bar + + + هنگام نمایان‌بودن Xbox Game Bar، ورودی نگاشته‌شده‌ی این پروفایل موقتاً از طریق یک کنترلر سازگار با Xbox مسیریابی می‌شود. پروفایل انتخاب‌شده و خروجی بومی DualSense پیکربندی‌شده باقی می‌مانند. + + + این پروفایل و خروجی بومی آن را فعال نگه می‌دارد. فقط ورودی نگاشته‌شده موقتاً از طریق یک همراه سازگار با Xbox ارسال می‌شود در حالی‌که Game Bar باز است؛ صدا، هپتیک، نورپردازی و مسیریابی میکروفون دست‌نخورده باقی می‌مانند. + + + دقیقه + + + حداکثر (۱ میلی‌ثانیه) + + + نمایش پیش‌نمایش زنده + + + ببینید هنگام انتخاب عملیات، کنترلر شما چه چیزی ارسال می‌کند. + + + لمس بالا + + + Sixaxis بالا + + + Sixaxis پایین + + + Sixaxis چپ + + + Sixaxis راست + + + عملکرد چپ DSE + + + عملکرد راست DSE + + + پدال چپ DSE + + + پدال راست DSE + + + Switch 2 Joy-Con چپ - حسگر IR + + + Switch 2 Joy-Con راست - حسگر IR + + + Switch 2 تغییر حالت + + + Switch 2 Joy-Con چپ SL + + + Switch 2 Joy-Con چپ SR + + + Switch 2 Joy-Con راست SL + + + Switch 2 Joy-Con راست SR + + + Switch 2 C / گفتگو + + + D + + + E + + + F + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + S + + + T + + + U + + + V + + + W + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Tab + + + Esc + + + Prt + + + Del + + + RCtrl + + + Brk + + + Ins + + + NumLk + + + Home + + + BkSpace + + + Space + + + LAlt + + + End + + + LCtrl + + + RShift + + + PgUp + + + Scl + + + LWin + + + RAlt + + + Enter + + + LShift + + + RWin + + + PgDown + + + Caps + + + R → + + + نمای کلی + + + عمومی + + + بازخوانی + + + پینگ + + + زمان + + + داده + + + برای قطع اتصال بی‌سیم راست‌کلیک کن + + + هر بار که این کنترلر فیزیکی دوباره وصل می‌شه، همین پروفایل استفاده بشه. + + + حالت نگه‌داشتن جوی-کان + + + شناسایی + + + این کنترلر رو می‌لرزونه تا بتونی تشخیص بدی کدومه. + + + نوار نور + + + یه رنگ موقت برای نوار نور انتخاب کن + + + پروفایل‌های تو + + + یه پروفایل رو برای عملیات‌ها انتخاب کن، یا روی کارتش دابل‌کلیک کن تا ویرایشش کنی. + + + جستجوی پروفایل‌ها بر اساس نام + + + پاک کردن جستجو + + + P + + + پروفایل کنترلر + + + هنوز پروفایلی نیست + + + برای شروع، یه پروفایل بساز یا وارد کن. + + + در حال بارگذاری ادیتور پروفایل + + + در حال اعمال پروفایل و آماده‌سازی کنترل‌هاش... + + + اجرای خودکار، اعلان‌ها، شارژ، ظاهر برنامه و رفتار به‌روزرسانی که اکثر کاربرها استفاده می‌کنن. + + + باعث می‌شه بازی‌ها هم کنترلر فیزیکی و هم خروجی مجازیش رو هم‌زمان نبینن. توی نسخه‌های فعلی ویندوز، استفاده از HidHide توصیه می‌شه. + + + پس‌گرفتن خودکار کنترلر از Steam Input + + + کنترلر فیزیکی رو با HidHide مخفی می‌کنه، بعد فقط مجموعه‌ی HID اون رو با خیال راحت ری‌استارت می‌کنه تا Steam هر handle‌ای که قبلاً باز کرده رو آزاد کنه. کنترلر مجازی همچنان در دسترس بازی‌ها می‌مونه. + + + انتخاب کن سوایپ دوانگشتی بین کدوم پروفایل‌ها اجازه‌ی سوییچ داره + + + انتخاب کن که DS4Windows موقع ورود به ویندوز باز بشه یا نه. اگه راه‌اندازی هنوز کامل نشده، انتخابت ذخیره می‌شه و پیام زیر مرحله‌ی بعدی رو توضیح می‌ده. + + + با متوقف شدن سرویس DS4Windows، کنترلرهای بلوتوثی قطع بشن. + + + DS4Windows رو بی‌سروصدا باز کن بدون نشون‌دادن پنجره‌ی اصلی. + + + ثبت گزارش کامل (verbose) + + + نشانه‌های عیب‌یابی دقیق رو توی لاگ ثبت می‌کنه. بعد از تست، غیرفعالش کن. + + + به‌صورت دوره‌ای GitHub رو برای نسخه‌ی جدیدتر DS4Windows بررسی کن. + + + تنظیمات پیشرفته + + + سرورهای شبکه، بازنویسی‌های سازگاری، ثبت دستگاه، عیب‌یابی و ابزارهای نگه‌داری. تنظیمات پیش‌فرض برای اکثر کاربرها بهترینه. + + + حمایت از DS4Windows + + + به تأمین هزینه‌ی سخت‌افزار کنترلر، تست و توسعه کمک کن. + + + پشتیبانی کنترلر مجازی VIIPER + + + وضعیت VIIPER نامشخص + + + نصب / تعمیر VIIPER + + + برای خروجی‌های VIIPER لازمه: DualSense، DualSense Edge، Switch 2 Pro، DS4، Xbox 360 و Xbox One / Series روی USB/IP. + + + وقتی VIIPER نیاز به راه‌اندازی داره بهم اطلاع بده + + + برای غیرفعال‌کردن پیام‌های خودکار راه‌اندازی VIIPER، این گزینه رو خاموش کن. نصب/تعمیر و بازخوانی همچنان از همین‌جا در دسترسن. + + + کنترلرهای بی‌سیم Switch 2 + + + دکمه‌ی sync کنترلر رو نگه دار تا چراغ‌هاش چشمک بزنه، بعد از پایین انتخابش کن. کنترلرهایی که قبلاً اضافه کردی، با روشن‌شدن دوباره وصل می‌شن. + + + جوی-کان‌ها به‌صورت خودکار جفت می‌شن + + + جوی-کان‌های چپ و راستِ در دسترس رو توی یه کنترلر یکی می‌کنه. یه جوی-کان تنها، همچنان به‌صورت جداگانه کار می‌کنه. + + + برای بررسی وضعیت شناسایی بلوتوث، بازخوانی کن. + + + افزودن کنترلر + + + یکی‌کردن جوی-کان‌ها + + + هر جوی-کان به‌تنهایی کار می‌کنه. برای یکی‌کردن دوتاش، از همین‌جا انتخابشون کن یا از دکمه‌های Link توی تب Controllers استفاده کن. + + + هنوز هیچ اتصال جوی-کان ۲ جفت‌نشده‌ای دیده نشده. + + + جوی-کان ۲ چپ + + + جوی-کان ۲ راست + + + یکی‌کردن جفت جوی-کان ۲ انتخاب‌شده + + + استفاده از چپ انتخاب‌شده به‌صورت جداگانه + + + استفاده از راست انتخاب‌شده به‌صورت جداگانه + + + جوی-کان ۲ جفت‌نشده + + + روی Link یکی از جوی-کان‌ها کلیک کن، بعد روی Link اون یکی. کنترلر اول پروفایل و پد مجازیش رو حفظ می‌کنه. + + + پشتیبانی از مادهای بازی (DSX) + + + به مادهای بازی اجازه بده ماشه‌ها و چراغ‌ها رو کنترل کنن + + + برای مادهای بازی سازگار با DSX روی همین PC و یه DualSense یا DualSense Edge. Trigger Lab روی هر ماشه‌ای که فعالش کنی اولویت داره. این گزینه audio haptics رو استریم نمی‌کنه. + + + جزئیات اتصال + + + توی مادت از همین آدرس و درگاه استفاده کن. اکثر مادها از 127.0.0.1 و درگاه 6969 استفاده می‌کنن. اول DSX یا هر listener دیگه‌ای که از این درگاه استفاده می‌کنه رو ببند. + + + آدرس این PC + + + اعمال / تلاش دوباره + + + DS4Windows + همراه کنترلر + برای شروع، یک کنترلر وصل کنید + ناوبری + ویرایشگر پروفایل + P + فضای کاری متمرکز + در حال ویرایش پروفایل + فضای کاری پروفایل + بازگشت به پروفایل‌ها + لغو ویرایش و بازگشت به فهرست پروفایل‌ها + نگاشت دکمه‌ها + دکمه‌ها، استیک‌ها، ژست‌های لمسی و میانبرها + ماکروها، اجراها، شیفت‌ها و چندعملیاتی‌ها + ورودی‌های زنده و کالیبراسیون + استیک‌ها، تریگرها، ناحیه‌ی مرده و منحنی‌ها + رنگ، باتری، چشمک‌زدن و شارژ + ماوس، ژست‌ها، پاس‌ترو و موقعیت‌دهی + هدف‌گیری حرکتی، فرمان‌دهی و سوایپ‌ها + تبدیل صدای سیستم یا برنامه به لرزش‌های پیشرفته + ساخت جلوه‌های ماندگار تریگر تطبیقی + لرزش HD، حرکت، ماوس نوری و کالیبراسیون + خروجی، لرزش، تأخیر و سازگاری + رویدادهای سرویس بدون خروج از ویرایشگر + + LX (I): + LX (O): + LY (I): + LY (O): + RX (I): + RX (O): + RY (I): + RY (O): + X (I): + X (O): + Z (I): + Z (O): + I: + O: + TX: + TY: + + نام: + دکمه‌هایی را که این عملیات را شروع می‌کنند انتخاب کنید. چند دکمه باید همزمان نگه‌داشته شوند. + دکمه‌هایی را که این عملیات را پایان می‌دهند یا به پروفایل قبلی برمی‌گردانند انتخاب کنید. + اجرای برنامه + ثانیه + آرگومان‌ها + بارگذاری پروفایل + فشردن کلید + قطع بلوتوث + بررسی باتری + چندعملیاتی + فرمان Sixaxis + + پذیرش کنترلرهای مجازی Moonlight / Sunshine + هر کنترلر مجازی پشتیبانی‌شده‌ای که هنگام اجرای Sunshine ساخته می‌شود را بپذیر. خروجی‌های VIIPER خود DS4Windows همیشه مستثنا هستند. + DS4 + Switch Pro + JoyCon + + دستگاه + عنوان پنجره... + جستجو بر اساس پروفایل، عنوان پنجره، فایل اجرایی یا مسیر + دستگاه + + FakerInput + CRC32 + H.NotifyIcon + vJoyInterfaceCS + + X — Y — + + بک‌اند کنترلر مجازی مورد نیاز. DS4Windows دسترسی مدیر را درخواست می‌کند و VIIPER به‌همراه usbip-win2 را برای شما نصب می‌کند. + + چرخش بین برنامه‌ها + از فایل... + فعال‌سازی پل مستقیم کنترلر Sunshine + اجازه بده Sunshine ورودی کنترلر را مستقیم به DS4Windows بفرستد. DS4Windows خودش کنترلر مجازیِ سمت بازی را می‌سازد و هیچ کنترلر ورودی مجازی Sunshine ساخته نمی‌شود. گزینه‌ی متناظر را در Sunshine هم فعال کن. + تعمیر، نصب فعلی‌ات رو به‌روز می‌کنه. پروفایل‌ها و تنظیماتت حفظ می‌شن. + نصب / تعمیر + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.resx b/DS4Windows/Translations/Strings.resx index ea99ade2..87c3f9e5 100644 --- a/DS4Windows/Translations/Strings.resx +++ b/DS4Windows/Translations/Strings.resx @@ -1490,4 +1490,2258 @@ Please click OK to confirm that you have read the message. Press Cancel to be re Inverse motors - + + DS4Windows - hbashton Build (Version + + + Hotkeys + + + Use HidHide to Prevent Double Input: Hides the physical controller from games while DS4Windows continues using it, preventing duplicate inputs +Click left side of touchpad: Left Touch +Click right side of touchpad: Right Touch +Click touchpad with 2 fingers: Multitouch +Click upper part of touchpad: Upper Touch +PS + Options or hold PS for 10 secs: Disconnect Controller (Only on Bluetooth) +Touch Touchpad + PS: Turn off touchpad movement (clicking still works) +Pad click on lower right: Right click (Best used when right side is used as a mouse button) +Two fingers up/down on touchpad*: Scroll Up/Down +Tap then hold touchpad*: Left mouse drag +2 finger touchpad swipe left or right: Cycle through profiles +Shift Modifer: Hold an action to use another set of controls +When mapping keyboard and mouse: +Toggle: The key will remain in a "held down" state until pressed again +Macro: Assign multiple keys to one input +Scan Code: Keys are interpreted differently. May be needed for certain games +*If enabled + + + License + + + Credits + + + Source + + + Contributors + + + Translators: + + + Extras + + + Project URL: + + + Description + + + Use HidHide to configure and hide any input controllers from other apps running on your system. Some games require only one controller to be present or double input will cause problems in game. Written by nefarius. + + + Use FakerInput driver to expose system-wide virtual keyboard, relative mouse, and absolute mouse. Allows virtual KB+M events to be usable in some situations when SendInput fails. Such situations are elevated process and games, UAC prompts, and anti-cheat systems that block SendInput events. Use of FakerInput is necessary to allow DS4Windows to work with some games with anti-cheat protection like Valorant. + + + No controller selected + + + Connect a controller, then choose it from the device cards in the upper-left corner. + + + SELECTED CONTROLLER + + + Profile + + + BATTERY + + + CONNECTION + + + Observed input report interval · rate + + + Observed input delivery interval and rate. Joined controllers use their composite report cadence. This is not kernel completion time or end-to-end game latency. + + + ACTIVE PROFILE + + + Settings below save to this profile + + + EMULATED DEVICE + + + Applied through the active profile + + + CONTROLLER STATUS + + + Quick profile controls + + + Every change is saved to the selected controller's active profile and applied automatically. + + + Emulated controller + + + The virtual controller presented to games. + + + Changing this setting saves the profile, then performs one controlled output reload. + + + Stream audio to controller + + + Streams the selected audio to the controller. Uses its built-in speaker unless Headset only routes it exclusively to the AUX port. + + + Headset only (mute controller speaker) + + + Mutes the built-in speaker while continuing the stream through a headset connected to the controller's AUX port. + + + Audio source + + + Default captures the normal endpoint mix. Choose an app to stream only that app. + + + Refresh running audio sources + + + Audio Haptics is supplying this stream. Turn off Play this app through controller to choose another source. + + + Use a headset over USB + + + Connect your Switch 2 Pro by USB and plug in headphones or a headset. Choose Headphones (Switch 2 Pro Controller) in your game or Windows Sound settings. Adjust the volume there. + + + For voice chat, choose Microphone (Switch 2 Pro Controller) and use a headset with a microphone. + + + Works independently of your virtual controller. Bluetooth headset audio is not supported yet. + + + Open Windows Sound settings + + + Choose where your game sound and voice chat go. + + + Output levels + + + Controller speaker + + + Headset / AUX + + + Controls the controller headset jack independently from its built-in speaker. + + + Speaker processing + + + Dynamic range + + + Raises quiet detail and safely restrains loud effects without look-ahead latency. + + + Off + + + Balanced + + + Strong + + + Bass / body + + + Adds body around 200 Hz while filtering unusable sub-bass. + + + Microphone + + + Microphone level + + + Noise suppression + + + NVIDIA AI + + + Quick actions + + + Jump into the full editor or manage the selected physical controller. + + + Edit active profile + + + Controller details + + + Lightbar controls + + + Use profile lightbar controls or choose a temporary custom color + + + Disconnect + + + Enabled + + + Audio Haptics + + + Audio-driven controller feedback + + + Low + + + Medium + + + High + + + SOURCE + + + Refresh running audio sessions + + + System audio uses only Windows' default output, not every Sonar output. Choose an app to follow its audio on any output. + + + Automatically follow games + + + Switch to the active game's audio using Windows game records and installed launcher manifests. + + + Follows games recognized by Windows, Steam, Epic, or GOG. The selected app remains the fallback. + + + Play app through controller + + + Also stream this selected app to the controller speaker and AUX headset. + + + Overrides Advanced > Controller audio source while enabled. Choosing another source there releases this override. + + + Headset only + + + Send the captured app only through the controller AUX port. + + + Routes captured app audio to headphones connected to the controller and mutes the controller speaker. + + + MODE + + + Mix + + + Add audio-derived feedback to game haptics and rumble. + + + Replace + + + Use only audio-derived feedback. + + + Response + + + Frequency focus and strength + + + Bass Focus + + + Choose which low-frequency region becomes vibration. + + + Response + + + Control how strongly haptics react, especially to peaks. + + + Subtle + + + Dynamic + + + Aggressive + + + Ramp + + + Control how quickly haptics rise with the sound. + + + Slow Ramp + + + Medium Ramp + + + Fast Ramp + + + Instant Ramp + + + Fade + + + Control how quickly haptics fade after the sound drops. + + + Fast Fade + + + Medium Fade + + + Slow Fade + + + Long Fade + + + Audio Haptics is disabled. + + + System audio + + + Live input + + + Physical controller · before remapping + + + Waiting + + + L stick + + + R stick + + + PRESSED + + + Connect a controller, then reopen this editor. + + + LAB OVERRIDE + + + Effect design + + + Linked + + + Use one shared effect design for L2 and R2. Presets, modes, and sliders mirror between both sides; each trigger's Active switch remains independent. + + + Split + + + Configure separate effect designs for L2 and R2. Returning to Split restores your last independent settings, including which trigger was active. + + + Enabled + + + Active lab effects override incoming game adaptive-trigger output. + + + VIIPER virtual controller setup + + + Close + + + VIIPER needs attention + + + This profile uses a VIIPER virtual controller output. + + + What DS4Windows needs + + + • VIIPER helper/server +• usbip-win2 Windows USB/IP driver + + + Current status + + + Competing VIIPER detected + + + This executable will not be elevated or selected. Install or Repair uses the verified Program Files backend and removes only recognized legacy VIIPER files: + + + Don't show this setup prompt again + + + You can turn setup prompts back on from Settings → VIIPER Virtual Controller Support. + + + Keep DS4Windows portable leaves this app exactly where it is, while installing the elevated VIIPER backend in protected Program Files. Standard also moves only package-owned DS4Windows files into Program Files. Profiles, settings, and unrecognized files are always preserved. + + + Not now + + + Keep DS4Windows portable + + + Install standard + + + VIIPER setup + + + Setting up VIIPER + + + DS4Windows is verifying the complete controller backend. + + + Preparing verified package... + + + • Verify packaged files + + + • Install VIIPER 0.1.9-rc4.6.6 + + + • Verify USB-IP 0.9.7.7 + + + • Verify startup and API + + + Keep this window open. Setup will finish automatically. + + + Config Swipe Profiles + + + Tick the profiles the two-finger touchpad swipe is allowed to switch between. If nothing is ticked, the swipe cycles through every profile (default behaviour). + + + Select All + + + Clear All + + + Switch 2 stick calibration + + + Calibrate your sticks + + + Closing cancels capture and live activation. A save already writing to disk may still finish; closing does not undo that write. + + + _Close + + + PHYSICAL STICK + + + _Start calibration + + + Sa_ve calibration + + + _Cancel capture + + + Calibration is saved on this PC for this physical stick, not in a profile or the controller's memory. USB and Bluetooth records may be separate. Mapped controller input is released while calibration is active. + + + _Reset this stick's PC calibration… + + + StickCalibration + + + Please move your stick to the sides and release it a few times, then after you are done press Save. + + + Button Activation Mode + + + + Select Preset + + + Keep this window size after closing + + + Keep size + + + Controller map + + + Choose a control directly on the controller. + + + DualShock 4 + + + DualSense + + + DualSense Edge + + + Switch 2 Pro + + + Joy-Con pair + + + Joy-Con L (upright) + + + Joy-Con R (upright) + + + Joy-Con L (sideways) + + + Joy-Con R (sideways) + + + DPad + + + Inverted + + + Inverted X + + + Inverted Y + + + Rotate 90° + + + Rotate -90° + + + Face Buttons + + + WASD + + + Arrow Keys + + + Cross + + + Circle + + + Square + + + Triangle + + + L1 + + + R1 + + + L2 + + + R2 + + + Share + + + Options + + + Guide + + + Capture + + + C + + + Mute + + + Function Left + + + Function Right + + + Bottom Left Paddle + + + Bottom Right Paddle + + + Left Touch + + + Multi Touch + + + Right Touch + + + Top Touch + + + L3 + + + LSU + + + LSR + + + LSD + + + LSL + + + R3 + + + RSU + + + RSR + + + RSD + + + RSL + + + Up + + + Right + + + Down + + + Left + + + Tip: right-click supported controls for presets. + + + Button mappings + + + Double-click a row to change its action. + + + Show live preview + + + LIST ONLY + + + Special Actions + + + L2/R2 + + + Made with Trigger Lab + + + This protected profile effect overrides incoming game adaptive-trigger output. Edit it in Trigger Lab. + + + PROTECTED + + + Controller Readings + + + LS + + + Force + + + units + + + ms + + + Invert + + + sec. + + + This button is reserved for calibration while the left stick uses Flick Stick. + + + Save the profile, then tap the selected button in-game for a 360° mouse-look turn. Active only in Flick Stick mode. + + + Increase Real World Calibration if the turn falls short; decrease it if the turn goes too far. Choose Not assigned to release the button. + + + RS + + + Rotation: + + + This button is reserved for calibration while the right stick uses Flick Stick. + + + L2 & R2 + + + X + + + Z + + + R + + + G + + + B + + + Empty + + + Flash at + + + Pulse at + + + While Charging: + + + Pulse + + + Rainbow + + + Color by Battery % + + + secs/cycle + + + Jitter Compensation + + + Double Tap + + + Lower Right as RMB + + + Passthru Click Action (DS4 mode) + + + Start with Slide/Scroll Off + + + Min Threshold + + + Trackball + + + Friction: + + + Y + + + X+Y + + + Disable Invert + + + Finger on Touchpad + + + PS + + + Touchpad Click + + + Side L + + + Side R + + + Swipe Up + + + Swipe Down + + + Swipe Left + + + Swipe Right + + + Output Stick + + + Output Axes + + + Horizontal and Vertical + + + Horizontal Only + + + Vertical Only + + + Minimum X + + + Minimum Y + + + Invert X + + + Invert Y + + + Smoothing + + + Smoothing Options + + + Max Zone X: + + + Max Zone Y: + + + Snap To Center on Release: + + + Tilt Up + + + Tilt Down + + + Tilt Left + + + Tilt Right + + + Triggers + + + Turn Behavior - Turns Gyro + + + Eval Cond. + + + And + + + Or + + + Steering wheel axis + + + Left X-Axis + + + Left Y-Axis + + + Right X-Axis + + + Right Y-Axis + + + Trigger L+R Axis + + + VJoy1 X-Axis + + + VJoy1 Y-Axis + + + VJoy1 Z-Axis + + + VJoy2 X-Axis + + + VJoy2 Y-Axis + + + VJoy2 Z-Axis + + + Steering wheel range + + + Calibrate + + + Gyro Calibration + + + Gyro Sensitivity: + + + X Axis + + + Weighted Average + + + Smooth Weight + + + X-Axis + + + Weight + + + deg/sec. + + + Delay Time + + + Trigger Lab + + + Nintendo Options + + + These settings are saved with the profile and apply to controllers that support them. + + + How do you want to play? + + + Point at menus. Aim by tilting. Feel the game. Start with what you want to do; fine-tuning is tucked inside each section. + + + Saved with this profile for any controller. Features your controller doesn't support have no effect. Desk mouse and motion aiming are separate features. + + + Mouse on a desk + + + Slide a Joy-Con to point or aim. Use its stick to scroll. + + + Slide a Joy-Con to move the mouse + + + Move a Joy-Con across a surface to control the mouse pointer. + + + Place the sensor edge against a desk or mouse mat, then slide the Joy-Con. Lifting it lets you reposition without moving the pointer. + + + Slide to aim or point at menus. Use the stick to scroll while the sensor touches the surface. + + + Assign mouse clicks in Button Mapping. For different actions only while on the desk, use the matching IR Sensor as the Shift Modifier. + + + Which Joy-Con: + + + Automatic + + + Both + + + Stick scroll: + + + Choose whether the stick scrolls vertically only or in all four directions. + + + Up / Down + + + Four-way + + + Left sensitivity: + + + Right sensitivity: + + + Surface detection + + + Try Relaxed if your surface is not detected. These settings also affect surface-triggered button actions and aiming. + + + Left surface detection: + + + Strict + + + Relaxed + + + Right surface detection: + + + Aim by tilting + + + Fine aim with your hands, with or without a mouse pointer. + + + Choose what tilting does + + + Mapped tilt buttons (no mouse) + + + Mouse pointer + + + Virtual aiming stick + + + Quick-tilt actions + + + Game's own motion controls + + + When to aim: + + + Always on + + + Hold ZL / L2 + + + Hold ZR / R2 + + + Custom — see Gyro settings + + + Trigger choices follow your button layout. Custom combinations and toggle-to-aim are available in Gyro settings. + + + Mouse aiming speed: + + + Open full Gyro settings… + + + Choose aim buttons, stick output, sensitivity and smoothing. + + + Fine-tune aiming + + + Reduce sideways gyro drift + + + Help reduce sideways gyro drift. Turn this off if nearby electronics affect aiming. + + + Ignore tiny gyro movements to steady aim. Set to 0 for maximum sensitivity. + + + Ignore small movements: + + + Use the stick alongside gyro aiming to turn further. Set to 0 to turn this off. + + + Stick-assisted aiming: + + + Smoother mouse movement + + + Make mouse movement smoother between controller updates. This does not speed up the controller itself. + + + Adjust sideways motion sensitivity in compatible emulators. 1 is the normal level. + + + Emulator turn sensitivity: + + + Keep motion aiming level + + + Keep motion aiming level when you tilt the controller. + + + Pause aiming with a button + + + Pause motion aiming with a button so you can reposition the controller. + + + Hold to pause aiming, or press to toggle the pause. The pause clears when you stop using gyro. + + + Aiming settings to edit: + + + Hold-to-lock buttons: + + + Press-to-toggle lock buttons: + + + Steady aim around button presses + + + Reduce aim movement caused by pressing or releasing buttons. + + + Fine-tune a mode you have already enabled above. These choices do not switch your aiming output. + + + activation source: + + + Buttons that steady aim: + + + Deadzone: + + + press pause: + + + Release pause: + + + deadzone after release: + + + Buttons that slow aim: + + + Dampening: + + + after release: + + + Steady aiming when touching a desk + + + Choose the left or right IR Sensor in the Gyro trigger menu to aim while touching a surface. + + + Pause aiming around button presses, ignore small movements, or reduce sensitivity while a button is held. + + + Left optical sensor + + + Deadzone / click-stabilization buttons: + + + Dampening buttons: + + + Right optical sensor + + + Dual Joy-Con aiming + + + Let your two hands share the aim, or switch between them. + + + Aim with both Joy-Cons (DJG) + + + Let a joined pair share motion aiming. Turn off to use the normal single motion source. + + + Choose which hand supplies motion. This does not pair your Joy-Cons or turn on mouse aiming. + + + For mouse or stick aiming, start with Aim by tilting → When to aim: Always on. Choosing a button there adds a separate on/off control; it does not choose a hand. + + + Set up motion aiming… + + + Choose how the two hands work together + + + Lead hand, side switching and pause buttons. + + + Mode: + + + Both hands — switch lead hand + + + One hand at a time + + + Both hands — pause each side + + + Preferred aiming hand: + + + Choose the hand that leads your aim, or combine both when pausing each side separately. + + + Combine both + + + Button behavior: + + + While held + + + Press to toggle + + + Left Joy-Con buttons + + + Right Joy-Con buttons + + + Feel game feedback + + + Feel impacts, textures and trigger effects as HD rumble. + + + Adjust overall rumble strength. 100% is the normal level; 0% turns body rumble off. + + + Body rumble strength: + + + Include Xbox trigger rumble + + + Feel Xbox trigger vibrations on the matching side of your controller. Shares the setting in Advanced. + + + Vary trigger rumble feel + + + Change the feel of trigger rumble as its strength changes. + + + Trigger rumble strength: + + + Fixed rumble feel: + + + Include detailed DualSense vibrations + + + Turn detailed DualSense vibrations into left and right HD rumble. + + + Include DualSense trigger effects + + + Turn DualSense trigger effects into vibrations. Switch 2 triggers cannot add physical resistance. + + + Use Xbox-style body rumble + + + Give body rumble a consistent Xbox-style feel instead of following each game's vibration detail. + + + Body rumble feel: + + + Delay rumble to match delayed game audio. Leave at 0 for the quickest response. + + + Game rumble delay: + + + Listen and chat through your Switch 2 Pro's headphone jack. + + + Audio goes directly through Windows. It works independently of your chosen virtual controller; no DS4Windows audio toggle is needed. + + + USB only. Bluetooth headset audio is not supported yet. A regular AUX cable carries sound out, but cannot test the headset microphone. + + + Give buttons a second job + + + Hold or toggle a button to access another set of actions. + + + Example: keep a button’s usual action, then give it a different job while you hold another button. + + + Action set to edit: + + + Press a button to switch actions: + + + The shortcut opens Shift Modifier for you. For a new second action, Switch 2 Mode Shift is already selected. Existing shift triggers are kept. + + + Edit second action… + + + Open Button Mapping + + + Choose the action in the window, then save this profile. A shift button is reserved for switching actions, so its normal game action is not sent. + + + Automatic second actions (optional) + + + When enabled below, aiming starts in second actions. Your hold or toggle buttons switch back to normal actions instead. These options do not enable aiming. + + + Automatically start in second actions while: + + + Mouse aiming is active + + + Stick aiming is active + + + Motion steering + + + Point, scroll or tap with a stick + + + Fine-tune sticks you have assigned to mouse or button actions. + + + Stick scrolling + + + Assign scroll actions in Button Mapping first. Tap scrolls once; Hold keeps scrolling. + + + Left stick: + + + Hold + + + Right stick: + + + Stick button actions + + + Hold keeps an action pressed. Tap triggers it once each time you move the stick into that direction. + + + Left stick + + + Right stick + + + Stick mouse speed + + + Adjust speed for sticks mapped to mouse movement. 5 is the normal speed; 0 stops movement. + + + Layout & battery + + + Match your button labels, hold a single Joy-Con sideways, or save battery. + + + Xbox follows button positions. Nintendo follows the printed A, B, X and Y labels. + + + Face-button layout: + + + Xbox + + + Nintendo + + + Joy-Con holding style: + + + Choose the starting orientation. A choice made on the Controllers tab takes priority for that Joy-Con. + + + Upright + + + Sideways + + + Automatic Bluetooth disconnect + + + Disconnect after inactivity to save battery, or after a set time even while playing. + + + When idle + + + After a set time + + + Disconnect after: + + + day + + + hour + + + minute + + + Set the duration to zero to disable the timer. Until changed here, existing profiles keep their Idle Disconnect setting. + + + Vibrate when connected + + + Play a short vibration when the controller is ready. + + + Correct drift & stick range + + + Use guided calibration if a stick feels off or the aim drifts. + + + Stick calibration + + + Follow the guided steps to correct stick centers and range. Factory settings stay unchanged. + + + Calibrate sticks… + + + Place the controller on a stable surface and leave it still for at least five seconds after starting. + + + Restart gyro calibration + + + Correct gyro drift. Keep the controller still for at least five seconds. + + + Slowly rotate the controller in a figure-eight. Game input pauses during calibration. + + + Calibrate drift correction + + + Use this if sideways drift correction feels inaccurate. + + + Advanced + + + Xbox 360 + + + Xbox One / Series + + + A + + + Nintendo face layout + + + Plus, Minus, Home, Capture, L/R, ZL/ZR + + + Debouncing + + + Translate Xbox impulse-trigger vibration + + + Feel Xbox trigger vibrations through your controller's triggers or rumble motors. Works independently of Trigger Lab. + + + Send impulse vibration to adaptive triggers + + + DualSense and Edge: use adaptive triggers for Xbox impulse vibration. Turn off to use body rumble. Requires impulse translation above. + + + PlayStation controller features + + + DualSense haptics + + + Mutes the built-in speaker while continuing the same stream through a headset connected to the controller's AUX port. + + + Mute controller speaker with mute button + + + When Mute Button Mutes Input/Output is enabled, a lit mute LED turns off controller-speaker output. The setting has no effect while the master toggle is off. + + + Audio source: + + + For game audio, select the virtual Wireless Controller endpoint created by a VIIPER PlayStation output. The first stereo pair is mirrored to the physical controller speaker. + + + Audio Haptics is currently supplying the selected app to this controller. Choose another Audio source here to release that override. + + + USB DualSense speaker: + + + Only used for a physical USB DualSense. Bluetooth controllers stream audio directly to the controller. + + + Speaker volume: + + + Dynamic range: + + + Bluetooth speaker processing. Balanced raises quieter details and restrains loud effects. Strong narrows the range further. Processing is applied before native encoding (Opus on DualSense, SBC on DualShock 4) without look-ahead latency. + + + Bass/body boost: + + + Adds up to 6 dB around 200 Hz while filtering unusable sub-bass. Applies only to the Bluetooth controller speaker stream. + + + Mute controller microphone with mute button + + + When Mute Button Mutes Input/Output is enabled, a lit mute LED turns off controller-microphone input. The setting has no effect while the master toggle is off. + + + Microphone level: + + + Adjusts the physical microphone level and the safely trimmed signal exposed to Windows. + + + Noise suppression: + + + Balanced applies RNNoise speech cleanup. Strong also reduces low-level residual noise. Off retains only gain, high-pass, and clipping protection. + + + Advanced audio + + + Headset / AUX volume: + + + Controls the headset jack independently from the controller speaker. DualShock 4 maps the full slider range to Sony's documented 0-80 headset gain. + + + USB/legacy microphone routing captures the physical Windows controller-mic endpoint and sends it to a virtual audio render device such as VB-CABLE Input. Bluetooth VIIPER microphone routing does not need these endpoints. + + + Controller mic: + + + Virtual output: + + + DualSense mute button + + + Mute Button Mutes Input/Output + + + Uses the controller mute button as a master for the speaker and microphone targets selected above. The mute LED is on while those targets are muted and off while they are live. + + + Enable mute button light + + + Mirrors the physical DualSense mute button state to the controller mute LED while this profile is active. This only controls the light, not Windows microphone routing. + + + Mute button switches profiles + + + Switches between the selected profiles when mute changes. Enabling Mute Button Mutes Input/Output turns this option off and greys it out without erasing the saved profile choices. + + + Mute on profile: + + + Optional. Switch to this profile when the physical DualSense mute button toggles on. + + + Leave blank to avoid changing profiles when mute turns on. + + + Mute off profile: + + + Optional. Switch to this profile when the physical DualSense mute button toggles off. + + + Leave blank to avoid changing profiles when mute turns off. + + + for readout + + + Game Bar + + + Enable Game Bar controller compatibility + + + While Xbox Game Bar is visible, temporarily route this profile's mapped input through an Xbox-compatible controller. The selected profile and native DualSense output stay configured. + + + Keeps this profile and its native output active. Only mapped input is temporarily sent through an Xbox-compatible companion while Game Bar is open; audio, haptics, lighting, and microphone routing stay untouched. + + + mins + + + Max (1 ms) + + + Show live preview + + + See what your controller is sending while you choose an action. + + + Upper Touch + + + Sixaxis Up + + + Sixaxis Down + + + Sixaxis Left + + + Sixaxis Right + + + DSE Function Left + + + DSE Function Right + + + DSE Left Paddle + + + DSE Right Paddle + + + Switch 2 Joy-Con Left IR Sensor + + + Switch 2 Joy-Con Right IR Sensor + + + Switch 2 Mode Shift + + + Switch 2 Joy-Con Left SL + + + Switch 2 Joy-Con Left SR + + + Switch 2 Joy-Con Right SL + + + Switch 2 Joy-Con Right SR + + + Switch 2 C / Chat + + + D + + + E + + + F + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + S + + + T + + + U + + + V + + + W + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Tab + + + Esc + + + Prt + + + Del + + + RCtrl + + + Brk + + + Ins + + + NumLk + + + Home + + + BkSpace + + + Space + + + LAlt + + + End + + + LCtrl + + + RShift + + + PgUp + + + Scl + + + LWin + + + RAlt + + + Enter + + + LShift + + + RWin + + + PgDown + + + Caps + + + R → + + + Overview + + + General + + + Refresh + + + Ping + + + Time + + + Data + + + Right click to disconnect wireless + + + Use the same profile whenever this physical controller reconnects. + + + JOY-CON HOLD + + + IDENTIFY + + + Vibrate this controller so you can tell which one it is. + + + LIGHTBAR + + + Choose a temporary lightbar color + + + Your profiles + + + Select a profile for actions, or double-click a card to edit it. + + + Search profiles by name + + + Clear search + + + P + + + Controller profile + + + No profiles yet + + + Create or import a profile to get started. + + + Loading profile editor + + + Applying the profile and preparing its controls... + + + Startup, notifications, charging, appearance, and update behavior used by most players. + + + Prevents games from seeing both the physical controller and its virtual output. HidHide is recommended on current Windows versions. + + + Reclaim controller from Steam Input automatically + + + Cloaks the physical controller with HidHide, then safely restarts only its HID collection so Steam releases any handle it opened first. The virtual controller remains available to games. + + + Choose which profiles the two-finger swipe is allowed to switch between + + + Choose whether DS4Windows should open when you sign in to Windows. If setup is pending, your choice is saved and the message below explains the next step. + + + Disconnect Bluetooth controllers when the DS4Windows service is stopped. + + + Open DS4Windows quietly without showing the main window. + + + Verbose logging + + + Writes detailed diagnostic markers to the log. Disable after testing. + + + Periodically check GitHub for a newer DS4Windows release. + + + Advanced settings + + + Network servers, compatibility overrides, device registration, diagnostics, and maintenance tools. Defaults are best for most users. + + + Support DS4Windows + + + Help fund controller hardware, testing, and development. + + + VIIPER Virtual Controller Support + + + VIIPER status unknown + + + Install / Repair VIIPER + + + Required for VIIPER outputs: DualSense, DualSense Edge, Switch 2 Pro, DS4, Xbox 360, and Xbox One / Series over USB/IP. + + + Prompt me when VIIPER needs setup + + + Turn this off to suppress automatic VIIPER setup prompts. Install / Repair and Refresh remain available here. + + + Switch 2 wireless controllers + + + Hold the controller’s sync button until its lights flash, then select it below. Controllers you have already added reconnect when you wake them. + + + Joy-Cons are automatically paired + + + Join available left and right Joy-Cons into one controller. A Joy-Con on its own still works separately. + + + Refresh to check Bluetooth discovery status. + + + Add controller + + + Join Joy-Cons + + + Each Joy-Con works on its own. To join two, select them here or use their link buttons on the Controllers tab. + + + No unmatched Joy-Con 2 connections have been observed yet. + + + Left Joy-Con 2 + + + Right Joy-Con 2 + + + Join selected Joy-Con 2 pair + + + Use selected left separately + + + Use selected right separately + + + UNMATCHED JOY-CON 2 + + + Click Link on one Joy-Con, then Link on the other. The first controller keeps its profile and virtual pad. + + + Game mod support (DSX) + + + Let game mods control triggers and lights + + + For compatible DSX game mods on this PC and a DualSense or DualSense Edge. Trigger Lab takes priority on each trigger you enable. This does not stream audio haptics. + + + Connection details + + + Use the same address and port in your mod. Most mods use 127.0.0.1 and port 6969. Close DSX or another listener using that port first. + + + This PC address + + + Apply / Retry + + + DS4Windows + Controller companion + Connect a controller to begin + NAVIGATION + Profile Editor + P + Focused workspace + EDITING PROFILE + PROFILE WORKSPACE + Back to Profiles + Cancel editing and return to the profile list + Button Mapping + Buttons, sticks, touch gestures, and shortcuts + Macros, launches, shifts, and multi-actions + Live inputs and calibration + Sticks, triggers, dead zones, and curves + Color, battery, flash, and charging + Mouse, gestures, passthrough, and positioning + Motion aiming, steering, and swipes + Turn system or app audio into advanced haptics + Build persistent adaptive-trigger effects + HD rumble, motion, optical mouse, and calibration + Output, rumble, latency, and compatibility + Service events without leaving the editor + + LX (I): + LX (O): + LY (I): + LY (O): + RX (I): + RX (O): + RY (I): + RY (O): + X (I): + X (O): + Z (I): + Z (O): + I: + O: + TX: + TY: + + Name: + Check the buttons that start this action. Multiple buttons must be held together. + Check the buttons that end this action or return to the previous profile. + Launch Program + secs + Arguments + Load Profile + Press Key + DisBT + Check Battery + MultiAct + Sixaxis Wheel + + Accept Moonlight / Sunshine virtual controllers + Accept every supported virtual controller created while Sunshine is running. DS4Windows' own VIIPER outputs are always excluded. + DS4 + Switch Pro + JoyCon + + Device + Window title... + Search by profile, window title, executable, or path + DEVICE + + FakerInput + CRC32 + H.NotifyIcon + vJoyInterfaceCS + + X — Y — + + Required virtual-controller backend. DS4Windows requests administrator access and installs VIIPER plus usbip-win2 for you. + + Cycle Programs + From File... + + Finished + Select Preset + Enable Sunshine direct controller bridge + Let Sunshine send controller input directly to DS4Windows. DS4Windows will create the game-facing virtual controller; no Sunshine virtual input controller is created. Enable the matching option in Sunshine too. + Repair updates your existing installation. Your profiles and settings are kept. + Install / Repair + \ No newline at end of file diff --git a/DS4WindowsTests/RuntimeXamlTranslatorTests.cs b/DS4WindowsTests/RuntimeXamlTranslatorTests.cs new file mode 100644 index 00000000..70c7c617 --- /dev/null +++ b/DS4WindowsTests/RuntimeXamlTranslatorTests.cs @@ -0,0 +1,112 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Runtime.ExceptionServices; +using System.Threading; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Markup; +using System.Windows.Threading; +using DS4WinWPF.DS4Forms; +using DS4WinWPF.Translations; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DS4WindowsTests; + +[TestClass] +[DoNotParallelize] +public class RuntimeXamlTranslatorTests +{ + private const string Markup = @" + +