Compare commits

..

1 Commits

Author SHA1 Message Date
GabCoolGuy
a560d2efdb UI: Added missing french locales/Translated french locales (#415)
Custom refresh rate locales and fixed a couple others too
2024-12-23 15:43:06 -06:00
5 changed files with 61 additions and 331 deletions

View File

@@ -1,7 +1,6 @@
using Ryujinx.SDL2.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static SDL2.SDL;
@@ -12,7 +11,7 @@ namespace Ryujinx.Input.SDL2
private readonly Dictionary<int, string> _gamepadsInstanceIdsMapping;
private readonly List<string> _gamepadsIds;
private readonly Lock _lock = new();
private readonly SDL2JoyConPair joyConPair;
public ReadOnlySpan<string> GamepadsIds
{
get
@@ -37,7 +36,7 @@ namespace Ryujinx.Input.SDL2
SDL2Driver.Instance.Initialize();
SDL2Driver.Instance.OnJoyStickConnected += HandleJoyStickConnected;
SDL2Driver.Instance.OnJoystickDisconnected += HandleJoyStickDisconnected;
joyConPair = new SDL2JoyConPair();
// Add already connected gamepads
int numJoysticks = SDL_NumJoysticks();
@@ -90,10 +89,6 @@ namespace Ryujinx.Input.SDL2
lock (_lock)
{
_gamepadsIds.Remove(id);
if (joyConPair.GetJoyConPair(_gamepadsIds) == null)
{
_gamepadsIds.Remove(joyConPair.Id);
}
}
OnGamepadDisconnected?.Invoke(id);
@@ -125,12 +120,8 @@ namespace Ryujinx.Input.SDL2
_gamepadsIds.Insert(joystickDeviceId, id);
else
_gamepadsIds.Add(id);
if (joyConPair.GetJoyConPair(_gamepadsIds) != null)
{
_gamepadsIds.Remove(joyConPair.Id);
_gamepadsIds.Add(joyConPair.Id);
}
}
OnGamepadConnected?.Invoke(id);
}
}
@@ -166,11 +157,6 @@ namespace Ryujinx.Input.SDL2
public IGamepad GetGamepad(string id)
{
if (id == joyConPair.Id)
{
return joyConPair.GetJoyConPair(_gamepadsIds);
}
int joystickIndex = GetJoystickIndexByGamepadId(id);
if (joystickIndex == -1)

View File

@@ -1,229 +0,0 @@
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using static SDL2.SDL;
namespace Ryujinx.Input.SDL2
{
internal class SDL2JoyConPair : IGamepad
{
private IGamepad _left;
private IGamepad _right;
private StandardControllerInputConfig _configuration;
private readonly StickInputId[] _stickUserMapping = new StickInputId[(int)StickInputId.Count]
{
StickInputId.Unbound,
StickInputId.Left,
StickInputId.Right,
};
private readonly record struct ButtonMappingEntry(GamepadButtonInputId To, GamepadButtonInputId From)
{
public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not GamepadButtonInputId.Unbound;
}
private readonly List<ButtonMappingEntry> _buttonsUserMapping;
public SDL2JoyConPair()
{
_buttonsUserMapping = new List<ButtonMappingEntry>(20);
}
private readonly object _userMappingLock = new();
public GamepadFeaturesFlag Features => (_left?.Features ?? GamepadFeaturesFlag.None) | (_right?.Features ?? GamepadFeaturesFlag.None);
public string Id => "JoyConPair";
public string Name => "Nintendo Switch Joy-Con (L/R)";
private static readonly string leftName = "Nintendo Switch Joy-Con (L)";
private static readonly string rightName = "Nintendo Switch Joy-Con (R)";
public bool IsConnected => (_left != null && _left.IsConnected) && (_right != null && _right.IsConnected);
public void Dispose()
{
_left?.Dispose();
_right?.Dispose();
}
public GamepadStateSnapshot GetMappedStateSnapshot()
{
GamepadStateSnapshot rawState = GetStateSnapshot();
GamepadStateSnapshot result = default;
lock (_userMappingLock)
{
if (_buttonsUserMapping.Count == 0)
return rawState;
// ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
foreach (ButtonMappingEntry entry in _buttonsUserMapping)
{
if (!entry.IsValid)
continue;
// Do not touch state of button already pressed
if (!result.IsPressed(entry.To))
{
result.SetPressed(entry.To, rawState.IsPressed(entry.From));
}
}
(float leftStickX, float leftStickY) = rawState.GetStick(_stickUserMapping[(int)StickInputId.Left]);
(float rightStickX, float rightStickY) = rawState.GetStick(_stickUserMapping[(int)StickInputId.Right]);
result.SetStick(StickInputId.Left, leftStickX, leftStickY);
result.SetStick(StickInputId.Right, rightStickX, rightStickY);
}
return result;
}
public Vector3 GetMotionData(MotionInputId inputId)
{
return inputId switch
{
MotionInputId.SecondAccelerometer => _right.GetMotionData(MotionInputId.Accelerometer),
MotionInputId.SecondGyroscope => _right.GetMotionData(MotionInputId.Gyroscope),
_ => _left.GetMotionData(inputId)
};
}
public GamepadStateSnapshot GetStateSnapshot()
{
return IGamepad.GetStateSnapshot(this);
}
public (float, float) GetStick(StickInputId inputId)
{
if (inputId == StickInputId.Left)
{
(float x, float y) = _left.GetStick(StickInputId.Left);
return (y, -x);
}
else if (inputId == StickInputId.Right)
{
(float x, float y) = _right.GetStick(StickInputId.Left);
return (-y, x);
}
return (0, 0);
}
public bool IsPressed(GamepadButtonInputId inputId)
{
return inputId switch
{
GamepadButtonInputId.LeftStick => _left.IsPressed(GamepadButtonInputId.LeftStick),
GamepadButtonInputId.DpadUp => _left.IsPressed(GamepadButtonInputId.Y),
GamepadButtonInputId.DpadDown => _left.IsPressed(GamepadButtonInputId.A),
GamepadButtonInputId.DpadLeft => _left.IsPressed(GamepadButtonInputId.B),
GamepadButtonInputId.DpadRight => _left.IsPressed(GamepadButtonInputId.X),
GamepadButtonInputId.Minus => _left.IsPressed(GamepadButtonInputId.Start),
GamepadButtonInputId.LeftShoulder => _left.IsPressed(GamepadButtonInputId.Paddle2),
GamepadButtonInputId.LeftTrigger => _left.IsPressed(GamepadButtonInputId.Paddle4),
GamepadButtonInputId.SingleRightTrigger0 => _left.IsPressed(GamepadButtonInputId.LeftShoulder),
GamepadButtonInputId.SingleLeftTrigger0 => _left.IsPressed(GamepadButtonInputId.RightShoulder),
GamepadButtonInputId.RightStick => _right.IsPressed(GamepadButtonInputId.LeftStick),
GamepadButtonInputId.A => _right.IsPressed(GamepadButtonInputId.B),
GamepadButtonInputId.B => _right.IsPressed(GamepadButtonInputId.Y),
GamepadButtonInputId.X => _right.IsPressed(GamepadButtonInputId.A),
GamepadButtonInputId.Y => _right.IsPressed(GamepadButtonInputId.X),
GamepadButtonInputId.Plus => _right.IsPressed(GamepadButtonInputId.Start),
GamepadButtonInputId.RightShoulder => _right.IsPressed(GamepadButtonInputId.Paddle1),
GamepadButtonInputId.RightTrigger => _right.IsPressed(GamepadButtonInputId.Paddle3),
GamepadButtonInputId.SingleRightTrigger1 => _right.IsPressed(GamepadButtonInputId.LeftShoulder),
GamepadButtonInputId.SingleLeftTrigger1 => _right.IsPressed(GamepadButtonInputId.RightShoulder),
_ => false
};
}
public void Rumble(float lowFrequency, float highFrequency, uint durationMs)
{
if (lowFrequency != 0)
{
_right.Rumble(lowFrequency, lowFrequency, durationMs);
}
if (highFrequency != 0)
{
_left.Rumble(highFrequency, highFrequency, durationMs);
}
if (lowFrequency == 0 && highFrequency == 0)
{
_left.Rumble(lowFrequency, highFrequency, durationMs);
_right.Rumble(lowFrequency, highFrequency, durationMs);
}
}
public void SetConfiguration(InputConfig configuration)
{
lock (_userMappingLock)
{
_configuration = (StandardControllerInputConfig)configuration;
_left.SetConfiguration(configuration);
_right.SetConfiguration(configuration);
_buttonsUserMapping.Clear();
// First update sticks
_stickUserMapping[(int)StickInputId.Left] = (StickInputId)_configuration.LeftJoyconStick.Joystick;
_stickUserMapping[(int)StickInputId.Right] = (StickInputId)_configuration.RightJoyconStick.Joystick;
// Then left joycon
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftStick, (GamepadButtonInputId)_configuration.LeftJoyconStick.StickButton));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadUp, (GamepadButtonInputId)_configuration.LeftJoycon.DpadUp));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadDown, (GamepadButtonInputId)_configuration.LeftJoycon.DpadDown));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadLeft, (GamepadButtonInputId)_configuration.LeftJoycon.DpadLeft));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadRight, (GamepadButtonInputId)_configuration.LeftJoycon.DpadRight));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Minus, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonMinus));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftShoulder, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonL));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftTrigger, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonZl));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger0, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonSr));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger0, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonSl));
// Finally right joycon
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightStick, (GamepadButtonInputId)_configuration.RightJoyconStick.StickButton));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.A, (GamepadButtonInputId)_configuration.RightJoycon.ButtonA));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.B, (GamepadButtonInputId)_configuration.RightJoycon.ButtonB));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.X, (GamepadButtonInputId)_configuration.RightJoycon.ButtonX));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Y, (GamepadButtonInputId)_configuration.RightJoycon.ButtonY));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Plus, (GamepadButtonInputId)_configuration.RightJoycon.ButtonPlus));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightShoulder, (GamepadButtonInputId)_configuration.RightJoycon.ButtonR));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightTrigger, (GamepadButtonInputId)_configuration.RightJoycon.ButtonZr));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger1, (GamepadButtonInputId)_configuration.RightJoycon.ButtonSr));
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger1, (GamepadButtonInputId)_configuration.RightJoycon.ButtonSl));
SetTriggerThreshold(_configuration.TriggerThreshold);
}
}
public void SetTriggerThreshold(float triggerThreshold)
{
_left.SetTriggerThreshold(triggerThreshold);
_right.SetTriggerThreshold(triggerThreshold);
}
public SDL2JoyConPair GetJoyConPair(List<string> _gamepadsIds)
{
this.Dispose();
var gamepadNames = _gamepadsIds.Where(gamepadId => gamepadId != Id).Select((gamepadId, index) => SDL_GameControllerNameForIndex(index)).ToList();
int leftIndex = gamepadNames.IndexOf(leftName);
int rightIndex = gamepadNames.IndexOf(rightName);
if (leftIndex != -1 && rightIndex != -1)
{
nint leftGamepadHandle = SDL_GameControllerOpen(leftIndex);
nint rightGamepadHandle = SDL_GameControllerOpen(rightIndex);
_left = new SDL2Gamepad(leftGamepadHandle, _gamepadsIds[leftIndex]);
_right = new SDL2Gamepad(rightGamepadHandle, _gamepadsIds[leftIndex]);
return this;
}
return null;
}
}
}

View File

@@ -266,7 +266,6 @@ namespace Ryujinx.Input.HLE
if (motionConfig.MotionBackend != MotionInputBackendType.CemuHook)
{
_leftMotionInput = new MotionInput();
_rightMotionInput = new MotionInput();
}
else
{
@@ -299,20 +298,7 @@ namespace Ryujinx.Input.HLE
if (controllerConfig.ControllerType == ConfigControllerType.JoyconPair)
{
if (gamepad.Id== "JoyConPair")
{
Vector3 rightAccelerometer = gamepad.GetMotionData(MotionInputId.SecondAccelerometer);
Vector3 rightGyroscope = gamepad.GetMotionData(MotionInputId.SecondGyroscope);
rightAccelerometer = new Vector3(rightAccelerometer.X, -rightAccelerometer.Z, rightAccelerometer.Y);
rightGyroscope = new Vector3(rightGyroscope.X, -rightGyroscope.Z, rightGyroscope.Y);
_rightMotionInput.Update(rightAccelerometer, rightGyroscope, (ulong)PerformanceCounter.ElapsedNanoseconds / 1000, controllerConfig.Motion.Sensitivity, (float)controllerConfig.Motion.GyroDeadzone);
}
else
{
_rightMotionInput = _leftMotionInput;
}
_rightMotionInput = _leftMotionInput;
}
}
}
@@ -347,7 +333,6 @@ namespace Ryujinx.Input.HLE
// Reset states
State = default;
_leftMotionInput = null;
_rightMotionInput = null;
}
}

View File

@@ -21,17 +21,5 @@ namespace Ryujinx.Input
/// </summary>
/// <remarks>Values are in degrees</remarks>
Gyroscope,
/// <summary>
/// Second accelerometer.
/// </summary>
/// <remarks>Values are in m/s^2</remarks>
SecondAccelerometer,
/// <summary>
/// Second gyroscope.
/// </summary>
/// <remarks>Values are in degrees</remarks>
SecondGyroscope
}
}

View File

@@ -701,7 +701,7 @@
"el_GR": "",
"en_US": "Scan An Amiibo (From Bin)",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Scanner un Amiibo (à partir d'un .bin)",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -749,7 +749,7 @@
"el_GR": "Εγκατάσταση Firmware",
"en_US": "Install Firmware",
"es_ES": "Instalar firmware",
"fr_FR": "Installer un firmware",
"fr_FR": "Installer le firmware",
"he_IL": "התקן קושחה",
"it_IT": "Installa firmware",
"ja_JP": "ファームウェアをインストール",
@@ -821,7 +821,7 @@
"el_GR": "",
"en_US": "Install Keys",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Installer des clés",
"he_IL": "",
"it_IT": "Installa Chiavi",
"ja_JP": "",
@@ -845,7 +845,7 @@
"el_GR": "",
"en_US": "Install keys from KEYS or ZIP",
"es_ES": "Instalar keys de KEYS o ZIP",
"fr_FR": "",
"fr_FR": "Installer des clés à partir de .KEYS or .ZIP",
"he_IL": "",
"it_IT": "Installa Chiavi da file KEYS o ZIP",
"ja_JP": "",
@@ -869,7 +869,7 @@
"el_GR": "",
"en_US": "Install keys from a directory",
"es_ES": "Instalar keys de un directorio",
"fr_FR": "",
"fr_FR": "Installer des clés à partir d'un dossier",
"he_IL": "",
"it_IT": "Installa Chiavi da una Cartella",
"ja_JP": "",
@@ -3221,7 +3221,7 @@
"el_GR": "ΗΠΑ",
"en_US": "USA",
"es_ES": "EEUU",
"fr_FR": "",
"fr_FR": "États-Unis",
"he_IL": "ארה\"ב",
"it_IT": "Stati Uniti d'America",
"ja_JP": "アメリカ",
@@ -3845,7 +3845,7 @@
"el_GR": "",
"en_US": "Resync to PC Date & Time",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Resynchronier la Date à celle du PC",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -4061,7 +4061,7 @@
"el_GR": "Μικροδιορθώσεις",
"en_US": "Hacks",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Hacks",
"he_IL": "האצות",
"it_IT": "Espedienti",
"ja_JP": "ハック",
@@ -4613,7 +4613,7 @@
"el_GR": "",
"en_US": "4x (2880p/4320p) (Not recommended)",
"es_ES": "4x (2880p/4320p) (no recomendado)",
"fr_FR": "4x (2880p/4320p) (Non recommandé)",
"fr_FR": "x4 (2880p/4320p) (Non recommandé)",
"he_IL": "4x (2880p/4320p) (לא מומלץ)",
"it_IT": "4x (2880p/4320p) (Non consigliato)",
"ja_JP": "4x (2880p/4320p) (非推奨)",
@@ -4637,7 +4637,7 @@
"el_GR": "Αναλογία Απεικόνισης:",
"en_US": "Aspect Ratio:",
"es_ES": "Relación de aspecto:",
"fr_FR": "Format d'affichage :",
"fr_FR": "Format d'affichage :",
"he_IL": "יחס גובה-רוחב:",
"it_IT": "Rapporto d'aspetto:",
"ja_JP": "アスペクト比:",
@@ -10301,7 +10301,7 @@
"el_GR": "",
"en_US": "View Profile",
"es_ES": "Ver perfil",
"fr_FR": "",
"fr_FR": "Voir Profil",
"he_IL": "",
"it_IT": "Visualizza profilo",
"ja_JP": "",
@@ -11237,20 +11237,20 @@
"el_GR": "Αποτυχία μετατροπής της ληφθείσας έκδοσης Ryujinx από την έκδοση GitHub.",
"en_US": "Failed to convert the Ryujinx version received from GitHub.",
"es_ES": "No se pudo convertir la versión de Ryujinx recibida de GitHub Release.",
"fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis Github Release.",
"fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis GitHub Release.",
"he_IL": "המרת גרסת ריוג'ינקס שהתקבלה מ-עדכון הגרסאות של גיטהב נכשלה.",
"it_IT": "La conversione della versione di Ryujinx ricevuta da Github Release è fallita.",
"it_IT": "La conversione della versione di Ryujinx ricevuta da GitHub Release è fallita.",
"ja_JP": "Github から取得した Ryujinx バージョンの変換に失敗しました.",
"ko_KR": "GitHub에서 받은 Ryujinx 버전을 변환하지 못했습니다.",
"no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra Github Utgivelse.",
"no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra GitHub Utgivelse.",
"pl_PL": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.",
"pt_BR": "Falha ao converter a versão do Ryujinx recebida do AppVeyor.",
"ru_RU": "Не удалось преобразовать полученную версию Ryujinx из Github Release.",
"th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก Github Release",
"ru_RU": "Не удалось преобразовать полученную версию Ryujinx из GitHub Release.",
"th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก GitHub Release",
"tr_TR": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.",
"uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску Github.",
"zh_CN": "无法切换至从 Github 接收到的新版 Ryujinx 模拟器。",
"zh_TW": "無法轉換從 Github Release 接收到的 Ryujinx 版本。"
"uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску GitHub.",
"zh_CN": "无法切换至从 GitHub 接收到的新版 Ryujinx 模拟器。",
"zh_TW": "無法轉換從 GitHub Release 接收到的 Ryujinx 版本。"
}
},
{
@@ -11357,7 +11357,7 @@
"el_GR": "",
"en_US": "Show Changelog",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Afficher Changelog",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -12317,7 +12317,7 @@
"el_GR": "Σφάλμα UI: Το επιλεγμένο παιχνίδι δεν έχει έγκυρο αναγνωριστικό τίτλου",
"en_US": "UI error: The selected game did not have a valid title ID",
"es_ES": "Error de interfaz: El juego seleccionado no tiene una ID válida",
"fr_FR": "Erreur d'UI : le jeu sélectionné n'a pas d'ID de titre valide",
"fr_FR": "Erreur d'UI : Le jeu sélectionné n'a pas d'ID de titre valide",
"he_IL": "שגיאת ממשק משתמש: למשחק שנבחר לא קיים מזהה משחק",
"it_IT": "Errore UI: Il gioco selezionato non ha un ID titolo valido",
"ja_JP": "UI エラー: 選択されたゲームは有効なタイトル ID を保持していません",
@@ -12509,7 +12509,7 @@
"el_GR": "",
"en_US": "An invalid Keys file was found in {0}",
"es_ES": "Se halló un archivo Keys inválido en {0}",
"fr_FR": "",
"fr_FR": "Un fichier de clés invalide a été trouvé dans {0}",
"he_IL": "",
"it_IT": "E' stato trovato un file di chiavi invalido ' {0}",
"ja_JP": "",
@@ -12533,7 +12533,7 @@
"el_GR": "",
"en_US": "Install Keys",
"es_ES": "Instalar Keys",
"fr_FR": "",
"fr_FR": "Installer des clés",
"he_IL": "",
"it_IT": "Installa Chavi",
"ja_JP": "",
@@ -12557,7 +12557,7 @@
"el_GR": "",
"en_US": "New Keys file will be installed.",
"es_ES": "Un nuevo archivo Keys será instalado.",
"fr_FR": "",
"fr_FR": "Nouveau fichier de clés sera installé.",
"he_IL": "",
"it_IT": "Un nuovo file di Chiavi sarà intallato.",
"ja_JP": "",
@@ -12581,7 +12581,7 @@
"el_GR": "",
"en_US": "\n\nThis may replace some of the current installed Keys.",
"es_ES": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.",
"fr_FR": "",
"fr_FR": "\n\nCela pourrait remplacer les clés qui sont installés.",
"he_IL": "",
"it_IT": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.",
"ja_JP": "",
@@ -12605,7 +12605,7 @@
"el_GR": "",
"en_US": "\n\nDo you want to continue?",
"es_ES": "\n\nDeseas continuar?",
"fr_FR": "",
"fr_FR": "\n\nVoulez-vous continuez ?",
"he_IL": "",
"it_IT": "\n\nVuoi continuare?",
"ja_JP": "",
@@ -12629,7 +12629,7 @@
"el_GR": "",
"en_US": "Installing Keys...",
"es_ES": "Instalando Keys...",
"fr_FR": "",
"fr_FR": "Installation des clés...",
"he_IL": "",
"it_IT": "Installando le chiavi...",
"ja_JP": "",
@@ -12653,7 +12653,7 @@
"el_GR": "",
"en_US": "New Keys file successfully installed.",
"es_ES": "Nuevo archivo Keys instalado con éxito.",
"fr_FR": "",
"fr_FR": "Nouveau fichier de clés a été installé.",
"he_IL": "",
"it_IT": "Nuovo file di chiavi installato con successo.",
"ja_JP": "",
@@ -13613,7 +13613,7 @@
"el_GR": "",
"en_US": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Ryujinx est un émulateur pour la Nintendo Switch™.\nObtenez le dernières nouvelles sur le Discord.\nLes développeurs qui veulent contribuer peuvent en savoir plus sur notre GitHub ou Discord.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -13661,7 +13661,7 @@
"el_GR": "",
"en_US": "Formerly Maintained By:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Anciennement Maintenu par :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -14501,7 +14501,7 @@
"el_GR": "",
"en_US": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
"es_ES": "Soporte de acceso directo al teclado (HID). Proporciona a los juegos acceso a su teclado como dispositivo de entrada de texto.\n\nSolo funciona con juegos que permiten de forma nativa el uso del teclado en el hardware de Switch.\n\nDesactívalo si no sabes qué hacer.",
"fr_FR": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez OFF si vous n'êtes pas sûr.",
"fr_FR": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez désactiver si vous n'êtes pas sûr.",
"he_IL": "",
"it_IT": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.",
"ja_JP": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.",
@@ -14525,7 +14525,7 @@
"el_GR": "",
"en_US": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
"es_ES": "Soporte de acceso directo al mouse (HID). Proporciona a los juegos acceso a su mouse como puntero.\n\nSolo funciona con juegos que permiten de forma nativa el uso de controles con mouse en el hardware de switch, lo cual son pocos.\n\nCuando esté activado, la funcionalidad de pantalla táctil puede no funcionar.\n\nDesactívalo si no sabes qué hacer.",
"fr_FR": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez sur OFF si vous n'êtes pas sûr.",
"fr_FR": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez désactiver si vous n'êtes pas sûr.",
"he_IL": "",
"it_IT": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.",
"ja_JP": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.",
@@ -14645,7 +14645,7 @@
"el_GR": "",
"en_US": "Resync System Time to match your PC's current date & time.\n\nThis is not an active setting, it can still fall out of sync; in which case just click this button again.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Resynchronise la Date du Système pour qu'elle soit la même que celle du PC.\n\nCeci n'est pas un paramètrage automatique, la date peut se désynchroniser; dans ce cas là, rappuyer sur le boutton.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -16037,7 +16037,7 @@
"el_GR": "Εύρος:",
"en_US": "Range:",
"es_ES": "Alcance:",
"fr_FR": "Intervalle :",
"fr_FR": "Intervalle :",
"he_IL": "טווח:",
"it_IT": "Raggio:",
"ja_JP": "範囲:",
@@ -17093,7 +17093,7 @@
"el_GR": "",
"en_US": "Cabinet Dialog",
"es_ES": "Diálogo Gabinete",
"fr_FR": "",
"fr_FR": "Dialogue de Cabinet",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -17117,7 +17117,7 @@
"el_GR": "",
"en_US": "Enter your Amiibo's new name",
"es_ES": "Ingresa el nuevo nombre de tu Amiibo",
"fr_FR": "",
"fr_FR": "Entrer le nouveau nom de votre Amiibo",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -17141,7 +17141,7 @@
"el_GR": "",
"en_US": "Please scan your Amiibo now.",
"es_ES": "Escanea tu Amiibo ahora.",
"fr_FR": "",
"fr_FR": "Veuillez scannez votre Amiibo.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -19133,7 +19133,7 @@
"el_GR": "",
"en_US": "{0} DLC(s) available",
"es_ES": "",
"fr_FR": "",
"fr_FR": "{0} DLC(s) disponibles",
"he_IL": "{0} הרחבות משחק",
"it_IT": "",
"ja_JP": "",
@@ -19589,7 +19589,7 @@
"el_GR": "Όνομα:",
"en_US": "Name:",
"es_ES": "Nombre:",
"fr_FR": "Nom :",
"fr_FR": "Nom :",
"he_IL": "שם:",
"it_IT": "Nome:",
"ja_JP": "名称:",
@@ -21269,7 +21269,7 @@
"el_GR": "",
"en_US": "VSync:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "VSync :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21293,7 +21293,7 @@
"el_GR": "",
"en_US": "Enable custom refresh rate (Experimental)",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Activer le taux de rafraîchissement customisé (Expérimental)",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21317,7 +21317,7 @@
"el_GR": "",
"en_US": "Switch",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Switch",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21341,7 +21341,7 @@
"el_GR": "",
"en_US": "Unbounded",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Sans Limite",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21365,7 +21365,7 @@
"el_GR": "",
"en_US": "Custom Refresh Rate",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Taux de Rafraîchissement Customisé",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21389,7 +21389,7 @@
"el_GR": "",
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21411,9 +21411,9 @@
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom' emulates the specified custom refresh rate.",
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité. 'Taux de Rafraîchissement Customisé' émule le taux de rafraîchissement spécifié.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21437,7 +21437,7 @@
"el_GR": "",
"en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Permet à l'utilisateur de spécifier un taux de rafraîchissement émulé. Dans certains jeux, ceci pourrait accélérer ou ralentir le taux de logique du gameplay. Dans d'autre titres, cela permettrait limiter le FPS à un multiple du taux de rafraîchissement, ou conduire à un comportement imprévisible. Ceci est une fonctionnalité expérimentale, avec aucune garanties pour comment le gameplay sera affecté. \n\nLaisser désactiver en cas de doute.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21461,7 +21461,7 @@
"el_GR": "",
"en_US": "The custom refresh rate target value.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "La valeur cible du taux de rafraîchissement customisé.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21485,7 +21485,7 @@
"el_GR": "",
"en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Le taux de rafraîchissement customisé, comme un pourcentage du taux de rafraîchissement normal de la Switch.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21509,7 +21509,7 @@
"el_GR": "",
"en_US": "Custom Refresh Rate %:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Pourcentage du Taux de Rafraîchissement Customisé :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21533,7 +21533,7 @@
"el_GR": "",
"en_US": "Custom Refresh Rate Value:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Valeur du Taux de Rafraîchissement Customisé :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21557,7 +21557,7 @@
"el_GR": "",
"en_US": "Interval",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Intervalle",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21581,7 +21581,7 @@
"el_GR": "",
"en_US": "Toggle VSync mode:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Activer/Désactiver mode VSync :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21605,7 +21605,7 @@
"el_GR": "",
"en_US": "Raise custom refresh rate",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Augmenter le taux de rafraîchissement customisé :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -21627,9 +21627,9 @@
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Lower custom refresh rate",
"en_US": "Lower custom refresh rate:",
"es_ES": "",
"fr_FR": "",
"fr_FR": "Baisser le taux de rafraîchissement customisé :",
"he_IL": "",
"it_IT": "",
"ja_JP": "",