Merge branch 'ui-actions-new' into 'master'

UI: Actions Menu

See merge request [ryubing/ryujinx!232](https://git.ryujinx.app/ryubing/ryujinx/-/merge_requests/232)
This commit is contained in:
Neo 2026-01-28 06:52:32 -06:00
commit 6695dfed8e
27 changed files with 2713 additions and 2755 deletions

View File

@ -6,7 +6,7 @@ Each json file holds the locales for a specific part of the emulator, e.g. the S
## Languages
in the `/assets/` folder you will find the `Languages.json` file, which defines all the languages supported by the emulator.
The file includes a table of the langauge codes and their langauge names.
The file includes a table of the language codes and their language names.
#Example of the format for Languages.json
{
@ -38,12 +38,12 @@ If no json file exists for the specific part of the emulator you're working on,
{
"Locales": [
{
"ID": "MenuBarActionsOpenMiiEditor",
"ID": "SettingsTabInputDirectMouseAccess",
"Translations": {
"ar_SA": "",
"en_US": "Mii Editor",
"ar_SA": "الوصول المباشر للفأرة",
"en_US": "Direct Mouse Access",
...
"zh_TW": "Mii 編輯器"
"zh_TW": "滑鼠直接存取"
}
},
{

454
assets/Locales/Amiibo.json Normal file
View File

@ -0,0 +1,454 @@
{
"Locales": [
{
"ID": "MenuBarActions_ScanAmiibo",
"Translations": {
"ar_SA": "فحص Amiibo",
"de_DE": "Amiibo scannen",
"el_GR": "Σάρωση Amiibo",
"en_US": "Scan Amiibo",
"es_ES": "Escanear Amiibo",
"fr_FR": "Scanner un Amiibo",
"he_IL": "סרוק אמיבו",
"it_IT": "Scansiona un Amiibo",
"ja_JP": "Amiibo をスキャン",
"ko_KR": "Amiibo 스캔",
"no_NO": "Skann en Amiibo",
"pl_PL": "Skanuj Amiibo",
"pt_BR": "Escanear um Amiibo",
"ru_RU": "Сканировать Amiibo",
"sv_SE": "Skanna en Amiibo",
"th_TH": "สแกน Amiibo",
"tr_TR": "Tara Amiibo",
"uk_UA": "Сканувати Amiibo",
"zh_CN": "扫描 Amiibo",
"zh_TW": "掃描 Amiibo"
}
},
{
"ID": "MenuBarActions_ScanAmiiboBin",
"Translations": {
"ar_SA": "فحص Amiibo (.BIN)",
"de_DE": "Amiibo scannen (.BIN)",
"el_GR": "Σάρωση Amiibo (.BIN)",
"en_US": "Scan Amiibo (.BIN)",
"es_ES": "Escanear un Amiibo (.BIN)",
"fr_FR": "Scanner un Amiibo (.BIN)",
"he_IL": "סרוק Amiibo (.BIN)",
"it_IT": "Scansiona un Amiibo (.BIN)",
"ja_JP": "Amiibo をスキャン (.BIN)",
"ko_KR": "Amiibo 스캔 (.BIN)",
"no_NO": "Skann en Amiibo (.BIN)",
"pl_PL": "Skanuj Amiibo (.BIN)",
"pt_BR": "Escanear um Amiibo (.BIN)",
"ru_RU": "Сканировать Amiibo (.BIN)",
"sv_SE": "Skanna en Amiibo (.BIN)",
"th_TH": "สแกน Amiibo (.BIN)",
"tr_TR": "Tara Amiibo (.BIN)",
"uk_UA": "Сканувати Amiibo (.BIN)",
"zh_CN": "扫描 Amiibo (.BIN)",
"zh_TW": "掃描 Amiibo (.BIN)"
}
},
{
"ID": "DialogApiTitle",
"Translations": {
"ar_SA": "أميبو API",
"de_DE": "Amiibo-API",
"el_GR": "API για Amiibo.",
"en_US": "Amiibo API",
"es_ES": "API Amiibo",
"fr_FR": "API Amiibo",
"he_IL": "ממשק תכנות אמיבו",
"it_IT": "API Amiibo",
"ja_JP": "",
"ko_KR": null,
"no_NO": "",
"pl_PL": "API Amiibo",
"pt_BR": "API Amiibo",
"ru_RU": "API Amiibo",
"sv_SE": "Amiibo-API",
"th_TH": "อามิโบ้ API",
"tr_TR": "",
"uk_UA": "API Amiibo",
"zh_CN": null,
"zh_TW": null
}
},
{
"ID": "DialogApiFailFetchMessage",
"Translations": {
"ar_SA": "حدث خطأ أثناء جلب المعلومات من API.",
"de_DE": "Beim Abrufen von Informationen aus der API ist ein Fehler aufgetreten.",
"el_GR": "Παρουσιάστηκε σφάλμα κατά την ανάκτηση πληροφοριών από το API.",
"en_US": "An error occured while fetching information from the API.",
"es_ES": "Ocurrió un error al recibir información de la API.",
"fr_FR": "Une erreur est survenue lors de la récupération des informations de l'API.",
"he_IL": "אירעה שגיאה בעת שליפת מידע מהממשק.",
"it_IT": "Si è verificato un errore durante il recupero delle informazioni dall'API.",
"ja_JP": "API からの情報取得中にエラーが発生しました.",
"ko_KR": "API에서 정보를 가져오는 중에 오류가 발생했습니다.",
"no_NO": "En feil oppstod under henting av informasjon fra API.",
"pl_PL": "Wystąpił błąd podczas pobierania informacji z API.",
"pt_BR": "Um erro ocorreu ao tentar obter informações da API.",
"ru_RU": "Произошла ошибка при получении информации из API.",
"sv_SE": "Ett fel inträffade vid hämtning av information från API.",
"th_TH": "เกิดข้อผิดพลาดขณะเรียกข้อมูลจาก API",
"tr_TR": "API'dan bilgi alırken bir hata oluştu.",
"uk_UA": "Під час отримання інформації з API сталася помилка.",
"zh_CN": "从 API 获取信息时出错。",
"zh_TW": "從 API 取得資訊時出現錯誤。"
}
},
{
"ID": "DialogApiConnectErrorMessage",
"Translations": {
"ar_SA": "غير قادر على الاتصال بخادم API أميبو. قد تكون الخدمة معطلة أو قد تحتاج إلى التحقق من اتصالك بالإنترنت.",
"de_DE": "Verbindung zum Amiibo API Server kann nicht hergestellt werden. Der Dienst ist möglicherweise nicht verfügbar oder es existiert keine Internetverbindung.",
"el_GR": "Δεν είναι δυνατή η σύνδεση με τον διακομιστή Amiibo API. Η υπηρεσία μπορεί να είναι εκτός λειτουργίας ή μπορεί να χρειαστεί να επαληθεύσετε ότι έχετε ενεργή σύνδεσή στο Διαδίκτυο.",
"en_US": "Unable to connect to Amiibo API server. The service may be down or you may need to verify your internet connection is online.",
"es_ES": "No se pudo conectar al servidor de la API Amiibo. El servicio puede estar caído o tu conexión a internet puede haberse desconectado.",
"fr_FR": "Impossible de se connecter au serveur API Amiibo. Le service est peut-être hors service ou vous devriez peut-être vérifier que votre connexion internet est connectée.",
"he_IL": "לא ניתן להתחבר לממשק שרת האמיבו. ייתכן שהשירות מושבת או שתצטרך לוודא שהחיבור לאינטרנט שלך מקוון.",
"it_IT": "Impossibile connettersi al server dell'API Amiibo. Il servizio potrebbe non essere disponibile o potresti non essere connesso a Internet.",
"ja_JP": "Amiibo API サーバに接続できませんでした. サーバがダウンしているか, インターネット接続に問題があるかもしれません.",
"ko_KR": "Amiibo API 서버에 연결할 수 없습니다. 서비스가 다운되었거나 인터넷 연결이 온라인 상태인지 확인이 필요합니다.",
"no_NO": "Kan ikke koble til Amiibo API server. Tjenesten kan være nede, eller du må kanskje verifisere at din internettforbindelse er tilkoblet.",
"pl_PL": "Nie można połączyć się z serwerem API Amiibo. Usługa może nie działać lub może być konieczne sprawdzenie, czy połączenie internetowe jest online.",
"pt_BR": "Não foi possível conectar ao servidor da API Amiibo. O serviço pode estar fora do ar ou você precisa verificar sua conexão com a Internet.",
"ru_RU": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна или вам может потребоваться проверить ваше интернет-соединение.",
"sv_SE": "Kunde inte ansluta till Amiibo API-server. Tjänsten kanske är nere eller så behöver du kontrollera att din internetanslutning fungerar.",
"th_TH": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Amiibo API บางบริการอาจหยุดทำงาน หรือไม่คุณต้องทำการตรวจสอบว่าอินเทอร์เน็ตของคุณอยู่ในสถานะเชื่อมต่ออยู่หรือไม่",
"tr_TR": "Amiibo API sunucusuna bağlanılamadı. Sunucu çevrimdışı olabilir veya uygun bir internet bağlantınızın olduğunu kontrol etmeniz gerekebilir.",
"uk_UA": "Неможливо підключитися до сервера Amiibo API. Можливо, служба не працює або вам потрібно перевірити, чи є підключення до Інтернету.",
"zh_CN": "无法连接到 Amiibo API 服务器,服务可能已关闭,或者没有连接互联网。",
"zh_TW": "無法連接 Amiibo API 伺服器。服務可能已停機,或者您可能需要確認網際網路連線是否在線上。"
}
},
{
"ID": "AboutDisclaimerMessage",
"Translations": {
"ar_SA": "AmiiboAPI (www.amiiboapi.com) يتم \nاستخدامه في محاكاة أمبيو لدينا.",
"de_DE": "AmiiboAPI (www.amiiboapi.com) wird in unserer Amiibo \nEmulation benutzt.",
"el_GR": "Το AmiiboAPI (www.amiiboapi.com) χρησιμοποιείται\nστην προσομοίωση Amiibo.",
"en_US": "AmiiboAPI (www.amiiboapi.com) is used\nin our Amiibo emulation.",
"es_ES": "Utilizamos AmiiboAPI (www.amiiboapi.com)\nen nuestra emulación de Amiibo.",
"fr_FR": "AmiiboAPI (www.amiiboapi.com) est utilisé\ndans notre émulation Amiibo.",
"he_IL": "ממשק אמיבו (www.amiiboapi.com) משומש בהדמיית האמיבו שלנו.",
"it_IT": "AmiiboAPI (www.amiiboapi.com) è usata\nnella nostra emulazione Amiibo.",
"ja_JP": "AmiiboAPI (www.amiiboapi.com) は\nAmiibo エミュレーションに使用されています.",
"ko_KR": "AmiiboAPI(www.amiiboapi.com)는\nAmiibo 에뮬레이션에 사용됩니다.",
"no_NO": "AmiiboAPI (www.amiiboapi.com) brukes sammen med\ni vår Amiibo-emulsjon.",
"pl_PL": "AmiiboAPI (www.amiiboapi.com) jest używane\nw naszej emulacji Amiibo.",
"pt_BR": "AmiiboAPI (www.amiiboapi.com) é usado\nem nossa emulação de Amiibo.",
"ru_RU": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.",
"sv_SE": "AmiiboAPI (www.amiiboapi.com) används\ni vår Amiibo-emulation.",
"th_TH": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา",
"tr_TR": "Amiibo emülasyonumuzda \nAmiiboAPI (www.amiiboapi.com) kullanılmaktadır.",
"uk_UA": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.",
"zh_CN": "我们的 Amiibo 模拟使用了\nAmiiboAPI (www.amiiboapi.com)。",
"zh_TW": "我們在 Amiibo 模擬中\n使用了 AmiiboAPI (www.amiiboapi.com)。"
}
},
{
"ID": "SeriesLabel",
"Translations": {
"ar_SA": "سلسلة",
"de_DE": "Serie",
"el_GR": "Σειρά",
"en_US": "Series",
"es_ES": "Serie",
"fr_FR": "Séries",
"he_IL": "סדרה",
"it_IT": "Serie",
"ja_JP": "シリーズ",
"ko_KR": "시리즈",
"no_NO": "Serie",
"pl_PL": "Seria",
"pt_BR": "Série",
"ru_RU": "Серия",
"sv_SE": "Serie",
"th_TH": "ซีรีส์",
"tr_TR": "Seri",
"uk_UA": "Серія",
"zh_CN": "系列",
"zh_TW": "系列"
}
},
{
"ID": "ScanButtonLabel",
"Translations": {
"ar_SA": "فحص Amiibo",
"de_DE": "Amiibo einscannen",
"el_GR": "Σαρώστε το Amiibo",
"en_US": "Scan Amiibo",
"es_ES": "Escanear Amiibo",
"fr_FR": "Scanner l'Amiibo",
"he_IL": "סרוק את ה-Amiibo",
"it_IT": "Scansiona l'Amiibo",
"ja_JP": "Amiiboをスキャン",
"ko_KR": "Amiibo 스캔하기",
"no_NO": "Skanne Amiibo",
"pl_PL": "Zeskanuj Amiibo",
"pt_BR": "Escanear Amiibo",
"ru_RU": "Сканировать Amiibo",
"sv_SE": "Skanna Amiibo",
"th_TH": "สแกน Amiibo",
"tr_TR": "Amiibo'yu tara",
"uk_UA": "Сканувати Amiibo",
"zh_CN": "扫描 Amiibo",
"zh_TW": "掃描 Amiibo"
}
},
{
"ID": "OptionsShowAllLabel",
"Translations": {
"ar_SA": "عرض Amiibo غير متوافقة",
"de_DE": "Zeige inkompatible Amiibo",
"el_GR": "Εμφάνιση μη συμβατών Amiibo",
"en_US": "Show Incompatible Amiibo",
"es_ES": "Mostrar Amiibo Incompatibles",
"fr_FR": "Montrer les Amiibo Incompatibles",
"he_IL": "הצג Amiibo שאינם תואמים",
"it_IT": "Mostra Amiibo incompatibili",
"ja_JP": "非互換のAmiiboを表示",
"ko_KR": "호환되지 않는 Amiibo 표시",
"no_NO": "Vis inkompatible Amiibo",
"pl_PL": "Pokaż niekompatybilne Amiibo",
"pt_BR": "Mostrar Amiibo incompatíveis",
"ru_RU": "Показать несовместимые Amiibo",
"sv_SE": "Visa inkompatibla Amiibo",
"th_TH": "แสดง Amiibo ที่ไม่เข้ากัน",
"tr_TR": "Uyumsuz Amiibo'yu göster",
"uk_UA": "Показати несумісні Amiibo",
"zh_CN": "显示不兼容的 Amiibo",
"zh_TW": "顯示不相容的 Amiibo"
}
},
{
"ID": "OptionsUsRandomTagLabel",
"Translations": {
"ar_SA": "هاك: UUID عشوائي",
"de_DE": "Hack: Zufällige UUID",
"el_GR": "Hack: Τυχαίο UUID",
"en_US": "Hack: Random UUID",
"es_ES": "Hack: UUID aleatorio",
"fr_FR": "Hack : UUID aléatoire",
"he_IL": "האק: UUID אקראי",
"it_IT": "Hack: UUID casuale",
"ja_JP": "ハック: ランダム UUID",
"ko_KR": "핵: 무작위 UUID",
"no_NO": "Hack: Tilfeldig UUID",
"pl_PL": "Hack: Losowy UUID",
"pt_BR": "Hack: UUID aleatório",
"ru_RU": "Хак: Случайный UUID",
"sv_SE": "Hack: Slumpmässig UUID",
"th_TH": "แฮ็ค: UUID สุ่ม",
"tr_TR": "Hack: Rastgele UUID",
"uk_UA": "Хак: Випадковий UUID",
"zh_CN": "Hack随机 UUID",
"zh_TW": "Hack隨機 UUID"
}
},
{
"ID": "CabinetDialog",
"Translations": {
"ar_SA": "أدخل اسم أميبو الجديد",
"de_DE": "Gib den neuen Namen deines Amiibo ein",
"el_GR": "Εισαγάγετε το νέο όνομα του Amiibo σας",
"en_US": "Enter your Amiibo's new name",
"es_ES": "Ingresa el nuevo nombre de tu Amiibo",
"fr_FR": "Entrez le nouveau nom de votre Amiibo",
"he_IL": "הזן את השם החדש של ה-Amiibo שלך",
"it_IT": "Inserisci il nuovo nome del tuo Amiibo",
"ja_JP": "Amiibo の新しい名前を入力してください",
"ko_KR": "Amiibo의 새 이름을 입력하세요",
"no_NO": "Skriv inn det nye navnet til Amiiboen din",
"pl_PL": "Wprowadź nową nazwę swojego Amiibo",
"pt_BR": "Digite o novo nome do seu Amiibo",
"ru_RU": "Введите новое имя вашего Amiibo",
"sv_SE": "Ange det nya namnet för din Amiibo",
"th_TH": "กรุณาใส่ชื่อใหม่ของ Amiibo ของคุณ",
"tr_TR": "Amiibo'nuzun yeni adını girin",
"uk_UA": "Введіть нове ім'я вашого Amiibo",
"zh_CN": "输入你的 Amiibo 的新名字",
"zh_TW": "輸入你的 Amiibo 新名稱"
}
},
{
"ID": "CabinetTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Cabinet Dialog",
"es_ES": "Diálogo Gabinete",
"fr_FR": "Dialogue de Cabinet",
"he_IL": "",
"it_IT": "Modale del Cabinet",
"ja_JP": "",
"ko_KR": "캐비닛 대화 상자",
"no_NO": "Dialogboks for kabinett",
"pl_PL": "",
"pt_BR": "Diálogo do Gabinete",
"ru_RU": "Сообщение кабинета",
"sv_SE": "Cabinet-dialog",
"th_TH": "กล่องโต้ตอบไฟล์ Cabinet",
"tr_TR": "",
"uk_UA": "Сповіщення Cabinet",
"zh_CN": "档案对话框",
"zh_TW": "Cabinet 對話方塊"
}
},
{
"ID": "CabinetScanDialog",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Please scan your Amiibo now.",
"es_ES": "Escanea tu Amiibo ahora.",
"fr_FR": "Veuillez scannez votre Amiibo.",
"he_IL": "",
"it_IT": "Scansiona ora il tuo Amiibo.",
"ja_JP": "",
"ko_KR": "지금 Amiibo를 스캔하세요.",
"no_NO": "Vennligst skann Amiiboene dine nå.",
"pl_PL": "",
"pt_BR": "Por favor, escaneie seu Amiibo agora.",
"ru_RU": "Пожалуйста, сканируйте ваш Amiibo.",
"sv_SE": "Skanna din Amiibo nu.",
"th_TH": "กรุณาสแกน Amiibo ของคุณตอนนี้",
"tr_TR": "",
"uk_UA": "Будь ласка, проскануйте Ваш Amiibo.",
"zh_CN": "请现在扫描你的 Amiibo",
"zh_TW": "請掃描你的 Amiibo。"
}
},
{
"ID": "OpenBinFileDialogTitle",
"Translations": {
"ar_SA": "حدد ملف .BIN يحتوي على Amiibo",
"de_DE": "Wähle eine .BIN-Datei mit einem Amiibo",
"el_GR": "Επιλέξτε ένα αρχείο .BIN με ένα Amiibo",
"en_US": "Choose a .BIN file with an Amiibo",
"es_ES": "Selecciona un archivo .BIN con un Amiibo",
"fr_FR": "Sélectionnez un fichier .BIN avec un Amiibo",
"he_IL": "בחר קובץ .BIN עם Amiibo",
"it_IT": "Seleziona un file .BIN con un Amiibo",
"ja_JP": "Amiiboが含まれる .BIN ファイルを選択",
"ko_KR": "Amiibo가 포함된 .BIN 파일을 선택",
"no_NO": "Velg en .BIN-fil med et Amiibo",
"pl_PL": "Wybierz plik .BIN z Amiibo",
"pt_BR": "Selecione um arquivo .BIN com um Amiibo",
"ru_RU": "Выберите .BIN файл с Amiibo",
"sv_SE": "Välj en .BIN-fil med ett Amiibo",
"th_TH": "เลือกไฟล์ .BIN ที่มี Amiibo",
"tr_TR": "Amiibo içeren bir .BIN dosyası seçin",
"uk_UA": "Виберіть .BIN файл з Amiibo",
"zh_CN": "选择一个包含Amiibo的 .BIN 文件",
"zh_TW": "選擇一個包含Amiibo的 .BIN 檔案"
}
},
{
"ID": "Amiibo",
"Translations": {
"ar_SA": "أميبو",
"de_DE": "",
"el_GR": "",
"en_US": "Amiibo",
"es_ES": null,
"fr_FR": null,
"he_IL": "אמיבו",
"it_IT": "",
"ja_JP": "",
"ko_KR": null,
"no_NO": "",
"pl_PL": "",
"pt_BR": null,
"ru_RU": null,
"sv_SE": null,
"th_TH": "อมิโบ้",
"tr_TR": "",
"uk_UA": "",
"zh_CN": null,
"zh_TW": null
}
},
{
"ID": "Usage",
"Translations": {
"ar_SA": "الاستخدام:\n",
"de_DE": "Nutzung:\n",
"el_GR": "Χρήση:\n",
"en_US": "Usage:\n",
"es_ES": "Uso:\n",
"fr_FR": "Utilisation :\n",
"he_IL": "שימוש:\n",
"it_IT": "Utilizzo:\n",
"ja_JP": "使用法:\n",
"ko_KR": "사용법 :\n",
"no_NO": "Forbruk:\n",
"pl_PL": "Użycie:\n",
"pt_BR": "Uso:\n",
"ru_RU": "Применение:\n",
"sv_SE": "Användning:\n",
"th_TH": "การใช้งาน:\n",
"tr_TR": "Kullanım:\n",
"uk_UA": "Використання:\n",
"zh_CN": "用法:\n",
"zh_TW": "用途:\n"
}
},
{
"ID": "UsageWritable",
"Translations": {
"ar_SA": "الاستخدام (يمكنه حفظ البيانات):\n",
"de_DE": "Nutzung (Kann Daten speichern):\n",
"el_GR": "Χρήση (Μπορεί να αποθηκεύσει δεδομένα):\n",
"en_US": "Usage (Can Save Data):\n",
"es_ES": "Uso (Puede guardar datos):\n",
"fr_FR": "Utilisation (Peut enregistrer des données) :\n",
"he_IL": "שימוש (יכול לשמור נתונים):\n",
"it_IT": "Utilizzo (Può salvare dati):\n",
"ja_JP": "使用法(データを保存できます):\n",
"ko_KR": "사용법 (데이터 저장 가능):\n",
"no_NO": "Bruk (Kan lagre data):\n",
"pl_PL": "Użycie (Może zapisywać dane):\n",
"pt_BR": "Uso (Pode salvar dados):\n",
"ru_RU": "Применение (Может сохранять данные):\n",
"sv_SE": "Användning (Kan spara data):\n",
"th_TH": "การใช้งาน (สามารถบันทึกข้อมูลได้):\n",
"tr_TR": "Kullanım (Veri kaydedebilir):\n",
"uk_UA": "Використання (Може зберігати дані):\n",
"zh_CN": "用法(可保存数据):\n",
"zh_TW": "用途(可儲存資料):\n"
}
},
{
"ID": "Unknown",
"Translations": {
"ar_SA": "غير معروف",
"de_DE": "Unbekannt",
"el_GR": "Άγνωστο",
"en_US": "Unknown",
"es_ES": "Desconocido",
"fr_FR": "Inconnu",
"he_IL": "לא ידוע",
"it_IT": "Sconosciuto",
"ja_JP": "不明",
"ko_KR": "알 수 없음",
"no_NO": "Ukjent",
"pl_PL": "Nieznane",
"pt_BR": "Desconhecido",
"ru_RU": "Неизвестно",
"sv_SE": "Okänt",
"th_TH": "ไม่รู้จัก",
"tr_TR": "Bilinmeyen",
"uk_UA": "Невідомо",
"zh_CN": "未知",
"zh_TW": "未知"
}
}
]
}

View File

@ -0,0 +1,529 @@
{
"Locales": [
{
"ID": "MenuBarActions_Install",
"Translations": {
"ar_SA": "تثبيت البرنامج الثابت",
"de_DE": "Firmware installieren",
"el_GR": "Εγκατάσταση Firmware",
"en_US": "Install Firmware",
"es_ES": "Instalar Firmware",
"fr_FR": "Installer le Firmware",
"he_IL": "התקן קושחה",
"it_IT": "Installa firmware",
"ja_JP": "ファームウェアをインストール",
"ko_KR": "펌웨어 설치",
"no_NO": "Installer fastvare",
"pl_PL": "Zainstaluj oprogramowanie",
"pt_BR": "Instalar Firmware",
"ru_RU": "Установить прошивку",
"sv_SE": "Installera firmware",
"th_TH": "ติดตั้งเฟิร์มแวร์",
"tr_TR": "Yazılım Yükle",
"uk_UA": "Встановити прошивку",
"zh_CN": "安装系统固件",
"zh_TW": "安裝韌體"
}
},
{
"ID": "MenuBarActions_InstallFromFile",
"Translations": {
"ar_SA": ".XCI أو .ZIP",
"de_DE": ".XCI oder .ZIP",
"el_GR": ".XCI ή .ZIP",
"en_US": ".XCI or .ZIP",
"es_ES": ".XCI o .ZIP",
"fr_FR": ".XCI ou .ZIP",
"he_IL": ".XCI או .ZIP",
"it_IT": ".XCI o .ZIP",
"ja_JP": ".XCI または .ZIP",
"ko_KR": ".XCI 또는 .ZIP",
"no_NO": ".XCI eller .ZIP",
"pl_PL": ".XCI lub .ZIP",
"pt_BR": ".XCI ou .ZIP",
"ru_RU": ".XCI или .ZIP",
"sv_SE": ".XCI eller .ZIP",
"th_TH": ".XCI หรือ .ZIP",
"tr_TR": ".XCI veya .ZIP",
"uk_UA": ".XCI або .ZIP",
"zh_CN": ".XCI 或 .ZIP",
"zh_TW": ".XCI 或 .ZIP"
}
},
{
"ID": "MenuBarActions_InstallFromDirectory",
"Translations": {
"ar_SA": "مجلد",
"de_DE": "Verzeichnis",
"el_GR": "Φάκελος",
"en_US": "Folder",
"es_ES": "Carpeta",
"fr_FR": "Dossier",
"he_IL": "תיקייה",
"it_IT": "Cartella",
"ja_JP": "フォルダー",
"ko_KR": "폴더",
"no_NO": "Mappe",
"pl_PL": "Katalog",
"pt_BR": "Diretório",
"ru_RU": "Папка",
"sv_SE": "Katalog",
"th_TH": "โฟลเดอร์",
"tr_TR": "Klasör",
"uk_UA": "Тека",
"zh_CN": "文件夹",
"zh_TW": "資料夾"
}
},
{
"ID": "InstallFromFile_DialogTitle",
"Translations": {
"ar_SA": "اختر ملف .XCI أو أرشيف .ZIP لتثبيت البرنامج الثابت منه",
"de_DE": "Wählen Sie eine .XCI-Datei oder ein .ZIP-Archiv aus, um die Firmware zu installieren",
"el_GR": "Επιλέξτε ένα αρχείο .XCI ή ένα αρχείο .ZIP για να εγκαταστήσετε το υλικολογισμικό",
"en_US": "Choose an .XCI file or a .ZIP archive to install firmware from",
"es_ES": "Elige un archivo .XCI o un archivo .ZIP para instalar el firmware",
"fr_FR": "Choisissez un fichier .XCI ou une archive .ZIP pour installer le firmware",
"he_IL": "בחר קובץ .XCI או ארכיון .ZIP להתקנת הקושחה ממנו",
"it_IT": "Scegli un file .XCI o un archivio .ZIP per installare il firmware",
"ja_JP": "ファームウェアをインストールするために .XCI ファイルまたは .ZIP アーカイブを選択",
"ko_KR": "펌웨어를 설치할 .XCI 파일 또는 .ZIP 아카이브를 선택하세요",
"no_NO": "Velg en .XCI-fil eller et .ZIP-arkiv for å installere firmware fra",
"pl_PL": "Wybierz plik .XCI lub archiwum .ZIP, z którego chcesz zainstalować firmware",
"pt_BR": "Escolha um arquivo .XCI ou um arquivo .ZIP para instalar o firmware",
"ru_RU": "Выберите файл .XCI или архив .ZIP для установки прошивки",
"sv_SE": "Välj en .XCI-fil eller ett .ZIP-arkiv för att installera firmware",
"th_TH": "เลือกไฟล์ .XCI หรือไฟล์เก็บถาวร .ZIP เพื่อติดตั้งเฟิร์มแวร์จาก",
"tr_TR": "Firmware yüklemek için bir .XCI dosyası veya .ZIP arşivi seçin",
"uk_UA": "Виберіть файл .XCI або архів .ZIP для встановлення прошивки",
"zh_CN": "选择一个 .XCI 文件或 .ZIP 存档来安装固件",
"zh_TW": "選擇一個 .XCI 檔案或 .ZIP 封存檔來安裝韌體"
}
},
{
"ID": "InstallFromFolder_DialogTitle",
"Translations": {
"ar_SA": "اختر مجلد لتثبيت الكوشحة منه",
"de_DE": "Wählen Sie einen ORDNER aus, um die Firmware zu installieren",
"el_GR": "Επιλέξτε έναν ΦΆΚΕΛΟ για να εγκαταστήσετε το firmware",
"en_US": "Choose a FOLDER to install firmware from",
"es_ES": "Elige una CARPETA para instalar el firmware",
"fr_FR": "Choisissez un DOSSIER pour installer le firmware",
"he_IL": "בחר תיקיה להתקנת הקושחה ממנה",
"it_IT": "Scegli una CARTELLA per installare il firmware",
"ja_JP": "ファームウェアをインストールするフォルダを選択",
"ko_KR": "펌웨어를 설치할 폴더를 선택하세요",
"no_NO": "Velg en MAPPE for å installere firmware fra",
"pl_PL": "Wybierz FOLDER, z którego chcesz zainstalować firmware",
"pt_BR": "Escolha uma PASTA para instalar o firmware",
"ru_RU": "Выберите ПАПКУ для установки прошивки",
"sv_SE": "Välj en MAPP för att installera firmware från",
"th_TH": "เลือกโฟลเดอร์เพื่อติดตั้งเฟิร์มแวร์จากนั้น",
"tr_TR": "Firmware yüklemek için bir KLASÖR seçin",
"uk_UA": "Виберіть ПАПКУ для встановлення прошивки",
"zh_CN": "选择一个文件夹来安装固件",
"zh_TW": "選擇一個資料夾來安裝韌體"
}
},
{
"ID": "StatusBar_Version",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Firmware Version: {0}",
"es_ES": "Versión del Firmware: {0}",
"fr_FR": "Version du Firmware : {0}",
"he_IL": "",
"it_IT": "Versione firmware: {0}",
"ja_JP": "",
"ko_KR": "펌웨어 버전 : {0}",
"no_NO": "Fastvareversjon: {0}",
"pl_PL": "",
"pt_BR": "Versão do Firmware: {0}",
"ru_RU": "Версия прошивки: {0}",
"sv_SE": "Firmware-version: {0}",
"th_TH": "เวอร์ชันเฟิร์มแวร์: {0}",
"tr_TR": "",
"uk_UA": "Версія прошивки: {0}",
"zh_CN": "系统固件版本:{0}",
"zh_TW": "系統韌體版本: {0}"
}
},
{
"ID": "DialogInstall_EmbeddedMessage",
"Translations": {
"ar_SA": "هل ترغب في تثبيت البرنامج الثابت المدمج في هذه اللعبة؟ (البرنامج الثابت {0})",
"de_DE": "Die in diesem Spiel enthaltene Firmware installieren? (Firmware {0})",
"el_GR": "Θα θέλατε να εγκαταστήσετε το Firmware που είναι ενσωματωμένο σε αυτό το παιχνίδι; (Firmware {0})",
"en_US": "Would you like to install the firmware embedded in this game? (Firmware {0})",
"es_ES": "¿Quieres instalar el firmware incluido en este juego? (Firmware versión {0})",
"fr_FR": "Voulez-vous installer le firmware intégré dans ce jeu ? (Firmware {0})",
"he_IL": "האם תרצו להתקין את הקושחה המוטמעת במשחק הזה? (קושחה {0})",
"it_IT": "Vuoi installare il firmware incluso in questo gioco? (Firmware {0})",
"ja_JP": "このゲームに含まれるファームウェアをインストールしてよろしいですか? (ファームウェア {0})",
"ko_KR": "이 게임에 포함된 펌웨어를 설치하시겠습니까?(Firmware {0})",
"no_NO": "Ønsker du å installere fastvaren innebygd i dette spillet? (Firmware {0})",
"pl_PL": "Czy chcesz zainstalować firmware wbudowany w tę grę? (Firmware {0})",
"pt_BR": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})",
"ru_RU": "Хотите установить прошивку, встроенную в эту игру? (Прошивка {0})",
"sv_SE": "Vill du installera det firmware som är inbäddat i detta spel? (Firmware {0})",
"th_TH": "คุณต้องการติดตั้งเฟิร์มแวร์ที่ฝังอยู่ในเกมนี้หรือไม่? (เฟิร์มแวร์ {0})",
"tr_TR": "Bu oyunun içine gömülü olan yazılımı yüklemek ister misiniz? (Firmware {0})",
"uk_UA": "Бажаєте встановити прошивку, вбудовану в цю гру? (Прошивка {0})",
"zh_CN": "要安装游戏文件中内嵌的系统固件吗?(固件版本 {0})",
"zh_TW": "您想安裝遊戲內建的韌體嗎? (韌體 {0})"
}
},
{
"ID": "DialogInstall_EmbeddedMessage_Success",
"Translations": {
"ar_SA": "لم يتم العثور على أي برنامج ثابت مثبت ولكن ريوجينكس كان قادرا على تثبيت البرنامج الثابت {0} من اللعبة المقدمة.\nسيبدأ المحاكي الآن.",
"de_DE": "Es wurde keine installierte Firmware gefunden, aber Ryujinx konnte die Firmware {0} aus dem bereitgestellten Spiel installieren.\nRyujinx wird nun gestartet.",
"el_GR": "Δεν βρέθηκε εγκατεστημένο υλικολογισμικό, αλλά το Ryujinx κατάφερε να εγκαταστήσει το υλικολογισμικό {0} από το παρεχόμενο παιχνίδι.\nΟ προσομοιωτής θα ξεκινήσει τώρα.",
"en_US": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
"es_ES": "No se encontró ningún firmware instalado, pero Ryujinx pudo instalar el firmware {0} del juego proporcionado.\nEl emulador iniciará.",
"fr_FR": "Aucun firmware installé n'a été trouvé mais Ryujinx a pu installer le firmware {0} à partir du jeu fourni.\nL'émulateur va maintenant démarrer.",
"he_IL": "לא נמצאה קושחה מותקנת אבל ריוג'ינקס הצליח להתקין קושחה {0} מהמשחק שסופק. \nהאמולטור יופעל כעת.",
"it_IT": "Non è stato trovato alcun firmware installato, ma Ryujinx è riuscito ad installare il firmware {0} dal gioco fornito.\nL'emulatore si avvierà adesso.",
"ja_JP": "ファームウェアがインストールされていませんが, ゲームに含まれるファームウェア {0} をインストールできます.\nエミュレータが開始します.",
"ko_KR": "설치된 펌웨어를 찾을 수 없지만 Ryujinx는 제공된 게임에서 펌웨어 {0}을(를) 설치할 수 있습니다.\n이제 에뮬레이터가 시작됩니다.",
"no_NO": "Det ble ikke funnet noen installert fastvare, men Ryujinx kunne installere fastvare {0} fra det oppgitte spillet.\nemulatoren vil nå starte.",
"pl_PL": "Nie znaleziono zainstalowanego oprogramowania, ale Ryujinx był w stanie zainstalować oprogramowanie {0} z dostarczonej gry.\n\nEmulator uruchomi się teraz.",
"pt_BR": "Nenhum firmware instalado foi encontrado, mas o Ryujinx conseguiu instalar o firmware {0} a partir do jogo fornecido.\nO emulador será iniciado agora.",
"ru_RU": "Установленной прошивки не было найдено, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь запустится эмулятор.",
"sv_SE": "Inget installerat firmware hittades men Ryujinx kunde installera firmware {0} från angiven spel.\nEmulatorn kommer nu att startas.",
"th_TH": "ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้ แต่ Ryujinx จะติดตั้งเฟิร์มแวร์ได้ {0} จากเกมที่ให้มา\nขณะนี้โปรแกรมจำลองจะเริ่มทำงาน",
"tr_TR": "Yüklü bir firmware bulunamadı, ancak Ryujinx sağlanan oyundan firmware {0} yüklemeyi başardı.\nEmülatör şimdi başlatılacak.",
"uk_UA": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\nТепер запуститься емулятор.",
"zh_CN": "Ryujinx 模拟器已经从当前游戏文件中安装了系统固件 {0} 。\n模拟器现在可以正常运行了。",
"zh_TW": "未找到已安裝的韌體,但 Ryujinx 可以從現有的遊戲安裝韌體{0}。\n模擬器現在可以執行。"
}
},
{
"ID": "DialogInstall_NoFirmwareInstalledMessage",
"Translations": {
"ar_SA": "لا يوجد برنامج ثابت مثبت",
"de_DE": "Keine Firmware installiert",
"el_GR": "Δεν έχει εγκατασταθεί Firmware",
"en_US": "No Firmware Installed",
"es_ES": "No hay Firmware Instalado",
"fr_FR": "Aucun Firmware Installé",
"he_IL": "לא מותקנת קושחה",
"it_IT": "Nessun firmware installato",
"ja_JP": "ファームウェアがインストールされていません",
"ko_KR": "펌웨어가 설치되어 있지 않음",
"no_NO": "Ingen fastvare installert",
"pl_PL": "Brak Zainstalowanego Firmware'u",
"pt_BR": "Nenhum Firmware Instalado",
"ru_RU": "Прошивка не установлена",
"sv_SE": "Inget firmware installerat",
"th_TH": "ไม่มีการติดตั้งเฟิร์มแวร์",
"tr_TR": "Yazılım Yüklü Değil",
"uk_UA": "Прошивка не встановлена",
"zh_CN": "未安装系统固件",
"zh_TW": "未安裝韌體"
}
},
{
"ID": "DialogInstall_InstalledMessage",
"Translations": {
"ar_SA": "تم تثبيت البرنامج الثابت {0}",
"de_DE": "Firmware {0} wurde installiert",
"el_GR": "Το Firmware {0} εγκαταστάθηκε",
"en_US": "Firmware {0} was installed",
"es_ES": "Se Instaló el Firmware {0}",
"fr_FR": "Le firmware {0} a été installé",
"he_IL": "הקושחה {0} הותקנה",
"it_IT": "Il firmware {0} è stato installato",
"ja_JP": "ファームウェア {0} がインストールされました",
"ko_KR": "펌웨어 {0}이(가) 설치됨",
"no_NO": "fastvare {0} ble installert",
"pl_PL": "Firmware {0} został zainstalowany",
"pt_BR": "Firmware {0} foi instalado",
"ru_RU": "Прошивка {0} была установлена",
"sv_SE": "Firmware {0} installerades",
"th_TH": "เฟิร์มแวร์ {0} ติดตั้งแล้ว",
"tr_TR": "Yazılım {0} yüklendi",
"uk_UA": "Встановлено прошивку {0}",
"zh_CN": "已安装系统固件 {0}",
"zh_TW": "已安裝韌體{0}"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareNotFoundErrorMessage",
"Translations": {
"ar_SA": "لم يتم العثور على برنامج ثابت للنظام صالح في {0}.",
"de_DE": "Es wurde keine gültige System-Firmware gefunden in {0}.",
"el_GR": "Δεν βρέθηκε έγκυρο Firmware συστήματος στο {0}.",
"en_US": "A valid system firmware was not found in {0}.",
"es_ES": "No se pudo encontrar un firmware válido en {0}.",
"fr_FR": "Un firmware valide n'a pas été trouvé dans {0}.",
"he_IL": "לא נמצאה קושחת מערכת תקפה ב-{0}.",
"it_IT": "Un firmware del sistema valido non è stato trovato in {0}.",
"ja_JP": "{0} には有効なシステムファームウェアがありません.",
"ko_KR": "{0}에서 유효한 시스템 펌웨어를 찾을 수 없습니다.",
"no_NO": "En gyldig systemfastvare ble ikke funnet i {0}.",
"pl_PL": "Nie znaleziono prawidłowego firmware'u systemowego w {0}.",
"pt_BR": "Um firmware de sistema válido não foi encontrado em {0}.",
"ru_RU": "Не удалось найти действительную системную прошивку в {0}.",
"sv_SE": "Ett giltigt systemfirmware hittades inte i {0}.",
"th_TH": "ไม่พบเฟิร์มแวร์ของระบบที่ถูกต้อง {0}.",
"tr_TR": "{0} da geçerli bir sistem firmware'i bulunamadı.",
"uk_UA": "Дійсна прошивка системи не знайдена в {0}.",
"zh_CN": "在路径 {0} 中找不到有效的 Switch 系统固件。",
"zh_TW": "在 {0} 中未發現有效的系統韌體。"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareInstallTitle",
"Translations": {
"ar_SA": "تثبيت البرنامج الثابت {0}",
"de_DE": "Installiere Firmware {0}",
"el_GR": "Εγκατάσταση Firmware {0}",
"en_US": "Install Firmware {0}",
"es_ES": "Instalar Firmware {0}",
"fr_FR": "Installer le Firmware {0}",
"he_IL": "התקן קושחה {0}",
"it_IT": "Installa firmware {0}",
"ja_JP": "ファームウェア {0} をインストール",
"ko_KR": "펌웨어 {0} 설치",
"no_NO": "Installer fastvare {0}",
"pl_PL": "Zainstaluj Firmware {0}",
"pt_BR": "Instalar Firmware {0}",
"ru_RU": "Установить прошивку {0}",
"sv_SE": "Installera firmware {0}",
"th_TH": "ติดตั้งเฟิร์มแวร์ {0}",
"tr_TR": "Firmware {0} Yükle",
"uk_UA": "Встановити прошивку {0}",
"zh_CN": "安装系统固件 {0}",
"zh_TW": "安裝韌體 {0}"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareInstallMessage",
"Translations": {
"ar_SA": "سيتم تثبيت إصدار النظام {0}.",
"de_DE": "Systemversion {0} wird jetzt installiert.",
"el_GR": "Θα εγκατασταθεί η έκδοση συστήματος {0}.",
"en_US": "System version {0} will be installed.",
"es_ES": "Se instalará la versión de sistema {0}.",
"fr_FR": "La version {0} du système sera installée.",
"he_IL": "גירסת המערכת {0} תותקן.",
"it_IT": "La versione del sistema {0} sarà installata.",
"ja_JP": "システムバージョン {0} がインストールされます.",
"ko_KR": "시스템 버전 {0}이(가) 설치됩니다.",
"no_NO": "Systemversjon {0} vil bli installert.",
"pl_PL": "Wersja systemu {0} zostanie zainstalowana.",
"pt_BR": "A versão do sistema {0} será instalada.",
"ru_RU": "Будет установлена версия прошивки {0}.",
"sv_SE": "Systemversion {0} kommer att installeras.",
"th_TH": "ระบบเวอร์ชั่น {0} ได้รับการติดตั้งเร็วๆ นี้",
"tr_TR": "Sistem sürümü {0} yüklenecek.",
"uk_UA": "Буде встановлено версію системи {0}.",
"zh_CN": "即将安装系统固件版本 {0} 。",
"zh_TW": "即將安裝系統韌體版本 {0}。"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareInstallSubMessage",
"Translations": {
"ar_SA": "\n\nهذا سيحل محل إصدار النظام الحالي {0}.",
"de_DE": "\n\nDies wird die aktuelle Systemversion {0} ersetzen.",
"el_GR": "\n\nΑυτό θα αντικαταστήσει την τρέχουσα έκδοση συστήματος {0}.",
"en_US": "\n\nThis will replace the current system version {0}.",
"es_ES": "\n\nEsto reemplazará la versión de sistema actual, {0}.",
"fr_FR": "\n\nCela remplacera la version actuelle du système {0}.",
"he_IL": "\n\nזה יחליף את גרסת המערכת הנוכחית {0}.",
"it_IT": "\n\nQuesta sostituirà l'attuale versione del sistema ({0}).",
"ja_JP": "\n\n現在のシステムバージョン {0} を置き換えます.",
"ko_KR": "\n\n현재 시스템 버전 {0}을(를) 대체합니다.",
"no_NO": "\n\nDette erstatter den gjeldende systemversjonen {0}.",
"pl_PL": "\n\nZastąpi to obecną wersję systemu {0}.",
"pt_BR": "\n\nIsso substituirá a versão do sistema atual {0}.",
"ru_RU": "\n\nЭто заменит текущую версию прошивки {0}.",
"sv_SE": "\n\nDetta kommer att ersätta aktuella systemversionen {0}.",
"th_TH": "\n\nสิ่งนี้จะแทนที่เวอร์ชั่นของระบบเวอร์ชั่นปัจจุบัน {0}.",
"tr_TR": "\n\nBu şimdiki sistem sürümünün yerini alacak {0}.",
"uk_UA": "\n\nЦе замінить поточну версію системи {0}.",
"zh_CN": "\n\n替换当前系统固件版本 {0} 。",
"zh_TW": "\n\n這將取代目前的系統韌體版本 {0}。"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwaresInstallConfirmMessage",
"Translations": {
"ar_SA": "\nهل تريد المتابعة؟",
"de_DE": "\n\nMöchtest du fortfahren?",
"el_GR": "\n\nΘέλετε να συνεχίσετε;",
"en_US": "\n\nDo you want to continue?",
"es_ES": "\n\n¿Continuar?",
"fr_FR": "\n\nVoulez-vous continuer ?",
"he_IL": "\n\nהאם ברצונך להמשיך?",
"it_IT": "\n\nVuoi continuare?",
"ja_JP": "\n\n続けてよろしいですか?",
"ko_KR": "\n\n계속하시겠습니까?",
"no_NO": "\n\nVil du fortsette?",
"pl_PL": "\n\nCzy chcesz kontynuować?",
"pt_BR": "\n\nDeseja continuar?",
"ru_RU": "\n\nПродолжить?",
"sv_SE": "\n\nVill du fortsätta?",
"th_TH": "\n\nคุณต้องการดำเนินการต่อหรือไม่?",
"tr_TR": "\n\nDevam etmek istiyor musunuz?",
"uk_UA": "\n\nВи хочете продовжити?",
"zh_CN": "\n\n是否继续",
"zh_TW": "\n\n您確定要繼續嗎?"
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareInstallWaitMessage",
"Translations": {
"ar_SA": "تثبيت البرنامج الثابت...",
"de_DE": "Firmware wird installiert...",
"el_GR": "Εγκατάσταση Firmware...",
"en_US": "Installing Firmware...",
"es_ES": "Instalando Firmware...",
"fr_FR": "Installation du Firmware...",
"he_IL": "מתקין קושחה...",
"it_IT": "Installazione del firmware...",
"ja_JP": "ファームウェアをインストール中...",
"ko_KR": "펌웨어 설치 중...",
"no_NO": "Installerer fastvare...",
"pl_PL": "Instalowanie firmware'u...",
"pt_BR": "Instalando firmware...",
"ru_RU": "Установка прошивки...",
"sv_SE": "Installerar firmware...",
"th_TH": "กำลังติดตั้งเฟิร์มแวร์...",
"tr_TR": "Firmware yükleniyor...",
"uk_UA": "Встановлення прошивки...",
"zh_CN": "安装系统固件中...",
"zh_TW": "正在安裝韌體..."
}
},
{
"ID": "DialogFirmwareInstaller_FirmwareInstallSuccessMessage",
"Translations": {
"ar_SA": "تم تثبيت إصدار النظام {0} بنجاح.",
"de_DE": "Systemversion {0} wurde erfolgreich installiert.",
"el_GR": "Η έκδοση συστήματος {0} εγκαταστάθηκε με επιτυχία.",
"en_US": "System version {0} successfully installed.",
"es_ES": "Versión de sistema {0} instalada con éxito.",
"fr_FR": "Version du système {0} installée avec succès.",
"he_IL": "גרסת המערכת {0} הותקנה בהצלחה.",
"it_IT": "La versione del sistema {0} è stata installata.",
"ja_JP": "システムバージョン {0} が正常にインストールされました.",
"ko_KR": "시스템 버전 {0}이(가) 설치되었습니다.",
"no_NO": "Systemversjon {0} ble installert.",
"pl_PL": "Wersja systemu {0} została pomyślnie zainstalowana.",
"pt_BR": "Versão do sistema {0} instalada com sucesso.",
"ru_RU": "Прошивка версии {0} успешно установлена.",
"sv_SE": "Systemversion {0} har installerats.",
"th_TH": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว",
"tr_TR": "Sistem sürümü {0} başarıyla yüklendi.",
"uk_UA": "Версію системи {0} успішно встановлено.",
"zh_CN": "成功安装系统固件版本 {0} 。",
"zh_TW": "成功安裝系統韌體版本 {0}。"
}
},
{
"ID": "UserError_NoFirmware",
"Translations": {
"ar_SA": "لم يتم العثور على البرنامج الثابت",
"de_DE": "Firmware nicht gefunden",
"el_GR": "Το firmware δε βρέθηκε",
"en_US": "Firmware not found",
"es_ES": "No se encontró Firmware",
"fr_FR": "Firmware introuvable",
"he_IL": "קושחה לא נמצאה",
"it_IT": "Firmware non trovato",
"ja_JP": "ファームウェアがありません",
"ko_KR": "펌웨어를 찾을 수 없음",
"no_NO": "Fastvare ikke funnet",
"pl_PL": "Nie znaleziono firmware'u",
"pt_BR": "Firmware não encontrado",
"ru_RU": "Прошивка не найдена",
"sv_SE": "Firmware hittades inte",
"th_TH": "ไม่พบ เฟิร์มแวร์",
"tr_TR": "Firmware bulunamadı",
"uk_UA": "Прошивка не знайдена",
"zh_CN": "未安装系统固件",
"zh_TW": "找不到韌體"
}
},
{
"ID": "UserError_NoFirmware_Description",
"Translations": {
"ar_SA": "لم يتمكن ريوجينكس من العثور على أية برامج ثابتة مثبتة",
"de_DE": "Ryujinx konnte keine installierte Firmware finden!",
"el_GR": "Το Ryujinx δεν κατάφερε να εντοπίσει κανένα εγκατεστημένο firmware",
"en_US": "Ryujinx was unable to find any firmwares installed",
"es_ES": "Ryujinx no pudo encontrar un firmware instalado.",
"fr_FR": "Ryujinx n'a pas trouvé de firmware installé",
"he_IL": "ריוג'ינקס לא הצליחה למצוא קושחה מותקנת",
"it_IT": "Ryujinx non è riuscito a trovare alcun firmware installato",
"ja_JP": "インストールされたファームウェアが見つかりませんでした",
"ko_KR": "Ryujinx가 설치된 펌웨어를 찾을 수 없음",
"no_NO": "Ryujinx kunne ikke finne noen fastvare installert",
"pl_PL": "Ryujinx nie mógł znaleźć żadnego zainstalowanego firmware'u",
"pt_BR": "Ryujinx não conseguiu encontrar nenhum Firmware instalado",
"ru_RU": "Ryujinx не удалось найти ни одной установленной прошивки",
"sv_SE": "Ryujinx kunde inte hitta några installerade firmwares",
"th_TH": "Ryujinx ไม่พบ เฟิร์มแวร์ที่ติดตั้งไว้ในเครื่องของคุณ",
"tr_TR": "Ryujinx yüklü herhangi firmware bulamadı",
"uk_UA": "Ryujinx не вдалося знайти жодної встановленої прошивки",
"zh_CN": "Ryujinx 模拟器未安装 Switch 系统固件",
"zh_TW": "Ryujinx 無法找到已安裝的任何韌體"
}
},
{
"ID": "UserError_FirmwareParsingFailed",
"Translations": {
"ar_SA": "خطأ في تحليل البرنامج الثابت",
"de_DE": "Firmware-Analysierung-Fehler",
"el_GR": "Σφάλμα ανάλυσης firmware",
"en_US": "Firmware parsing error",
"es_ES": "Error al analizar el Firmware",
"fr_FR": "Erreur d'analyse du firmware",
"he_IL": "שגיאת ניתוח קושחה",
"it_IT": "Errore di analisi del firmware",
"ja_JP": "ファームウェアのパーズエラー",
"ko_KR": "펌웨어 구문 분석 오류",
"no_NO": "Fastvare analysefeil",
"pl_PL": "Błąd parsowania firmware'u",
"pt_BR": "Erro de análise de firmware",
"ru_RU": "Ошибка извлечения прошивки",
"sv_SE": "Tolkningsfel i firmware",
"th_TH": "เกิดข้อผิดพลาดในการวิเคราะห์เฟิร์มแวร์",
"tr_TR": "Firmware çözümleme hatası",
"uk_UA": "Помилка аналізу прошивки",
"zh_CN": "固件文件解析出错",
"zh_TW": "韌體解析錯誤"
}
},
{
"ID": "UserError_FirmwareParsingFailed_Description",
"Translations": {
"ar_SA": "لم يتمكن ريوجينكس من تحليل البرامج الثابتة المتوفرة. يحدث هذا عادة بسبب المفاتيح القديمة.",
"de_DE": "Ryujinx konnte die zu verfügung gestellte Firmware nicht analysieren. Ein möglicher Grund dafür sind veraltete keys.",
"el_GR": "Το Ryujinx δεν κατάφερε να αναλύσει το συγκεκριμένο firmware. Αυτό συνήθως οφείλετε σε ξεπερασμένα/παλιά κλειδιά.",
"en_US": "Ryujinx was unable to parse the provided firmware. This is usually caused by outdated keys.",
"es_ES": "Ryujinx no pudo analizar el firmware. Normalmente esto ocurre debido a keys desfasadas.",
"fr_FR": "Ryujinx n'a pas pu analyser le firmware fourni. Cela est généralement dû à des clés obsolètes.",
"he_IL": "ריוג'ינקס לא הצליחה לנתח את הקושחה שסופקה. זה נגרם בדרך כלל על ידי מפתחות לא עדכניים.",
"it_IT": "Ryujinx non è riuscito ad analizzare il firmware. Questo di solito è causato da chiavi non aggiornate.",
"ja_JP": "ファームウェアをパーズできませんでした.通常,古いキーが原因です.",
"ko_KR": "Ryujinx가 제공된 펌웨어를 구문 분석하지 못했습니다. 일반적으로 오래된 키로 인해 발생합니다.",
"no_NO": "Ryujinx klarte ikke å analysere levert fastvare. Dette er vanligvis forårsaket av utdaterte nøkler.",
"pl_PL": "Ryujinx nie był w stanie zparsować dostarczonego firmware'u. Jest to zwykle spowodowane nieaktualnymi kluczami.",
"pt_BR": "Ryujinx não conseguiu ler o Firmware fornecido. Geralmente isso é causado por chaves desatualizadas.",
"ru_RU": "Ryujinx не удалось распаковать выбранную прошивку. Обычно это вызвано устаревшими ключами.",
"sv_SE": "Ryujinx kunde inte tolka angiven firmware. Detta sker oftast med utdaterade nycklar.",
"th_TH": "Ryujinx ไม่สามารถวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่เก่าจนเกินไป",
"tr_TR": "Ryujinx temin edilen firmware'i çözümleyemedi. Bu durum genellikle güncel olmayan keys'den kaynaklanır.",
"uk_UA": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.",
"zh_CN": "Ryujinx 模拟器无法解密当前固件,一般是由于使用了旧版的密钥导致的。",
"zh_TW": "Ryujinx 無法解析所提供的韌體。這通常是由於金鑰過時造成的。"
}
}
]
}

329
assets/Locales/Keys.json Normal file
View File

@ -0,0 +1,329 @@
{
"Locales": [
{
"ID": "MenuBarActions_Install",
"Translations": {
"ar_SA": "تثبيت المفاتيح",
"de_DE": "Schlüssel installieren",
"el_GR": "Εγκατάσταση Κλειδιών",
"en_US": "Install Keys",
"es_ES": "Instalar Claves",
"fr_FR": "Installer des Clés",
"he_IL": "התקנת מפתחות",
"it_IT": "Installa chiavi",
"ja_JP": "キーをインストール",
"ko_KR": "설치 키",
"no_NO": "Installere nøkler",
"pl_PL": "Zainstaluj klucze",
"pt_BR": "Instalar Chaves",
"ru_RU": "Установить ключи",
"sv_SE": "Installera nycklar",
"th_TH": "ติดตั้ง Keys",
"tr_TR": "Anahtarları Yükle",
"uk_UA": "Встановити Ключі",
"zh_CN": "安装密匙",
"zh_TW": "安裝金鑰"
}
},
{
"ID": "MenuBarActions_InstallFromKeys",
"Translations": {
"ar_SA": null,
"de_DE": null,
"el_GR": null,
"en_US": ".KEYS",
"es_ES": null,
"fr_FR": null,
"he_IL": null,
"it_IT": null,
"ja_JP": null,
"ko_KR": null,
"no_NO": null,
"pl_PL": null,
"pt_BR": null,
"ru_RU": null,
"sv_SE": null,
"th_TH": null,
"tr_TR": null,
"uk_UA": null,
"zh_CN": null,
"zh_TW": null
}
},
{
"ID": "MenuBarFileActions_InstallFromFolder",
"Translations": {
"ar_SA": "مجلد",
"de_DE": "Verzeichnis",
"el_GR": "Φάκελος",
"en_US": "Folder",
"es_ES": "Carpeta",
"fr_FR": "Dossier",
"he_IL": "תיקיה",
"it_IT": "Cartella",
"ja_JP": "フォルダ",
"ko_KR": "폴더",
"no_NO": "Mappe",
"pl_PL": "Folder",
"pt_BR": "Diretório",
"ru_RU": "Папка",
"sv_SE": "Katalog",
"th_TH": "ไดเรกทอรี",
"tr_TR": "Klasör",
"uk_UA": "Тека",
"zh_CN": "文件夹",
"zh_TW": "資料夾"
}
},
{
"ID": "InstallFromFile_DialogTitle",
"Translations": {
"ar_SA": "اختر ملف .KEYS",
"de_DE": "Wählen Sie eine .KEYS-Datei aus",
"el_GR": "Επιλέξτε ένα αρχείο .KEYS",
"en_US": "Choose a .KEYS file",
"es_ES": "Elige un archivo .KEYS",
"fr_FR": "Choisissez un fichier .KEYS",
"he_IL": "בחר קובץ .KEYS",
"it_IT": "Scegli un file .KEYS",
"ja_JP": ".KEYS ファイルを選択",
"ko_KR": ".KEYS 파일을 선택하세요",
"no_NO": "Velg en .KEYS-fil",
"pl_PL": "Wybierz plik .KEYS",
"pt_BR": "Escolha um arquivo .KEYS",
"ru_RU": "Выберите файл .KEYS",
"sv_SE": "Välj en .KEYS-fil",
"th_TH": "เลือกไฟล์ .KEYS",
"tr_TR": ".KEYS dosyasını seçin",
"uk_UA": "Виберіть файл .KEYS",
"zh_CN": "选择一个 .KEYS 文件",
"zh_TW": "選擇一個 .KEYS 檔案"
}
},
{
"ID": "InstallFromFolder_DialogTitle",
"Translations": {
"ar_SA": "اختر مجلد لتثبيت المفاتيح منه",
"de_DE": "Wählen Sie einen ORDNER aus, um die Schlüssel zu installieren",
"el_GR": "Επιλέξτε έναν ΦΆΚΕΛΟ για να εγκαταστήσετε τα κλειδιά",
"en_US": "Choose a FOLDER to install keys from",
"es_ES": "Elige una CARPETA para instalar las claves",
"fr_FR": "Choisissez un DOSSIER pour installer les clés",
"he_IL": "בחר תיקיה להתקנת המפתחות ממנו",
"it_IT": "Scegli una CARTELLA per installare le chiavi",
"ja_JP": "フォルダを選択してキーをインストール",
"ko_KR": "폴더를 선택하여 키를 설치하세요",
"no_NO": "Velg en MAPPE for å installere nøklene fra",
"pl_PL": "Wybierz FOLDER, aby zainstalować klucze",
"pt_BR": "Escolha uma PASTA para instalar as chaves",
"ru_RU": "Выберите ПАПКУ для установки ключей",
"sv_SE": "Välj en MAPP för att installera nycklar från",
"th_TH": "เลือกโฟลเดอร์เพื่อติดตั้งคีย์จาก",
"tr_TR": "KLASÖR seçin ve anahtarları yükleyin",
"uk_UA": "Виберіть ПАПКУ для встановлення ключів",
"zh_CN": "选择一个文件夹来安装密钥",
"zh_TW": "選擇一個資料夾來安裝密鑰"
}
},
{
"ID": "DialogKeysInstaller_InstallConfirmMessage",
"Translations": {
"ar_SA": "\nهل تريد المتابعة؟",
"de_DE": "\n\nMöchtest du fortfahren?",
"el_GR": "\n\nΘέλετε να συνεχίσετε;",
"en_US": "\n\nDo you want to continue?",
"es_ES": "\n\n¿Continuar?",
"fr_FR": "\n\nVoulez-vous continuer ?",
"he_IL": "\n\nהאם ברצונך להמשיך?",
"it_IT": "\n\nVuoi continuare?",
"ja_JP": "\n\n続けてよろしいですか?",
"ko_KR": "\n\n계속하시겠습니까?",
"no_NO": "\n\nVil du fortsette?",
"pl_PL": "\n\nCzy chcesz kontynuować?",
"pt_BR": "\n\nDeseja continuar?",
"ru_RU": "\n\nПродолжить?",
"sv_SE": "\n\nVill du fortsätta?",
"th_TH": "\n\nคุณต้องการดำเนินการต่อหรือไม่?",
"tr_TR": "\n\nDevam etmek istiyor musunuz?",
"uk_UA": "\n\nВи хочете продовжити?",
"zh_CN": "\n\n是否继续",
"zh_TW": "\n\n您確定要繼續嗎?"
}
},
{
"ID": "DialogKeysInstaller_KeysNotFoundErrorMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"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": "Un fichier de Clés invalide a été trouvé dans {0}",
"he_IL": "",
"it_IT": "È stato trovato un file di chiavi non valido in {0}",
"ja_JP": "",
"ko_KR": "{0}에서 잘못된 키 파일이 발견",
"no_NO": "En ugyldig Keys-fil ble funnet i {0}.",
"pl_PL": "",
"pt_BR": "Um arquivo Chaves inválido foi encontrado em {0}",
"ru_RU": "В {0} найден некорректный файл ключей",
"sv_SE": "En ogiltig nyckelfil hittades i {0}",
"th_TH": "พบไฟล์ Keys ที่ไม่ถูกต้องใน {0}",
"tr_TR": "",
"uk_UA": "Виявлено неправильний файл ключів у теці {0}",
"zh_CN": "在 {0} 发现了一个无效的密匙文件",
"zh_TW": "找到無效的金鑰檔案 {0}"
}
},
{
"ID": "DialogKeysInstaller_KeysInstallMessage",
"Translations": {
"ar_SA": "سيتم تثبيت ملف مفاتيح جديد.",
"de_DE": "Eine neue Schlüsseldatei wird installiert.",
"el_GR": "Ένα νέο αρχείο Κλειδιών θα εγκατασταθεί.",
"en_US": "New Keys file will be installed.",
"es_ES": "Un nuevo archivo de Claves será instalado.",
"fr_FR": "Nouveau fichier de Clés sera installé.",
"he_IL": "קובץ מפתחות חדש יותקן.",
"it_IT": "Un nuovo file di chiavi sarà installato.",
"ja_JP": "新しいキー ファイルがインストールされます。",
"ko_KR": "새로운 키 파일이 설치됩니다.",
"no_NO": "Ny Keys-fil vil bli installert.",
"pl_PL": "Nowy plik kluczy zostanie zainstalowany.",
"pt_BR": "O novo arquivo Chaves será instalado.",
"ru_RU": "Будут установлены новые ключи.",
"sv_SE": "Ny nyckelfil kommer att installeras.",
"th_TH": "กำลังติดตั้งไฟล์ Keys ใหม่",
"tr_TR": "Yeni anahtar dosyası yüklenecek.",
"uk_UA": "Новий файл Ключів буде встановлено.",
"zh_CN": "将会安装新密匙文件。",
"zh_TW": "將會安裝新增的金鑰檔案。"
}
},
{
"ID": "DialogKeysInstaller_KeysInstallSubMessage",
"Translations": {
"ar_SA": "\n\nقد يحل هذا محل بعض المفاتيح المثبتة حاليًا.",
"de_DE": "\n\nDies könnte einige der derzeit installierten Schlüssel ersetzen.",
"el_GR": "\n\nΑυτό μπορεί να αντικαταστήσει μερικά από τα τρέχοντα εγκατεστημένα κλειδιά.",
"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": "\n\nCela peut remplacer certaines des Clés actuellement installées.",
"he_IL": "\n\nזה עשוי להחליף חלק מהמפתחות המותקנים הנוכחיים.",
"it_IT": "\n\nAlcune delle chiavi già installate potrebbero essere sovrascritte.",
"ja_JP": "\n\nこれにより、現在インストールされているキーの一部が置き換えられる場合があります。",
"ko_KR": "\n\n이로 인해 현재 설치된 키 중 일부가 대체될 수 있습니다.",
"no_NO": "\n\nDette kan erstatte noen av de nåværende installerte nøklene.",
"pl_PL": "\n\nTo może zastąpić niektóre z aktualnie zainstalowanych kluczy.",
"pt_BR": "\n\nIsso pode substituir algumas das chaves instaladas atualmente.",
"ru_RU": "\n\nЭто может заменить некоторые из текущих установленных ключей.",
"sv_SE": "\n\nDetta kan ersätta några av de redan installerade nycklarna.",
"th_TH": "\n\nสิ่งนี้อาจทำให้ไฟล์ Keys บางส่วนที่ติดตั้งอยู่ถูกแทนที่",
"tr_TR": "\n\nBu, şu anda kurulu olan anahtarların bazılarının yerine geçebilir.",
"uk_UA": "\n\nЦе замінить собою поточні файли Ключів.",
"zh_CN": "\n\n这也许会替换掉一些当前已安装的密匙",
"zh_TW": "\n\n這將取代部分已安裝的金鑰。"
}
},
{
"ID": "DialogKeysInstaller_KeysInstallWaitMessage",
"Translations": {
"ar_SA": "جارٍ تثبيت المفاتيح...",
"de_DE": "Schlüssel werden installiert...",
"el_GR": "Εγκατάσταση κλειδιών...",
"en_US": "Installing Keys...",
"es_ES": "Instalando Claves...",
"fr_FR": "Installation des Clés...",
"he_IL": "מתקין מפתחות...",
"it_IT": "Installazione delle chiavi...",
"ja_JP": "キーをインストールしています...",
"ko_KR": "키 설치 중...",
"no_NO": "Installere nøkler...",
"pl_PL": "Instalowanie kluczy...",
"pt_BR": "Instalando Chaves...",
"ru_RU": "Установка ключей...",
"sv_SE": "Installerar nycklar...",
"th_TH": "กำลังดำเนินการติดตั้ง Keys...",
"tr_TR": "Anahtarlar yükleniyor...",
"uk_UA": "Встановлення Ключів...",
"zh_CN": "安装密匙中。。。",
"zh_TW": "正在安裝金鑰..."
}
},
{
"ID": "DialogKeysInstaller_KeysInstallSuccessMessage",
"Translations": {
"ar_SA": "تم تثبيت ملف المفاتيح الجديد بنجاح.",
"de_DE": "Neue Schlüsseldatei erfolgreich installiert.",
"el_GR": "Το νέο αρχείο Κλειδιών εγκαταστάθηκε με επιτυχία.",
"en_US": "New Keys file successfully installed.",
"es_ES": "Nuevo archivo Keys instalado con éxito.",
"fr_FR": "Nouveau fichier de Clés a été installé.",
"he_IL": "הקובץ החדש של המפתחות הותקן בהצלחה.",
"it_IT": "Nuovo file di chiavi installato con successo.",
"ja_JP": "新しいキー ファイルが正常にインストールされました。",
"ko_KR": "새로운 키 파일이 성공적으로 설치되었습니다.",
"no_NO": "Ny Keys -fil installert.",
"pl_PL": "Nowy plik kluczy został pomyślnie zainstalowany.",
"pt_BR": "Novo arquivo de chaves instalado com sucesso.",
"ru_RU": "Новые ключи успешно установлены.",
"sv_SE": "Ny nyckelfil installerades.",
"th_TH": "การติดตั้งไฟล์ Keys ใหม่เสร็จสมบูรณ์แล้ว",
"tr_TR": "Yeni anahtar dosyası başarıyla yüklendi.",
"uk_UA": "Нові ключі встановлено.",
"zh_CN": "已成功安装新密匙文件",
"zh_TW": "成功安裝新增的金鑰檔案。"
}
},
{
"ID": "UserError_NoKeys",
"Translations": {
"ar_SA": "المفاتيح غير موجودة",
"de_DE": "Keys nicht gefunden",
"el_GR": "Τα κλειδιά δεν βρέθηκαν",
"en_US": "Keys not found",
"es_ES": "No se encontraron claves",
"fr_FR": "Clés non trouvées",
"he_IL": "המפתחות לא נמצאו",
"it_IT": "Chiavi non trovate",
"ja_JP": "Keys がありません",
"ko_KR": "키를 찾을 수 없음",
"no_NO": "Finner ikke nøkler",
"pl_PL": "Nie znaleziono kluczy",
"pt_BR": "Chaves não encontradas",
"ru_RU": "Ключи не найдены",
"sv_SE": "Nycklarna hittades inte",
"th_TH": "ไม่พบ คีย์",
"tr_TR": "Keys bulunamadı",
"uk_UA": "Ключі не знайдено",
"zh_CN": "找不到密钥Keys",
"zh_TW": "找不到金鑰"
}
},
{
"ID": "UserError_NoKeys_Description",
"Translations": {
"ar_SA": "لم يتمكن ريوجينكس من العثور على ملف 'prod.keys' الخاص بك",
"de_DE": "Ryujinx konnte deine 'prod.keys' Datei nicht finden",
"el_GR": "Το Ryujinx δεν κατάφερε να εντοπίσει το αρχείο 'prod.keys'",
"en_US": "Ryujinx was unable to find your 'prod.keys' file",
"es_ES": "Ryujinx no pudo encontrar tus 'prod.keys'.",
"fr_FR": "Ryujinx n'a pas pu trouver votre fichier 'prod.keys'",
"he_IL": "ריוג'ינקס לא הצליח למצוא את קובץ ה-'prod.keys' שלך",
"it_IT": "Ryujinx non è riuscito a trovare il file 'prod.keys'",
"ja_JP": "'prod.keys' が見つかりませんでした",
"ko_KR": "Ryujinx가 'prod.keys' 파일을 찾지 못함",
"no_NO": "Ryujinx kunne ikke finne 'prod.keys' filen din",
"pl_PL": "Ryujinx nie mógł znaleźć twojego pliku 'prod.keys'",
"pt_BR": "Ryujinx não conseguiu encontrar o seu arquivo 'prod.keys'",
"ru_RU": "Ryujinx не удалось найти ваш 'prod.keys' файл",
"sv_SE": "Ryujinx kunde inte hitta din 'prod.keys'-fil",
"th_TH": "Ryujinx ไม่พบไฟล์ 'prod.keys' ในเครื่องของคุณ",
"tr_TR": "Ryujinx 'prod.keys' dosyasını bulamadı",
"uk_UA": "Ryujinx не вдалося знайти ваш файл «prod.keys».",
"zh_CN": "Ryujinx 模拟器找不到“prod.keys”密钥文件",
"zh_TW": "Ryujinx 無法找到您的「prod.keys」檔案"
}
}
]
}

View File

@ -0,0 +1,29 @@
{
"Locales": [
{
"ID": "MenuBarActions_OpenEditor",
"Translations": {
"ar_SA": "محرر Mii",
"de_DE": "Mii-Editor",
"el_GR": "Επεξεργαστής Mii",
"en_US": "Mii Editor",
"es_ES": "Editor de Mii",
"fr_FR": "Éditeur de Mii",
"he_IL": "עורך Mii",
"it_IT": "Editor di Mii",
"ja_JP": "Miiエディター",
"ko_KR": "Mii 편집기",
"no_NO": "Mii-redigerer",
"pl_PL": "Edytor Mii",
"pt_BR": "Editor de Mii",
"ru_RU": "Редактор Mii",
"sv_SE": "Mii-redigerare",
"th_TH": "ตัวแก้ไข Mii",
"tr_TR": "Mii Düzenleyicisi",
"uk_UA": "Редактор Mii",
"zh_CN": "Mii 编辑器",
"zh_TW": "Mii 編輯器"
}
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,904 @@
{
"Locales": [
{
"ID": "MenuBarActions_OpenTrimmer",
"Translations": {
"ar_SA": "محرر XCI",
"de_DE": "XCI-Trimmer",
"el_GR": "Επεξεργαστής XCI",
"en_US": "XCI Trimmer",
"es_ES": "Recortador de XCI",
"fr_FR": "Réducteur de XCI",
"he_IL": "מעמד XCI",
"it_IT": "Trimmer XCI",
"ja_JP": "XCIトリマー",
"ko_KR": "XCI 파일 트리머",
"no_NO": "XCI-trimmer",
"pl_PL": "Przycinacz XCI",
"pt_BR": "Cortador de XCI",
"ru_RU": "Триммер XCI",
"sv_SE": "XCI-trimmer",
"th_TH": "ตัวตัด XCI",
"tr_TR": "XCI Kesici",
"uk_UA": "Тример XCI",
"zh_CN": "XCI 剪裁工具",
"zh_TW": "XCI 修剪工具"
}
},
{
"ID": "MenuBarActions_OpenTrimmer_ToolTip",
"Translations": {
"ar_SA": "يقلل من حجم ملفات XCI (نسخ بطاقات الألعاب) عن طريق إزالة المساحة الفارغة وغير المستخدمة. لا يؤثر على أداء اللعبة.",
"de_DE": "Reduziert die Größe der XCI-Dateien (Spiele-Cartridge-Dumps) durch Entfernen von leerem, ungenutztem Speicher. Hat keine Auswirkungen auf die Spielleistung.",
"el_GR": "Μειώνει το μέγεθος των αρχείων XCI (αντίγραφα καρτών παιχνιδιών) αφαιρώντας κενό, αχρησιμοποίητο χώρο. Δεν επηρεάζει την απόδοση του παιχνιδιού.",
"en_US": "Reduces XCI file sizes (game cartridge dumps) by removing empty, unused space. Does not impact game performance.",
"es_ES": "Reduce el tamaño de los archivos XCI (copias de cartuchos de juegos) eliminando espacio vacío y no utilizado. No afecta al rendimiento del juego.",
"fr_FR": "Réduit la taille des fichiers XCI (copies de cartouches de jeux) en supprimant l'espace vide et inutilisé. N'affecte pas les performances du jeu.",
"he_IL": "מקטין את גודל קבצי ה-XCI (גיבויים של קרטידות משחק) על ידי הסרת שטח ריק ולא בשימוש. לא משפיע על ביצועי המשחק.",
"it_IT": "Riduce la dimensione dei file XCI (backup di cartucce di gioco) rimuovendo spazio vuoto e inutilizzato. Non influisce sulle prestazioni del gioco.",
"ja_JP": "XCIファイルゲームカートリッジのダンプのサイズを空の未使用スペースを削除することにより減らします。ゲームのパフォーマンスには影響しません。",
"ko_KR": "XCI 파일(게임 카트리지 덤프)의 크기를 빈 공간과 사용되지 않는 데이터를 제거하여 줄입니다. 게임 성능에 영향을 미치지 않습니다.",
"no_NO": "Reduserer størrelsen på XCI-filene (spillkassett-dumper) ved å fjerne tomt, ubrukt plass. Påvirker ikke spillprestasjonen.",
"pl_PL": "Redukuje rozmiar plików XCI (zrzutów kartridży gier) przez usunięcie pustej, nieużywanej przestrzeni. Nie wpływa na wydajność gry.",
"pt_BR": "Reduz o tamanho dos arquivos XCI (dumps de cartuchos de jogos) removendo espaço vazio e não utilizado. Não afeta o desempenho do jogo.",
"ru_RU": "Уменьшает размер файлов XCI (дампов картриджей игр) удалением пустого, неиспользуемого пространства. Не влияет на производительность игры.",
"sv_SE": "Minskar storleken på XCI-filer (spelkartridgdumps) genom att ta bort tomt, oanvänt utrymme. Påverkar inte spelprestanda.",
"th_TH": "ลดขนาดไฟล์ XCI (ดัมพ์ตลับเกม) โดยการลบพื้นที่ว่างและไม่ได้ใช้งานออกจากไฟล์ ไม่กระทบต่อประสิทธิภาพเกม",
"tr_TR": "XCI dosya boyutlarını (oyun kartuşu dökümleri) boş ve kullanılmayan alanları kaldırarak küçültür. Oyun performansını etkilemez.",
"uk_UA": "Зменшує розмір файлів XCI (дампів картриджів ігор) видаленням порожнього, невикористовуваного простору. Не впливає на продуктивність гри.",
"zh_CN": "通过删除空的、未使用的空间来减少 XCI 文件(游戏卡带转储)大小。不会影响游戏性能。",
"zh_TW": "透過移除空的、未使用的空間來減少 XCI 檔案(遊戲卡匣轉存)大小。對遊戲性能無影響。"
}
},
{
"ID": "GameListContextMenu_Trim",
"Translations": {
"ar_SA": "تقليم XCI",
"de_DE": "Zuschneiden der XCI",
"el_GR": "Κοπή XCI",
"en_US": "Trim XCI",
"es_ES": "Recortar XCI",
"fr_FR": "Réduire le XCI",
"he_IL": "חתוך XCI",
"it_IT": "Riduci il XCI",
"ja_JP": "XCIをトリム",
"ko_KR": "XCI 트림",
"no_NO": null,
"pl_PL": "Przytnij XCI",
"pt_BR": "Reduzir o XCI",
"ru_RU": "Обрезать XCI",
"sv_SE": "Optimera XCI",
"th_TH": "ลดขนาด XCI",
"tr_TR": "XCI'yi Kırp",
"uk_UA": "Нарізка XCI",
"zh_CN": "精简 XCI",
"zh_TW": "修剪 XCI"
}
},
{
"ID": "StatusBar_Trimming",
"Translations": {
"ar_SA": "جاري تقليم: {0}",
"de_DE": "Schneide: {0}",
"el_GR": "Κόβει το: {0}",
"en_US": "Trimming: {0}",
"es_ES": "Recortando: {0}",
"fr_FR": "Réduction de: {0}",
"he_IL": "חיתוך: {0}",
"it_IT": "Riduzione di: {0}",
"ja_JP": "{0} をトリミング中:",
"ko_KR": "{0} 트리밍:",
"no_NO": "Trimming av: {0}",
"pl_PL": "Przycinanie: {0}",
"pt_BR": "Reduzindo: {0}",
"ru_RU": "Обрезка: {0}",
"sv_SE": "Trimmar: {0}",
"th_TH": "กำลังตัด: {0}",
"tr_TR": "{0} Kısaltılıyor:",
"uk_UA": "Обрізка: {0}",
"zh_CN": "正在修剪: {0}",
"zh_TW": "正在修剪: {0}"
}
},
{
"ID": "TitleStatus_PartialLabel",
"Translations": {
"ar_SA": "جزئي",
"de_DE": "Teilweise",
"el_GR": "Μερικό",
"en_US": "Partial",
"es_ES": "Parcial",
"fr_FR": "Partiel",
"he_IL": "חלקי",
"it_IT": "Parziale",
"ja_JP": "部分的",
"ko_KR": "일부",
"no_NO": "Delvis",
"pl_PL": "Częściowy",
"pt_BR": "Parcial",
"ru_RU": "Частично",
"sv_SE": "Delvis",
"th_TH": "ยังไม่สมบูรณ์",
"tr_TR": "Kısmi",
"uk_UA": "Часткові",
"zh_CN": "分区",
"zh_TW": "部分"
}
},
{
"ID": "TitleStatus_TrimmableLabel",
"Translations": {
"ar_SA": "غير مُقَصَّص",
"de_DE": "Ungetrimmt",
"el_GR": "Ακέραιο",
"en_US": "Untrimmed",
"es_ES": "Sin Recortar",
"fr_FR": "Non Réduit",
"he_IL": "לא מקוצץ",
"it_IT": "Non Rifilato",
"ja_JP": "未トリミング",
"ko_KR": "트리밍되지 않음",
"no_NO": "Ikke trimmet",
"pl_PL": "Nieprzycięty",
"pt_BR": "Não Reduzido",
"ru_RU": "Не обрезан",
"sv_SE": "Oklippt",
"th_TH": "ยังไม่ตัดแต่ง",
"tr_TR": "Kesilmemiş",
"uk_UA": "Не обрізані",
"zh_CN": "未修剪",
"zh_TW": "未修剪"
}
},
{
"ID": "TitleStatus_UntrimmableLabel",
"Translations": {
"ar_SA": "مقصوص",
"de_DE": "Getrimmt",
"el_GR": "Κομμένο",
"en_US": "Trimmed",
"es_ES": "Recortado",
"fr_FR": "Réduit",
"he_IL": "מקוצץ",
"it_IT": "Rifilato",
"ja_JP": "トリミング済み",
"ko_KR": "트리밍됨",
"no_NO": "Trimmet",
"pl_PL": "Przycięty",
"pt_BR": "Reduzido",
"ru_RU": "Обрезан",
"sv_SE": "Optimerad",
"th_TH": "ตัดแต่งแล้ว",
"tr_TR": "Kesilmiş",
"uk_UA": "Обрізані",
"zh_CN": "经过瘦身的",
"zh_TW": "已修剪"
}
},
{
"ID": "TitleStatus_FailedLabel",
"Translations": {
"ar_SA": "(فشل)",
"de_DE": "(Fehlgeschlagen)",
"el_GR": "(Απέτυχε)",
"en_US": "(Failed)",
"es_ES": "(Fallido)",
"fr_FR": "(Échoué)",
"he_IL": "(נכשל)",
"it_IT": "(Fallito)",
"ja_JP": "(失敗)",
"ko_KR": "(실패)",
"no_NO": "(Mislyktes)",
"pl_PL": "(Niepowodzenie)",
"pt_BR": "(Falhou)",
"ru_RU": "(Ошибка)",
"sv_SE": "(Misslyckades)",
"th_TH": "(ล้มเหลว)",
"tr_TR": "(Başarısız)",
"uk_UA": "(Невдача)",
"zh_CN": "(失败)",
"zh_TW": "(失敗)"
}
},
{
"ID": "Title_CanSaveLabel",
"Translations": {
"ar_SA": "حفظ {0} ميغابايت",
"de_DE": "Speichern {0} MB",
"el_GR": "Αποθήκευση {0} MB",
"en_US": "Save {0} MB",
"es_ES": "Ahorra {0} MB",
"fr_FR": "Économisez {0} Mo",
"he_IL": "שמור {0} מגה-בייט",
"it_IT": "Risparmia {0} MB",
"ja_JP": "{0}MBを保存",
"ko_KR": "{0}MB 저장",
"no_NO": "Spare {0} MB",
"pl_PL": "Zapisz {0} MB",
"pt_BR": "Salvar {0} MB",
"ru_RU": "Освободить {0} Мб",
"sv_SE": "Spara {0} MB",
"th_TH": "บันทึก {0} เมกะไบต์",
"tr_TR": "Kaydet {0} MB",
"uk_UA": "Зберегти {0} Мб",
"zh_CN": "能节约 {0} MB",
"zh_TW": "可節省 {0} MB"
}
},
{
"ID": "Title_SavingLabel",
"Translations": {
"ar_SA": "تم حفظ {0} ميغابايت",
"de_DE": "Gespeichert {0} MB",
"el_GR": "Αποθηκεύτηκαν {0} MB",
"en_US": "Saved {0} MB",
"es_ES": "{0} MB Ahorrado(s)",
"fr_FR": "{0} Mo Économisés",
"he_IL": "נשמרו {0} מגה-בייט",
"it_IT": "Risparmiati {0} MB",
"ja_JP": "{0}MBが保存されました",
"ko_KR": "{0}MB 저장됨",
"no_NO": "Spart {0} Mb",
"pl_PL": "Zapisano {0} MB",
"pt_BR": "Salvo {0} Mb",
"ru_RU": "Освобождено {0} Мб",
"sv_SE": "Sparade {0} Mb",
"th_TH": "บันทึกแล้ว {0} เมกะไบต์",
"tr_TR": "Kaydedildi {0} MB",
"uk_UA": "Збережено {0} Мб",
"zh_CN": "节约了 {0} MB",
"zh_TW": "已節省 {0} MB"
}
},
{
"ID": "TrimFileDialog_PrimaryText",
"Translations": {
"ar_SA": "يقوم بتقليص المساحة غير المستخدمة في XCI لتوفير مساحة القرص.",
"de_DE": "Trimmt ungenutzten Speicherplatz in der XCI, um Speicherplatz zu sparen.",
"el_GR": "Περικόπτει τον μη χρησιμοποιούμενο χώρο στο XCI για εξοικονόμηση χώρου στον δίσκο.",
"en_US": "Trims unused space in the XCI to save disk space.",
"es_ES": "Recorta el espacio no utilizado en el XCI para ahorrar espacio en disco.",
"fr_FR": "Supprime lespace inutilisé dans le XCI afin déconomiser de lespace disque.",
"he_IL": "מקצץ שטח לא בשימוש ב-XCI כדי לחסוך מקום בדיסק.",
"it_IT": "Rimuove lo spazio inutilizzato nell'XCI per risparmiare spazio su disco.",
"ja_JP": "XCI内の未使用領域をトリムしてディスク容量を節約します。",
"ko_KR": "XCI의 사용되지 않는 공간을 트리밍하여 디스크 공간을 절약합니다.",
"no_NO": "Fjerner ubrukt plass i XCI for å spare diskplass.",
"pl_PL": "Przycina nieużywane miejsce w XCI, aby zaoszczędzić miejsce na dysku.",
"pt_BR": "Remove o espaço não utilizado no XCI para economizar espaço em disco.",
"ru_RU": "Обрезает неиспользуемое пространство в XCI для экономии места на диске.",
"sv_SE": "Trimmar oanvänt utrymme i XCI för att spara diskutrymme.",
"th_TH": "ตัดแต่งพื้นที่ที่ไม่ได้ใช้งานใน XCI เพื่อประหยัดพื้นที่ดิสก์",
"tr_TR": "Disk alanından tasarruf etmek için XCI'deki kullanılmayan alanı kırpar.",
"uk_UA": "Обрізає невикористаний простір у XCI для економії місця на диску.",
"zh_CN": "修剪 XCI 中的未使用空间以节省磁盘空间。",
"zh_TW": "修剪 XCI 中的未使用空間以節省磁碟空間。"
}
},
{
"ID": "TrimFileDialog_SecondaryText",
"Translations": {
"ar_SA": "حجم الملف: {0:n} ميجابايت\nحجم اللعبة: {1:n} ميجابايت\nالتوفير: {2:n} ميجابايت",
"de_DE": "Dateigröße: {0:n} MB\nSpielgröße: {1:n} MB\nErsparnis: {2:n} MB",
"el_GR": "Μέγεθος αρχείου: {0:n} MB\nΜέγεθος παιχνιδιού: {1:n} MB\nΕξοικονόμηση: {2:n} MB",
"en_US": "File Size: {0:n} MB\nGame Size: {1:n} MB\nSavings: {2:n} MB",
"es_ES": "Tamaño de archivo: {0:n} MB\nTamaño del juego: {1:n} MB\nAhorro: {2:n} MB",
"fr_FR": "Taille du fichier: {0:n} Mo\nTaille du jeu: {1:n} Mo\nÉconomies: {2:n} Mo",
"he_IL": "גודל הקובץ: {0:n} MB\nגודל המשחק: {1:n} MB\nחיסכון: {2:n} MB",
"it_IT": "Dimensione file: {0:n} MB\nDimensione del gioco: {1:n} MB\nRisparmio: {2:n} MB",
"ja_JP": "ファイルサイズ: {0:n} MB\nゲームサイズ: {1:n} MB\n節約: {2:n} MB",
"ko_KR": "파일 크기: {0:n} MB\n게임 크기: {1:n} MB\n절약: {2:n} MB",
"no_NO": "Filstørrelse: {0:n} MB\nSpillstørrelse: {1:n} MB\nBesparelse: {2:n} MB",
"pl_PL": "Rozmiar pliku: {0:n} MB\nRozmiar gry: {1:n} MB\nOszczędności: {2:n} MB",
"pt_BR": "Tamanho do arquivo: {0:n} MB\nTamanho do jogo: {1:n} MB\nEconomia: {2:n} MB",
"ru_RU": "Размер файла: {0:n} Мб\nРазмер игры: {1:n} MB\nЭкономия: {2:n} Мб",
"sv_SE": "Filstorlek: {0:n} MB\nSpelstorlek: {1:n} MB\nSparat: {2:n} MB",
"th_TH": "ขนาดไฟล์: {0:n} MB\nขนาดเกม: {1:n} MB\nการประหยัด: {2:n} MB",
"tr_TR": "Dosya Boyutu: {0:n} MB\nOyun Boyutu: {1:n} MB\nTasarruf: {2:n} MB",
"uk_UA": "Розмір файлу: {0:n} Мб\nРозмір гри: {1:n} MB\nЕкономія: {2:n} Мб",
"zh_CN": "文件大小: {0:n} MB\n游戏大小: {1:n} MB\n节省: {2:n} MB",
"zh_TW": "檔案大小: {0:n} MB\n遊戲大小: {1:n} MB\n節省: {2:n} MB"
}
},
{
"ID": "TrimFile_NoTrimNecessary",
"Translations": {
"ar_SA": "لا حاجة لتقليص XCI. تحقق من السجلات للتفاصيل.",
"de_DE": "XCI muss nicht beschnitten werden. Überprüfen Sie die Logs für Details.",
"el_GR": "Το XCI δεν χρειάζεται να μειωθεί. Ελέγξτε τα αρχεία καταγραφής για λεπτομέρειες.",
"en_US": "XCI does not require trimming. Check logs for details.",
"es_ES": "El XCI no necesita ser recortado. Verifica los logs para detalles.",
"fr_FR": "Le XCI na pas besoin dêtre réduit. Référez-vous aux journaux pour détails.",
"he_IL": "XCI לא צריך להיות מקוצץ. עיין ביומנים לפרטים.",
"it_IT": "Non è necessario ridurre la dimensione del XCI. Controlla i log per dettagli.",
"ja_JP": "XCIはトリミングする必要はありません。詳細についてはログを確認してください。",
"ko_KR": "XCI는 트리밍할 필요가 없습니다. 자세한 내용은 로그를 확인.",
"no_NO": "XCI trenger ikke å trimmes. Sjekk loggene for detaljer.",
"pl_PL": "XCI nie wymaga przycinania. Sprawdź dzienniki, aby uzyskać szczegóły.",
"pt_BR": "O XCI não precisa ser reduzido. Verifique os logs para detalhes.",
"ru_RU": "XCI не требует обрезки. Проверьте логи для подробностей.",
"sv_SE": "XCI behöver inte optimeras. Kontrollera loggen för detaljer.",
"th_TH": "XCI ไม่จำเป็นต้องถูกตัดแต่ง โปรดตรวจสอบบันทึกสำหรับรายละเอียด",
"tr_TR": "XCI kırpılmasına gerek yok. Ayrıntılar için günlükleri kontrol edin.",
"uk_UA": "XCI не потребує обрізання. Перевірте журнали для отримання деталей.",
"zh_CN": "XCI 不需要被瘦身。查看日志以获得更多细节。",
"zh_TW": "XCI 不需要修剪。檢查日誌以取得更多資訊。"
}
},
{
"ID": "TrimFile_NoUntrimPossible",
"Translations": {
"ar_SA": "لا يمكن إعادة التعديل على XCI. تحقق من السجلات للتفاصيل.",
"de_DE": "XCI kann nicht wiederhergestellt werden. Überprüfen Sie die Logs für Details.",
"el_GR": "Το XCI δεν μπορεί να επαναφερθεί. Ελέγξτε τα αρχεία καταγραφής για λεπτομέρειες.",
"en_US": "XCI cannot be untrimmed. Check logs for details.",
"es_ES": "El recorte del XCI no puede ser deshecho. Verifica los registros para detalles.",
"fr_FR": "Le XCI ne peut être restauré. Référez-vous aux journaux pour détails.",
"he_IL": "לא ניתן להחזיר את XCI לגרסתו המקורית. עיין ביומנים לפרטים.",
"it_IT": "XCI non può essere ripristinato. Controlla i log per dettagli.",
"ja_JP": "XCIは元に戻せません。詳細はログを確認してください。",
"ko_KR": "XCI는 복원할 수 없습니다. 자세한 내용은 로그를 확인.",
"no_NO": "XCI kan ikke gjenopprettes. Sjekk loggene for detaljer.",
"pl_PL": "XCI nie może zostać przywrócone. Sprawdź dzienniki, aby uzyskać szczegóły.",
"pt_BR": "XCI não pode ser desfeito. Verifique os logs para detalhes.",
"ru_RU": "XCI не может быть восстановлен. Проверьте журналы для подробностей.",
"sv_SE": "XCI kan inte återställas. Kontrollera loggen för detaljer.",
"th_TH": "ไม่สามารถคืนค่า XCI ได้ โปรดตรวจสอบบันทึกสำหรับรายละเอียด",
"tr_TR": "XCI geri alınamaz. Ayrıntılar için günlükleri kontrol edin.",
"uk_UA": "XCI не можна відновити. Перевірте журнали для деталей.",
"zh_CN": "XCI 不能恢复。查看日志以获取详情。",
"zh_TW": "XCI 無法恢復。檢查日誌以取得詳情。"
}
},
{
"ID": "TrimFile_ReadOnlyFileCannotFix",
"Translations": {
"ar_SA": "XCI للقراءة فقط ولا يمكن جعله قابلًا للكتابة. تحقق من السجلات للتفاصيل.",
"de_DE": "XCI ist schreibgeschützt und konnte nicht beschreibbar gemacht werden. Überprüfen Sie die Logs für Details.",
"el_GR": "Το XCI είναι μόνο για ανάγνωση και δεν γίνεται γράψιμο. Ελέγξτε τα logs για λεπτομέρειες.",
"en_US": "XCI is Read Only and could not be made writable. Check logs for details.",
"es_ES": "XCI es solo lectura y no se puede escribir. Verifica los registros para detalles.",
"fr_FR": "XCI en Lecture Seule et n'a pas pu être rendu écrivable. Référez-vous aux journaux pour détails.",
"he_IL": "XCI רק לקריאה ולא ניתן להפוך אותו לניתן לכתיבה. בדוק את היומנים לפרטים.",
"it_IT": "XCI è solo lettura e non può essere scritto. Controlla i log per dettagli.",
"ja_JP": "XCIは読み取り専用で書き込み不可。ログを確認してください。",
"ko_KR": "XCI 파일은 읽기 전용이며 쓰기 불가. 로그를 확인하십시오.",
"no_NO": "XCI er skrivebeskyttet og kunne ikke gjøres skrivbar. Sjekk loggene for detaljer.",
"pl_PL": "XCI jest tylko do odczytu i nie można zapisać. Sprawdź logi dla szczegółów.",
"pt_BR": "XCI é somente leitura e não pode ser gravado. Verifique os logs para detalhes.",
"ru_RU": "XCI только для чтения, не стал доступен для записи. Проверьте журналы для подробностей.",
"sv_SE": "XCI är skrivskyddad och kunde inte göras skrivbar. Kontrollera loggen för detaljer.",
"th_TH": "XCI เป็นอ่านอย่างเดียวและไม่สามารถเขียนได้ ตรวจสอบบันทึกสำหรับรายละเอียด",
"tr_TR": "XCI sadece okunabilir, yazılamaz. Günlükleri kontrol edin için detaylar.",
"uk_UA": "XCI тільки для читання і не можна записати. Перевірте логи для деталей.",
"zh_CN": "XCI 只读,无法写入。查看日志以获取详情。",
"zh_TW": "XCI 檔案唯讀,無法寫入。檢查日誌以取得詳情。"
}
},
{
"ID": "TrimFile_FileSizeChanged",
"Translations": {
"ar_SA": "تم تغيير حجم XCI منذ مسحه ضوئيًا. تأكد من أن الملف غير قيد الكتابة وحاول مرة أخرى.",
"de_DE": "Die Größe von XCI hat sich seit dem Scannen geändert. Stellen Sie sicher, dass die Datei nicht beschrieben wird, und versuchen Sie es erneut.",
"el_GR": "Το μέγεθος του XCI έχει αλλάξει από τότε που σκανάρεται. Ελέγξτε ότι το αρχείο δεν γράφεται και προσπαθήστε ξανά.",
"en_US": "XCI size changed since last scan. Ensure the file is not being written to and try again.",
"es_ES": "El tamaño de XCI ha cambiado desde que fue escaneado. Verifica que no se esté escribiendo al archivo y vuelve a intentarlo.",
"fr_FR": "La taille de XCI a changé depuis son analyse. Vérifiez que le fichier nest pas en cours décriture, puis réessayez.",
"he_IL": "גודל ה-XCI השתנה מאז סריקתו. ודא שהקובץ לא נכתב ונסה שוב.",
"it_IT": "La dimensione di XCI è cambiata da quando è stato scansionato. Controlla che il file non sia scritto e riprova.",
"ja_JP": "XCIのサイズがスキャン後に変更されました。ファイルが書き込まれていないことを確認し、再試行してください。",
"ko_KR": "XCI 크기가 스캔 후 변경되었습니다. 파일이 쓰여지고 있지 않은지 확인하고 다시 시도하세요.",
"no_NO": "XCI har endret størrelse siden den ble skannet. Kontroller at det ikke skrives til filen, og prøv på nytt.",
"pl_PL": "Rozmiar XCI zmienił się od momentu zeskanowania. Sprawdź, czy plik nie jest zapisywany, a następnie spróbuj ponownie.",
"pt_BR": "O tamanho de XCI mudou desde que foi escaneado. Verifique se o arquivo não está sendo gravado e tente novamente.",
"ru_RU": "Размер XCI изменился после сканирования. Проверьте, не записывается ли файл, и попробуйте снова.",
"sv_SE": "XCI har ändrats i storlek sedan den lästes av. Kontrollera att filen inte skrivs till och försök igen.",
"th_TH": "ขนาด XCI เปลี่ยนไปตั้งแต่การสแกนครั้งล่าสุด ตรวจสอบว่าไฟล์ไม่ได้ถูกเขียน และลองใหม่",
"tr_TR": "XCI dosyasının boyutu tarandıktan sonra değişti. Dosyaya yazılmadığından emin olun ve tekrar deneyin.",
"uk_UA": "Розмір XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову.",
"zh_CN": "XCI 在扫描后大小发生了变化。请检查文件是否未被写入,然后重试。",
"zh_TW": "XCI 檔案大小自上次掃描以來已經改變。請檢查檔案是否未被寫入,然後再嘗試。"
}
},
{
"ID": "TrimFile_FreeSpaceCheckFailed",
"Translations": {
"ar_SA": "XCI يحتوي على بيانات في المساحة الحرة. لا يعد من الآمن تقليصه.",
"de_DE": "XCI enthält Daten im freien Speicherbereich. Es ist nicht sicher, sie zu trimmen.",
"el_GR": "Το XCI περιέχει δεδομένα στην περιοχή ελεύθερου χώρου. Δεν είναι ασφαλές να το μειώσετε.",
"en_US": "XCI has data in the free space area. It is not safe to trim.",
"es_ES": "XCI tiene datos en el área de espacio libre. No es seguro recortarlo.",
"fr_FR": "XCI contient des données dans la zone d'espace libre. Il n'est pas sûr de le réduire.",
"he_IL": "XCI מכיל נתונים באזור של שטח פנוי. לא בטוח לגזור אותו.",
"it_IT": "XCI contiene dati nell'area di spazio libero. Non è sicuro ridurre la sua dimensione.",
"ja_JP": "XCIファイルには空き領域にデータが含まれているため、トリミングするのは安全ではありません。",
"ko_KR": "XCI 파일에 여유 공간 영역에 데이터가 있으므로 트리밍하는 것이 안전하지 않습니다.",
"no_NO": "XCI har data i den ledige plassen. Det er ikke trygt å trimme den.",
"pl_PL": "XCI zawiera dane w obszarze wolnego miejsca. Nie jest bezpieczne go przycinać.",
"pt_BR": "XCI tem dados na área de espaço livre. Não é seguro reduzi-lo.",
"ru_RU": "XCI содержит данные в свободной области. Его обрезка небезопасна.",
"sv_SE": "XCI har data i det lediga utrymmet. Det är inte säkert att optimera.",
"th_TH": "XCI มีข้อมูลในพื้นที่ว่าง จึงไม่ปลอดภัยที่จะทำการตัดแต่ง",
"tr_TR": "XCI dosyasının boş alanında veriler var. Bu yüzden kesilmesi güvenli değildir.",
"uk_UA": "XCI містить дані в зоні вільного простору. Тому обрізка небезпечна.",
"zh_CN": "XCI 文件的空闲区域内有数据。不能安全瘦身。",
"zh_TW": "XCI 檔案有數據儲存於空閒區域。修剪不安全。"
}
},
{
"ID": "TrimFile_InvalidXCIFile",
"Translations": {
"ar_SA": "XCI يحتوي على بيانات غير صالحة. تحقق من السجلات للتفاصيل.",
"de_DE": "XCI enthält ungültige Daten. Überprüfen Sie die Protokolle für Details.",
"el_GR": "Το XCI περιέχει μη έγκυρα δεδομένα. Ελέγξτε τα αρχεία καταγραφής για λεπτομέρειες.",
"en_US": "XCI contains invalid data. Check logs for details.",
"es_ES": "XCI contiene datos inválidos. Lee el registro para detalles.",
"fr_FR": "XCI contient des données invalides. Référez-vous aux journaux pour détails.",
"he_IL": "XCI מכיל נתונים לא חוקיים. בדוק את היומנים לפרטים.",
"it_IT": "XCI contiene dati non validi. Controlla i log per dettagli.",
"ja_JP": "XCIファイルに無効なデータが含まれています。ログを確認してください。",
"ko_KR": "XCI 파일에 유효하지 않은 데이터가 포함되어 있습니다. 로그를 확인하세요.",
"no_NO": "XCI-filen inneholder ugyldige data. Sjekk loggene for detaljer.",
"pl_PL": "XCI zawiera nieprawidłowe dane. Sprawdź dzienniki, aby uzyskać szczegóły.",
"pt_BR": "XCI contém dados inválidos. Verifique os logs para detalhes.",
"ru_RU": "XCI содержит недопустимые данные. Проверьте журналы для подробностей.",
"sv_SE": "XCI-filen innehåller ogiltig data. Kontrollera loggen för detaljer.",
"th_TH": "XCI มีข้อมูลที่ไม่ถูกต้อง โปรดตรวจสอบบันทึกสำหรับรายละเอียด",
"tr_TR": "XCI dosyası geçersiz veriler içeriyor. Günlükleri kontrol edin.",
"uk_UA": "XCI містить недійсні дані. Перевірте журнали для деталей.",
"zh_CN": "XCI 文件含有无效数据。查看日志以获得更多细节。",
"zh_TW": "XCI 檔案帶有無效的數據。檢查日誌以取得更多資訊"
}
},
{
"ID": "TrimFile_FileIOWriteError",
"Translations": {
"ar_SA": "لا يمكن فتح XCI للكتابة. تحقق من السجلات للتفاصيل.",
"de_DE": "XCI konnte nicht zum Schreiben geöffnet werden. Überprüfen Sie die Protokolle für Details.",
"el_GR": "Το XCI δεν μπόρεσε να ανοιχτεί για εγγραφή. Ελέγξτε τα αρχεία καταγραφής για λεπτομέρειες.",
"en_US": "XCI could not be opened for writing. Check logs for details.",
"es_ES": "XCI no se puede abrir para escribir. Lee el registro para detalles.",
"fr_FR": "XCI n'a pas pu être ouvert pour écriture. Consultez les journaux pour détails.",
"he_IL": "לא ניתן לפתוח XCI לכתיבה. בדוק את היומנים לפרטים.",
"it_IT": "XCI non può essere aperto in scrittura. Controlla i log per dettagli.",
"ja_JP": "XCIは書き込み用に開けませんでした。ログを確認してください。",
"ko_KR": "XCI를 쓰기 위해 열 수 없습니다. 로그를 확인하세요.",
"no_NO": "XCI kunne ikke åpnes for skriving. Sjekk loggene for detaljer.",
"pl_PL": "Nie można otworzyć XCI do zapisu. Sprawdź dzienniki, aby uzyskać szczegóły.",
"pt_BR": "XCI não pôde ser aberto para gravação. Verifique os logs para detalhes.",
"ru_RU": "Не удалось открыть XCI для записи. Проверьте журналы для подробностей.",
"sv_SE": "XCI kunde inte öppnas för skrivning. Kontrollera loggen för detaljer.",
"th_TH": "ไม่สามารถเปิด XCI เพื่อเขียนข้อมูลได้ โปรดตรวจสอบบันทึกสำหรับรายละเอียด",
"tr_TR": "XCI yazma için açılamadı. Günlükleri kontrol edin.",
"uk_UA": "Не вдалося відкрити XCI для запису. Перевірте журнали для деталей.",
"zh_CN": "XCI 不能写入。查看日志以获得更多细节。",
"zh_TW": "XCI 無法開啟以進行寫入。請檢查日誌以取得更多資訊。"
}
},
{
"ID": "TrimFile_FailedPrimaryText",
"Translations": {
"ar_SA": "فشل في تقليم XCI",
"de_DE": "Trimming der XCI fehlgeschlagen",
"el_GR": "Η περικοπή του XCI απέτυχε",
"en_US": "Failed to trim XCI",
"es_ES": "El recorte del XCI falló",
"fr_FR": "Réduction du XCI a échoué",
"he_IL": "נכשל בניסיונות לקצץ את XCI",
"it_IT": "Riduzione del XCI fallita",
"ja_JP": "XCIのトリミングに失敗しました",
"ko_KR": "XCI 트리밍에 실패",
"no_NO": "Trimming av XCI mislyktes",
"pl_PL": "Nie udało się przyciąć XCI",
"pt_BR": "A redução do XCI falhou",
"ru_RU": "Обрезка XCI не удалась",
"sv_SE": "Optimering av XCI misslyckades",
"th_TH": "การตัดแต่ง XCI ล้มเหลว",
"tr_TR": "XCI kesme başarısız",
"uk_UA": "Не вдалося обрізати XCI",
"zh_CN": "XCI 瘦身失败",
"zh_TW": "修剪 XCI 失敗"
}
},
{
"ID": "TrimFile_Cancelled",
"Translations": {
"ar_SA": "تم إلغاء العملية",
"de_DE": "Der Vorgang wurde abgebrochen",
"el_GR": "Η λειτουργία ακυρώθηκε",
"en_US": "The operation was cancelled",
"es_ES": "La operación fue cancelada",
"fr_FR": "L'opération a été annulée",
"he_IL": "הפעולה בוטלה",
"it_IT": "L'operazione è stata annullata",
"ja_JP": "操作がキャンセルされました",
"ko_KR": "작업이 취소됨",
"no_NO": "Operasjonen ble avlyst",
"pl_PL": "Operacja została anulowana",
"pt_BR": "A operação foi cancelada",
"ru_RU": "Операция была отменена",
"sv_SE": "Åtgärden avbröts",
"th_TH": "การดำเนินการถูกยกเลิกแล้ว",
"tr_TR": "İşlem iptal edildi",
"uk_UA": "Операція перервана",
"zh_CN": "操作已取消",
"zh_TW": "操作已取消"
}
},
{
"ID": "TrimFile_FileUndertermined",
"Translations": {
"ar_SA": "لم يتم إجراء أي عملية",
"de_DE": "Es wurde keine Operation durchgeführt",
"el_GR": "Καμία ενέργεια δεν εκτελέστηκε",
"en_US": "No operation was performed",
"es_ES": "No se realizó ninguna operación",
"fr_FR": "Aucune opération n'a été effectuée",
"he_IL": "לא בוצעה שום פעולה",
"it_IT": "Non è stata effettuata alcuna operazione",
"ja_JP": "操作は実行されませんでした",
"ko_KR": "작업이 수행되지 않음",
"no_NO": "Ingen operasjon ble utført",
"pl_PL": "Nie wykonano żadnej operacji",
"pt_BR": "Nenhuma operação foi realizada",
"ru_RU": "Операция не была выполнена",
"sv_SE": "Ingen åtgärd genomfördes",
"th_TH": "ไม่มีการดำเนินการใด ๆ ที่ถูกทำขึ้น",
"tr_TR": "Hiçbir işlem yapılmadı",
"uk_UA": "Операція не була виконана",
"zh_CN": "未执行操作",
"zh_TW": "未執行任何操作"
}
},
{
"ID": "TitleStatusCount",
"Translations": {
"ar_SA": "العناوين المحددة: {0}/{1}",
"de_DE": "Titel Ausgewählt: {0}/{1}",
"el_GR": "Τίτλοι Επιλεγμένοι: {0}/{1}",
"en_US": "Titles Selected: {0}/{1}",
"es_ES": "Títulos Seleccionados: {0}/{1}",
"fr_FR": "Fichiers Sélectionnés: {0}/{1}",
"he_IL": "כותרות נבחרות: {0}/{1}",
"it_IT": "Titoli Selezionati: {0}/{1}",
"ja_JP": "タイトル選択済み: {0}/{1}",
"ko_KR": "선택된 타이틀: {0}/{1}",
"no_NO": "Valgte Titler: {0}/{1}",
"pl_PL": "Wybrane Tytuły: {0}/{1}",
"pt_BR": "Títulos Selecionados: {0}/{1}",
"ru_RU": "Файлы Выбраны: {0}/{1}",
"sv_SE": "Markerade Spel: {0}/{1}",
"th_TH": "เลือกหัวข้อ: {0}/{1}",
"tr_TR": "Seçilen Başlıklar: {0}/{1}",
"uk_UA": "Обрані Тайтли: {0}/{1}",
"zh_CN": "已选标题: {0}/{1}",
"zh_TW": "已選擇標題: {0}/{1}"
}
},
{
"ID": "TitleStatusCount_WithFilter",
"Translations": {
"ar_SA": "{0} من {1} عنوان(عناوين) مُحدد (عرض: {2})",
"de_DE": "{0} von {1} Titel(n) Ausgewählt (Anzeige: {2})",
"el_GR": "{0} από {1} Τίτλο(ους) Επιλεγμένο(οι) (Εμφάνιση: {2})",
"en_US": "{0} of {1} Title(s) Selected (Display: {2})",
"es_ES": "{0} de {1} Título(s) Seleccionado(s) (Mostrar: {2})",
"fr_FR": "{0} sur {1} Fichier(s) Sélectionnés (Affichage: {2})",
"he_IL": "{0} מתוך {1} כותר(ות) נבחר(ו) (הצגה: {2})",
"it_IT": "{0} di {1} titoli selezionati (Visualizza: {2})",
"ja_JP": "{0} / {1} タイトル選択済み (表示: {2})",
"ko_KR": "{1}개 타이틀 중 {0}개 선택됨 (표시: {2})",
"no_NO": "{0} av {1} Tittel(er) valgt (Visning: {2})",
"pl_PL": "{0} z {1} wybranych tytuł(ów) (Wyświetl: {2})",
"pt_BR": "{0} de {1} Título(s) Selecionado(s) (Exibir: {2})",
"ru_RU": "{0} из {1} файл(а/ов) выбран(о) (Отображение: {2})",
"sv_SE": "{0} av {1} spel markerade (Visning: {2})",
"th_TH": "เลือก {0} จาก {1} รายการ (แสดงผล: {2})",
"tr_TR": "{0} / {1} Başlık(lar) Seçildi (Gösterim: {2})",
"uk_UA": "{0} з {1} тайтл(ів) обрано (Відображення: {2})",
"zh_CN": "在 {1} 中选中了 {0} 个游戏 (显示:{2}",
"zh_TW": "已選擇 {1} 之 {0} 的遊戲 (顯示:{2})"
}
},
{
"ID": "TitleStatus_Trimming",
"Translations": {
"ar_SA": "جارٍ تقليم...",
"de_DE": "Trimme...",
"el_GR": "Κοπή...",
"en_US": "Trimming...",
"es_ES": "Recortando...",
"fr_FR": "Réduction...",
"he_IL": "חותך...",
"it_IT": "Riducendo...",
"ja_JP": "トリミング中...",
"ko_KR": "트리밍 중...",
"no_NO": "Trimming...",
"pl_PL": "Przycinanie...",
"pt_BR": "Reduzindo...",
"ru_RU": "Обрезка...",
"sv_SE": "Optimerar...",
"th_TH": "กำลังตัดแต่ง...",
"tr_TR": "Kesiliyor...",
"uk_UA": "Обрізка...",
"zh_CN": "瘦身中。。。",
"zh_TW": "正在修剪..."
}
},
{
"ID": "TitleStatus_Untrimming",
"Translations": {
"ar_SA": "جارٍ إلغاء تقليم...",
"de_DE": "Untrimming...",
"el_GR": "Ανακάμψη...",
"en_US": "Untrimming...",
"es_ES": "Restaurando...",
"fr_FR": "Restaurer...",
"he_IL": "משחזר...",
"it_IT": "Restaurando...",
"ja_JP": "トリミング解除中...",
"ko_KR": "트리밍 해제 중...",
"no_NO": "Untrimming...",
"pl_PL": "Przywracanie...",
"pt_BR": "Restaurando redução...",
"ru_RU": "Восстановление...",
"sv_SE": "Återställer...",
"th_TH": "กำลังฟื้นฟู...",
"tr_TR": "Yeniden yapılandırılıyor...",
"uk_UA": "Відновлення...",
"zh_CN": "正在恢复...",
"zh_TW": "正在恢復..."
}
},
{
"ID": "TitleStatus_Failed",
"Translations": {
"ar_SA": "فشل",
"de_DE": "Fehlgeschlagen",
"el_GR": "Απέτυχε",
"en_US": "Failed",
"es_ES": "Fallido",
"fr_FR": "Échoué",
"he_IL": "נכשל",
"it_IT": "Fallito",
"ja_JP": "失敗",
"ko_KR": "실패",
"no_NO": "Mislyktes",
"pl_PL": "Niepowodzenie",
"pt_BR": "Falhou",
"ru_RU": "Ошибка",
"sv_SE": "Misslyckades",
"th_TH": "ล้มเหลว",
"tr_TR": "Başarısız",
"uk_UA": "Невдача",
"zh_CN": "失败",
"zh_TW": "失敗"
}
},
{
"ID": "TotalSavings",
"Translations": {
"ar_SA": "توفير المساحة:",
"de_DE": "Platzeinsparung:",
"el_GR": "Εξοικονόμηση Χώρου:",
"en_US": "Space Savings:",
"es_ES": "Ahorro de Espacio:",
"fr_FR": "Économie dEspace :",
"he_IL": "חיסכון במקום:",
"it_IT": "Risparmio di Spazio:",
"ja_JP": "空き容量の節約:",
"ko_KR": "공간 절약:",
"no_NO": "Plassbesparelse:",
"pl_PL": "Oszczędność miejsca:",
"pt_BR": "Economia de Espaço:",
"ru_RU": "Экономия места:",
"sv_SE": "Utrymmesbesparing:",
"th_TH": "การประหยัดพื้นที่:",
"tr_TR": "Alan Tasarrufu:",
"uk_UA": "Економія місця:",
"zh_CN": "空间节省:",
"zh_TW": "空間節省:"
}
},
{
"ID": "CanStillSaveMB",
"Translations": {
"ar_SA": "({0} MB المتبقية)",
"de_DE": "({0} MB verbleibend)",
"el_GR": "({0} MB απομένοντα)",
"en_US": "({0} MB Remaining)",
"es_ES": "({0} MB Restantes)",
"fr_FR": "({0} Mo Restants)",
"he_IL": "(נותרו {0} MB)",
"it_IT": "({0} MB rimanenti)",
"ja_JP": "(残り {0} MB)",
"ko_KR": "(남은 {0} MB)",
"no_NO": "({0} MB gjenstående)",
"pl_PL": "({0} MB pozostałe)",
"pt_BR": "({0} MB restantes)",
"ru_RU": "(Осталось {0} Мб)",
"sv_SE": "({0} MB kvar)",
"th_TH": "(เหลือ {0} MB)",
"tr_TR": "({0} MB Kalan)",
"uk_UA": "(Залишилося {0} Мб)",
"zh_CN": "(剩余 {0} MB)",
"zh_TW": "(剩餘 {0} MB)"
}
},
{
"ID": "SavingsMb",
"Translations": {
"ar_SA": null,
"de_DE": null,
"el_GR": null,
"en_US": "{0} MB",
"es_ES": null,
"fr_FR": "{0} Mo",
"he_IL": null,
"it_IT": "{0} MB",
"ja_JP": null,
"ko_KR": "{0}MB",
"no_NO": null,
"pl_PL": null,
"pt_BR": null,
"ru_RU": "{0} Мб",
"sv_SE": null,
"th_TH": "{0} เมกะไบต์",
"tr_TR": null,
"uk_UA": "{0} Мб",
"zh_CN": null,
"zh_TW": null
}
},
{
"ID": "SelectAll",
"Translations": {
"ar_SA": "اختر الكل",
"de_DE": "Alles auswählen",
"el_GR": "Επιλογή όλων",
"en_US": "Select All",
"es_ES": "Seleccionar Todo",
"fr_FR": "Sélectionner Tout",
"he_IL": "בחר הכל",
"it_IT": "Seleziona tutto",
"ja_JP": "すべて選択",
"ko_KR": "모두 선택",
"no_NO": "Velg alle",
"pl_PL": "Zaznacz wszystko",
"pt_BR": "Selecionar tudo",
"ru_RU": "Выбрать все",
"sv_SE": "Markera alla",
"th_TH": "เลือกทั้งหมด",
"tr_TR": "Hepsini seç",
"uk_UA": "Вибрати все",
"zh_CN": "选择全部",
"zh_TW": "選擇全部"
}
},
{
"ID": "DeselectAll",
"Translations": {
"ar_SA": "إلغاء تحديد",
"de_DE": "Abwählen",
"el_GR": "Αποεπιλογή",
"en_US": "Deselect",
"es_ES": "Deseleccionar",
"fr_FR": "Désélectionner",
"he_IL": "בטל בחירה",
"it_IT": "Deseleziona",
"ja_JP": "選択解除",
"ko_KR": "선택 취소",
"no_NO": "Avmarkere",
"pl_PL": "Odznacz",
"pt_BR": "Desmarcar",
"ru_RU": "Отменить выбор",
"sv_SE": "Avmarkera",
"th_TH": "ยกเลิกการเลือก",
"tr_TR": "Kaldır",
"uk_UA": "Скасувати вибір",
"zh_CN": "取消选择",
"zh_TW": "取消選擇"
}
},
{
"ID": "SortName",
"Translations": {
"ar_SA": "عنوان",
"de_DE": "Titel",
"el_GR": "Τίτλος",
"en_US": "Title",
"es_ES": "Título",
"fr_FR": "Titre",
"he_IL": "כותרת",
"it_IT": "Titolo",
"ja_JP": "タイトル",
"ko_KR": "타이틀",
"no_NO": "Tittel",
"pl_PL": "Tytuł",
"pt_BR": "Título",
"ru_RU": "Название",
"sv_SE": "Titel",
"th_TH": "ชื่อไฟล์",
"tr_TR": "Başlık",
"uk_UA": "Назва",
"zh_CN": "标题",
"zh_TW": "名稱"
}
},
{
"ID": "SortSaved",
"Translations": {
"ar_SA": "التوفير",
"de_DE": "Einsparungen",
"el_GR": "Εξοικονόμηση",
"en_US": "Savings",
"es_ES": "Ahorros",
"fr_FR": "Économies",
"he_IL": "חיסכון",
"it_IT": "Risparmio",
"ja_JP": "節約",
"ko_KR": "절약",
"no_NO": "Besparelser",
"pl_PL": "Oszczędności",
"pt_BR": "Economia",
"ru_RU": "Экономия",
"sv_SE": "Sparande",
"th_TH": "การประหยัด",
"tr_TR": "Tasarruf",
"uk_UA": "Економія",
"zh_CN": "节省",
"zh_TW": "節省"
}
},
{
"ID": "Trim",
"Translations": {
"ar_SA": "قص",
"de_DE": "Trimmen",
"el_GR": "Κοπή",
"en_US": "Trim",
"es_ES": "Recortar",
"fr_FR": "Réduire",
"he_IL": "גזירה",
"it_IT": "Ridurre",
"ja_JP": "トリム",
"ko_KR": "트리밍",
"no_NO": "Trim",
"pl_PL": "Przyciąć",
"pt_BR": "Reduzir",
"ru_RU": "Обрезать",
"sv_SE": "Trimma",
"th_TH": "ตัดแต่ง",
"tr_TR": "Kısalt",
"uk_UA": "Обрізати",
"zh_CN": "修剪",
"zh_TW": "修剪"
}
},
{
"ID": "Untrim",
"Translations": {
"ar_SA": "استعادة",
"de_DE": "Wiederherstellen",
"el_GR": "Επαναφορά",
"en_US": "Untrim",
"es_ES": "Restaurar",
"fr_FR": "Restaurer",
"he_IL": "שחזור",
"it_IT": "Ripristina",
"ja_JP": "復元",
"ko_KR": "복원",
"no_NO": "Gjenopprett",
"pl_PL": "Przywróć",
"pt_BR": "Restaurar",
"ru_RU": "Восстановить",
"sv_SE": "Återställ",
"th_TH": "กู้คืน",
"tr_TR": "Geri Yükle",
"uk_UA": "Відновити",
"zh_CN": "恢复",
"zh_TW": "恢復"
}
}
]
}

View File

@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Applets
case AppletId.LibAppletOff:
return new BrowserApplet();
case AppletId.MiiEdit:
Logger.Warning?.Print(LogClass.Application, $"Please use the MiiEdit inside File/Open Applet");
Logger.Warning?.Print(LogClass.Application, $"Please use the Mii Editor inside Actions/Tools");
return new DummyApplet(system);
case AppletId.Cabinet:
return new CabinetApplet(system);

View File

@ -704,8 +704,8 @@ namespace Ryujinx.Ava.Systems
if (userError is UserError.NoFirmware)
{
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.Firmware_DialogInstall_NoFirmwareInstalledMessage],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Firmware_DialogInstall_EmbeddedMessage, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.InputDialogYes],
LocaleManager.Instance[LocaleKeys.InputDialogNo],
string.Empty);
@ -735,8 +735,8 @@ namespace Ryujinx.Ava.Systems
_viewModel.RefreshFirmwareStatus();
await ContentDialogHelper.CreateInfoDialog(
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstalledMessage, firmwareVersion.VersionString),
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage, firmwareVersion.VersionString),
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Firmware_DialogInstall_InstalledMessage, firmwareVersion.VersionString),
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Firmware_DialogInstall_EmbeddedMessage_Success, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.InputDialogOk],
string.Empty,
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);

View File

@ -187,7 +187,7 @@ namespace Ryujinx.Ava.UI.Applet
StringLengthMax = 25
};
(UserResult result, string userInput) =
await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args);
await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.Amiibo_CabinetDialog], args);
if (result == UserResult.Ok)
{
inputText = userInput;
@ -212,11 +212,11 @@ namespace Ryujinx.Ava.UI.Applet
{
dialogCloseEvent.Set();
await ContentDialogHelper.CreateInfoDialog(
LocaleManager.Instance[LocaleKeys.CabinetScanDialog],
LocaleManager.Instance[LocaleKeys.Amiibo_CabinetScanDialog],
string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogOk],
string.Empty,
LocaleManager.Instance[LocaleKeys.CabinetTitle]
LocaleManager.Instance[LocaleKeys.Amiibo_CabinetTitle]
);
});
dialogCloseEvent.WaitOne();

View File

@ -103,10 +103,10 @@
<MenuItem
Command="{Binding TrimXci}"
CommandParameter="{Binding}"
Header="{ext:Locale GameListContextMenuTrimXCI}"
Header="{ext:Locale XCITrimmer_GameListContextMenu_Trim}"
IsEnabled="{Binding TrimXCIEnabled}"
Icon="{ext:Icon fa-solid fa-scissors}"
ToolTip.Tip="{ext:Locale GameListContextMenuTrimXCIToolTip}" />
IsVisible="{Binding IsXCIFile}"
Icon="{ext:Icon fa-solid fa-scissors}" />
<MenuItem Header="{ext:Locale GameListContextMenuCacheManagement}" Icon="{ext:Icon fa-solid fa-memory}">
<MenuItem
Command="{Binding PurgePtcCache}"

View File

@ -33,11 +33,11 @@ namespace Ryujinx.Ava.UI.Helpers
if (app.CurrentSavingsB < app.PotentialSavingsB)
{
return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCICanSaveLabel, ((app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB).CoerceAtLeast(0));
return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.XCITrimmer_Title_CanSaveLabel, ((app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB).CoerceAtLeast(0));
}
else
{
return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCISavingLabel, (app.CurrentSavingsB / _bytesPerMB).CoerceAtLeast(0));
return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.XCITrimmer_Title_SavingLabel, (app.CurrentSavingsB / _bytesPerMB).CoerceAtLeast(0));
}
}

View File

@ -31,10 +31,10 @@ namespace Ryujinx.Ava.UI.Helpers
}
return app.PercentageProgress != null ? String.Empty :
app.ProcessingOutcome is not OperationOutcome.Successful and not OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusFailedLabel] :
app.Trimmable & app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusPartialLabel] :
app.Trimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusTrimmableLabel] :
app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusUntrimmableLabel] :
app.ProcessingOutcome is not OperationOutcome.Successful and not OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_FailedLabel] :
app.Trimmable & app.Untrimmable ? LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_PartialLabel] :
app.Trimmable ? LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_TrimmableLabel] :
app.Untrimmable ? LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_UntrimmableLabel] :
String.Empty;
}

View File

@ -14,9 +14,9 @@ namespace Ryujinx.Ava.UI.Helpers
private static string GetErrorTitle(UserError error) =>
error switch
{
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeys],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmware],
UserError.FirmwareParsingFailed => LocaleManager.Instance[LocaleKeys.UserErrorFirmwareParsingFailed],
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.Keys_UserError_NoKeys],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.Firmware_UserError_NoFirmware],
UserError.FirmwareParsingFailed => LocaleManager.Instance[LocaleKeys.Firmware_UserError_FirmwareParsingFailed],
UserError.ApplicationNotFound => LocaleManager.Instance[LocaleKeys.UserErrorApplicationNotFound],
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknown],
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefined],
@ -25,9 +25,9 @@ namespace Ryujinx.Ava.UI.Helpers
private static string GetErrorDescription(UserError error) =>
error switch
{
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeysDescription],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmwareDescription],
UserError.FirmwareParsingFailed => LocaleManager.Instance[LocaleKeys.UserErrorFirmwareParsingFailedDescription],
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.Keys_UserError_NoKeys_Description],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.Firmware_UserError_NoFirmware_Description],
UserError.FirmwareParsingFailed => LocaleManager.Instance[LocaleKeys.Firmware_UserError_FirmwareParsingFailed_Description],
UserError.ApplicationNotFound => LocaleManager.Instance[LocaleKeys.UserErrorApplicationNotFoundDescription],
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknownDescription],
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefinedDescription],

View File

@ -9,17 +9,17 @@ namespace Ryujinx.Ava.UI.Helpers
{
public string LocalizedText => opOutcome switch
{
OperationOutcome.NoTrimNecessary => LocaleManager.Instance[LocaleKeys.TrimXCIFileNoTrimNecessary],
OperationOutcome.NoUntrimPossible => LocaleManager.Instance[LocaleKeys.TrimXCIFileNoUntrimPossible],
OperationOutcome.NoTrimNecessary => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_NoTrimNecessary],
OperationOutcome.NoUntrimPossible => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_NoUntrimPossible],
OperationOutcome.ReadOnlyFileCannotFix => LocaleManager.Instance[
LocaleKeys.TrimXCIFileReadOnlyFileCannotFix],
LocaleKeys.XCITrimmer_TrimFile_ReadOnlyFileCannotFix],
OperationOutcome.FreeSpaceCheckFailed => LocaleManager.Instance[
LocaleKeys.TrimXCIFileFreeSpaceCheckFailed],
OperationOutcome.InvalidXCIFile => LocaleManager.Instance[LocaleKeys.TrimXCIFileInvalidXCIFile],
OperationOutcome.FileIOWriteError => LocaleManager.Instance[LocaleKeys.TrimXCIFileFileIOWriteError],
OperationOutcome.FileSizeChanged => LocaleManager.Instance[LocaleKeys.TrimXCIFileFileSizeChanged],
OperationOutcome.Cancelled => LocaleManager.Instance[LocaleKeys.TrimXCIFileCancelled],
OperationOutcome.Undetermined => LocaleManager.Instance[LocaleKeys.TrimXCIFileFileUndertermined],
LocaleKeys.XCITrimmer_TrimFile_FreeSpaceCheckFailed],
OperationOutcome.InvalidXCIFile => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_InvalidXCIFile],
OperationOutcome.FileIOWriteError => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_FileIOWriteError],
OperationOutcome.FileSizeChanged => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_FileSizeChanged],
OperationOutcome.Cancelled => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_Cancelled],
OperationOutcome.Undetermined => LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_FileUndertermined],
_ => null
};
}

View File

@ -317,40 +317,43 @@ namespace Ryujinx.Ava.UI.ViewModels
_amiiboSeries.Clear();
_amiibos.Clear();
for (int i = 0; i < _amiiboList.Count; i++)
foreach (var amiibo in _amiiboList)
{
if (!_amiiboSeries.Contains(_amiiboList[i].AmiiboSeries))
if (!_amiiboSeries.Contains(amiibo.AmiiboSeries))
{
if (!ShowAllAmiibo)
{
foreach (AmiiboApiGamesSwitch game in _amiiboList[i].GamesSwitch)
bool compatible = amiibo.GamesSwitch.Any(game => game != null && game.GameId.Contains(TitleId));
if (compatible)
{
if (game != null)
{
if (game.GameId.Contains(TitleId))
{
AmiiboSeries.Add(_amiiboList[i].AmiiboSeries);
break;
}
}
_amiiboSeries.Add(amiibo.AmiiboSeries);
}
}
else
{
AmiiboSeries.Add(_amiiboList[i].AmiiboSeries);
_amiiboSeries.Add(amiibo.AmiiboSeries);
}
}
}
if (LastScannedAmiiboId != string.Empty)
{
SelectLastScannedAmiibo();
}
else
if (ShowAllAmiibo && _amiiboSeries.Count > 0)
{
SeriesSelectedIndex = 0;
}
else if (LastScannedAmiiboId != string.Empty)
{
SelectLastScannedAmiibo();
}
else if (_amiiboSeries.Count > 0)
{
SeriesSelectedIndex = 0;
}
else
{
SeriesSelectedIndex = -1;
}
FilterAmiibo();
}
private void SelectLastScannedAmiibo()
@ -360,59 +363,60 @@ namespace Ryujinx.Ava.UI.ViewModels
SeriesSelectedIndex = AmiiboSeries.IndexOf(scanned.AmiiboSeries);
AmiiboSelectedIndex = AmiiboList.IndexOf(scanned);
}
private void FilterAmiibo()
{
_amiibos.Clear();
List<AmiiboApi> amiiboSortedList;
// If no series selected, just display all available amiibos
if (_seriesSelectedIndex < 0)
{
amiiboSortedList = _amiiboList
.OrderBy(amiibo => amiibo.AmiiboSeries)
.ThenBy(x => x.Name)
.ThenBy(amiibo => amiibo.Name)
.ToList();
}
else
{
string selectedSeries = _amiiboSeries[SeriesSelectedIndex];
amiiboSortedList = _amiiboList
.Where(amiibo => amiibo.AmiiboSeries == _amiiboSeries[SeriesSelectedIndex])
.OrderBy(amiibo => amiibo.Name).ToList();
.Where(amiibo => amiibo.AmiiboSeries == selectedSeries)
.OrderBy(amiibo => amiibo.Name)
.ToList();
}
for (int i = 0; i < amiiboSortedList.Count; i++)
foreach (var amiibo in amiiboSortedList)
{
if (!_amiibos.Contains(amiiboSortedList[i]))
if (!_showAllAmiibo)
{
if (!_showAllAmiibo)
{
foreach (AmiiboApiGamesSwitch game in amiiboSortedList[i].GamesSwitch)
{
if (game != null)
{
if (game.GameId.Contains(TitleId))
{
_amiibos.Add(amiiboSortedList[i]);
bool compatible = amiibo.GamesSwitch.Any(game => game != null && game.GameId.Contains(TitleId));
break;
}
}
}
}
else
if (compatible)
{
_amiibos.Add(amiiboSortedList[i]);
_amiibos.Add(amiibo);
}
}
else
{
_amiibos.Add(amiibo);
}
}
AmiiboSelectedIndex = 0;
}
int restoredIndex = -1;
for (int i = 0; i < _amiibos.Count; i++)
{
if (_amiibos[i].GetId() == LastScannedAmiiboId)
{
restoredIndex = i;
break;
}
}
AmiiboSelectedIndex = restoredIndex != -1 ? restoredIndex : (_amiibos.Count > 0 ? 0 : -1);
}
private void SetAmiiboDetails()
{
ResetAmiiboPreview();
@ -420,44 +424,40 @@ namespace Ryujinx.Ava.UI.ViewModels
Usage = string.Empty;
if (_amiiboSelectedIndex < 0 || _amiibos.Count < 1)
{
return;
}
AmiiboApi selected = _amiibos[_amiiboSelectedIndex];
string imageUrl = _amiiboList.FirstOrDefault(amiibo => amiibo.Equals(selected)).Image;
string imageUrl = selected.Image;
StringBuilder usageStringBuilder = new();
bool writable = false;
for (int i = 0; i < _amiiboList.Count; i++)
foreach (var game in selected.GamesSwitch)
{
if (_amiiboList[i].Equals(selected))
if (game != null && game.GameId.Contains(TitleId))
{
bool writable = false;
foreach (AmiiboApiGamesSwitch item in _amiiboList[i].GamesSwitch)
foreach (var usageItem in game.AmiiboUsage)
{
if (item.GameId.Contains(TitleId))
{
foreach (AmiiboApiUsage usageItem in item.AmiiboUsage)
{
usageStringBuilder.Append($"{Environment.NewLine}- {usageItem.Usage.Replace("/", Environment.NewLine + "-")}");
usageStringBuilder.Append($"{Environment.NewLine}- {usageItem.Usage.Replace("/", Environment.NewLine + "-")}");
writable = usageItem.Write;
}
}
if (usageItem.Write)
writable = true;
}
if (usageStringBuilder.Length == 0)
{
usageStringBuilder.Append($"{LocaleManager.Instance[LocaleKeys.Unknown]}.");
}
Usage = $"{LocaleManager.Instance[LocaleKeys.Usage]} {(writable ? $" ({LocaleManager.Instance[LocaleKeys.Writable]})" : string.Empty)} : {usageStringBuilder}";
}
}
if (usageStringBuilder.Length == 0)
{
usageStringBuilder.Append($"{LocaleManager.Instance[LocaleKeys.Amiibo_Unknown]}.");
}
Usage =
(writable
? $"{LocaleManager.Instance[LocaleKeys.Amiibo_UsageWritable]}"
: $"{LocaleManager.Instance[LocaleKeys.Amiibo_Usage]}")
+ usageStringBuilder;
_ = UpdateAmiiboPreview(imageUrl);
}
@ -510,8 +510,8 @@ namespace Ryujinx.Ava.UI.ViewModels
Logger.Error?.Print(LogClass.Application, $"Failed to request amiibo data: {exception}");
}
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogAmiiboApiTitle],
LocaleManager.Instance[LocaleKeys.DialogAmiiboApiFailFetchMessage],
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.Amiibo_DialogApiTitle],
LocaleManager.Instance[LocaleKeys.Amiibo_DialogApiFailFetchMessage],
LocaleManager.Instance[LocaleKeys.InputDialogOk],
string.Empty,
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);
@ -560,8 +560,8 @@ namespace Ryujinx.Ava.UI.ViewModels
private static async Task ShowInfoDialog()
{
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogAmiiboApiTitle],
LocaleManager.Instance[LocaleKeys.DialogAmiiboApiConnectErrorMessage],
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.Amiibo_DialogApiTitle],
LocaleManager.Instance[LocaleKeys.Amiibo_DialogApiConnectErrorMessage],
LocaleManager.Instance[LocaleKeys.InputDialogOk],
string.Empty,
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);

View File

@ -456,6 +456,8 @@ namespace Ryujinx.Ava.UI.ViewModels
}
public bool HasCompatibilityEntry => SelectedApplication.HasPlayabilityInfo;
public bool IsXCIFile => Path.GetExtension(SelectedApplication.Path)?.ToLower() == ".xci";
public bool HasDlc => ApplicationLibrary.HasDlcs(SelectedApplication.Id);
@ -907,25 +909,25 @@ namespace Ryujinx.Ava.UI.ViewModels
{
await ContentDialogHelper.CreateErrorDialog(
LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogFirmwareInstallerFirmwareNotFoundErrorMessage, filename));
LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareNotFoundErrorMessage, filename));
return;
}
string dialogTitle = LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogFirmwareInstallerFirmwareInstallTitle, firmwareVersion.VersionString);
LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareInstallTitle, firmwareVersion.VersionString);
string dialogMessage = LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogFirmwareInstallerFirmwareInstallMessage, firmwareVersion.VersionString);
LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareInstallMessage, firmwareVersion.VersionString);
SystemVersion currentVersion = ContentManager.GetCurrentFirmwareVersion();
if (currentVersion != null)
{
dialogMessage += LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogFirmwareInstallerFirmwareInstallSubMessage, currentVersion.VersionString);
LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareInstallSubMessage, currentVersion.VersionString);
}
dialogMessage +=
LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallConfirmMessage];
LocaleManager.Instance[LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwaresInstallConfirmMessage];
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
dialogTitle,
@ -935,7 +937,7 @@ namespace Ryujinx.Ava.UI.ViewModels
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
UpdateWaitWindow waitingDialog = new(dialogTitle,
LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallWaitMessage]);
LocaleManager.Instance[LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareInstallWaitMessage]);
if (result == UserResult.Yes)
{
@ -957,7 +959,7 @@ namespace Ryujinx.Ava.UI.ViewModels
waitingDialog.Close();
string message = LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogFirmwareInstallerFirmwareInstallSuccessMessage,
LocaleKeys.Firmware_DialogFirmwareInstaller_FirmwareInstallSuccessMessage,
firmwareVersion.VersionString);
await ContentDialogHelper.CreateInfoDialog(
@ -1025,18 +1027,18 @@ namespace Ryujinx.Ava.UI.ViewModels
}
string dialogTitle =
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallTitle);
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Keys_MenuBarActions_Install);
string dialogMessage =
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallMessage);
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Keys_DialogKeysInstaller_KeysInstallMessage);
if (ContentManager.AreKeysAlredyPresent(systemDirectory))
{
dialogMessage +=
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys
.DialogKeysInstallerKeysInstallSubMessage);
.Keys_DialogKeysInstaller_KeysInstallSubMessage);
}
dialogMessage += LocaleManager.Instance[LocaleKeys.DialogKeysInstallerKeysInstallConfirmMessage];
dialogMessage += LocaleManager.Instance[LocaleKeys.Keys_DialogKeysInstaller_InstallConfirmMessage];
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
dialogTitle,
@ -1046,7 +1048,7 @@ namespace Ryujinx.Ava.UI.ViewModels
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
UpdateWaitWindow waitingDialog = new(dialogTitle,
LocaleManager.Instance[LocaleKeys.DialogKeysInstallerKeysInstallWaitMessage]);
LocaleManager.Instance[LocaleKeys.Keys_DialogKeysInstaller_KeysInstallWaitMessage]);
if (result == UserResult.Yes)
{
@ -1069,7 +1071,7 @@ namespace Ryujinx.Ava.UI.ViewModels
string message =
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys
.DialogKeysInstallerKeysInstallSuccessMessage);
.Keys_DialogKeysInstaller_KeysInstallSuccessMessage);
await ContentDialogHelper.CreateInfoDialog(
dialogTitle,
@ -1091,7 +1093,7 @@ namespace Ryujinx.Ava.UI.ViewModels
if (ex is FormatException)
{
message = LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogKeysInstallerKeysNotFoundErrorMessage, filename);
LocaleKeys.Keys_DialogKeysInstaller_KeysNotFoundErrorMessage, filename);
}
await ContentDialogHelper.CreateErrorDialog(message);
@ -1357,9 +1359,10 @@ namespace Ryujinx.Ava.UI.ViewModels
{
Optional<IStorageFile> result = await StorageProvider.OpenSingleFilePickerAsync(new FilePickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.Firmware_InstallFromFile_DialogTitle],
FileTypeFilter = new List<FilePickerFileType>
{
new(LocaleManager.Instance[LocaleKeys.FileDialogAllTypes])
new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats])
{
Patterns = ["*.xci", "*.zip"],
AppleUniformTypeIdentifiers = ["com.ryujinx.xci", "public.zip-archive"],
@ -1388,7 +1391,10 @@ namespace Ryujinx.Ava.UI.ViewModels
public async Task InstallFirmwareFromFolder()
{
Optional<IStorageFolder> result = await StorageProvider.OpenSingleFolderPickerAsync();
Optional<IStorageFolder> result = await StorageProvider.OpenSingleFolderPickerAsync(new FolderPickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.Firmware_InstallFromFolder_DialogTitle]
});
if (result.HasValue)
{
@ -1400,6 +1406,7 @@ namespace Ryujinx.Ava.UI.ViewModels
{
Optional<IStorageFile> result = await StorageProvider.OpenSingleFilePickerAsync(new FilePickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.Keys_InstallFromFile_DialogTitle],
FileTypeFilter = new List<FilePickerFileType>
{
new("KEYS")
@ -1419,7 +1426,10 @@ namespace Ryujinx.Ava.UI.ViewModels
public async Task InstallKeysFromFolder()
{
Optional<IStorageFolder> result = await StorageProvider.OpenSingleFolderPickerAsync();
Optional<IStorageFolder> result = await StorageProvider.OpenSingleFolderPickerAsync(new FolderPickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.Keys_InstallFromFolder_DialogTitle]
});
if (result.HasValue)
{
@ -1773,14 +1783,14 @@ namespace Ryujinx.Ava.UI.ViewModels
if (version != null)
{
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion,
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Firmware_StatusBar_Version,
version.VersionString);
hasApplet = version.Major > 3;
}
else
{
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion, "NaN");
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Firmware_StatusBar_Version, "NaN");
}
IsAppletMenuActive = hasApplet;
@ -1841,17 +1851,35 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
public async Task OpenBinFile()
public async Task OpenCheatManagerForCurrentApp()
{
if (IsGameRunning)
{
string name = AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
await StyleableAppWindow.ShowAsync(
new CheatWindow(
Window.VirtualFileSystem,
AppHost.Device.Processes.ActiveApplication.ProgramIdText,
name,
SelectedApplication.Path)
);
AppHost.Device.EnableCheats();
}
}
public async Task OpenAmiiboBinFile()
{
if (AppHost.Device.System.SearchingForAmiibo(out _) && IsGameRunning)
{
Optional<IStorageFile> result = await StorageProvider.OpenSingleFilePickerAsync(
new FilePickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.OpenFileDialogTitle],
Title = LocaleManager.Instance[LocaleKeys.Amiibo_OpenBinFileDialogTitle],
FileTypeFilter = new List<FilePickerFileType>
{
new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats])
new("BIN")
{
Patterns = ["*.bin"],
}
@ -2015,7 +2043,7 @@ namespace Ryujinx.Ava.UI.ViewModels
if (notifyUser != null)
{
await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.TrimXCIFileFailedPrimaryText],
LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFile_FailedPrimaryText],
notifyUser
);
}
@ -2041,18 +2069,17 @@ namespace Ryujinx.Ava.UI.ViewModels
if (trimmer.CanBeTrimmed)
{
double savings = (double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0;
double currentFileSize = (double)trimmer.FileSizeB / 1024.0 / 1024.0;
double cartDataSize = (double)trimmer.DataSizeB / 1024.0 / 1024.0;
string secondaryText = LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.TrimXCIFileDialogSecondaryText, currentFileSize, cartDataSize, savings);
int savings = (int)Math.Round((double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0);
int currentFileSize = (int)Math.Round((double)trimmer.FileSizeB / 1024.0 / 1024.0);
int cartDataSize = (int)Math.Round((double)trimmer.DataSizeB / 1024.0 / 1024.0);
string secondaryText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.XCITrimmer_TrimFileDialog_SecondaryText, currentFileSize.ToString("0"), cartDataSize.ToString("0"), savings.ToString("0"));
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
LocaleManager.Instance[LocaleKeys.TrimXCIFileDialogPrimaryText],
LocaleManager.Instance[LocaleKeys.XCITrimmer_TrimFileDialog_PrimaryText],
secondaryText,
LocaleManager.Instance[LocaleKeys.Continue],
LocaleManager.Instance[LocaleKeys.Cancel],
LocaleManager.Instance[LocaleKeys.GameListContextMenuTrimXCI]
LocaleManager.Instance[LocaleKeys.XCITrimmer_GameListContextMenu_Trim]
);
if (result == UserResult.Yes)
@ -2062,8 +2089,8 @@ namespace Ryujinx.Ava.UI.ViewModels
Dispatcher.UIThread.Post(() =>
{
StatusBarProgressStatusText =
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarXCIFileTrimming,
Path.GetFileName(filename));
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.XCITrimmer_StatusBar_Trimming,
Path.GetFileNameWithoutExtension(filename));
StatusBarProgressStatusVisible = true;
StatusBarProgressMaximum = 1;
StatusBarProgressValue = 0;

View File

@ -115,6 +115,7 @@ namespace Ryujinx.Ava.UI.ViewModels
nameof(PotentialSavings),
nameof(ActualSavings),
nameof(CanTrim),
nameof(SavingsDifference),
nameof(CanUntrim));
DisplayedChanged();
@ -312,13 +313,14 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
public void SelectDisplayed()
public void SelectAll()
{
SelectedXCIFiles.Clear();
SelectedXCIFiles.AddRange(DisplayedXCIFiles);
SelectionChanged();
}
public void DeselectDisplayed()
public void DeselectAll()
{
SelectedXCIFiles.RemoveMany(DisplayedXCIFiles);
SelectionChanged();
@ -426,16 +428,16 @@ namespace Ryujinx.Ava.UI.ViewModels
{
return _processingMode switch
{
ProcessingMode.Trimming => string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerTitleStatusTrimming], DisplayedXCIFiles.Count),
ProcessingMode.Untrimming => string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerTitleStatusUntrimming], DisplayedXCIFiles.Count),
ProcessingMode.Trimming => LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_Trimming],
ProcessingMode.Untrimming => LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatus_Untrimming],
_ => string.Empty
};
}
else
{
return string.IsNullOrEmpty(Search) ?
string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerTitleStatusCount], SelectedXCIFiles.Count, AllXCIFiles.Count) :
string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerTitleStatusCountWithFilter], SelectedXCIFiles.Count, AllXCIFiles.Count, DisplayedXCIFiles.Count);
string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatusCount], SelectedXCIFiles.Count, AllXCIFiles.Count) :
string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmer_TitleStatusCount_WithFilter], SelectedXCIFiles.Count, AllXCIFiles.Count, DisplayedXCIFiles.Count);
}
}
}
@ -466,8 +468,8 @@ namespace Ryujinx.Ava.UI.ViewModels
{
return SortingField switch
{
SortField.Name => LocaleManager.Instance[LocaleKeys.XCITrimmerSortName],
SortField.Saved => LocaleManager.Instance[LocaleKeys.XCITrimmerSortSaved],
SortField.Name => LocaleManager.Instance[LocaleKeys.XCITrimmer_SortName],
SortField.Saved => LocaleManager.Instance[LocaleKeys.XCITrimmer_SortSaved],
_ => string.Empty,
};
}
@ -517,7 +519,7 @@ namespace Ryujinx.Ava.UI.ViewModels
{
get
{
return string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerSavingsMb], AllXCIFiles.Sum(xci => xci.PotentialSavingsB / BytesPerMb));
return string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmer_SavingsMb], AllXCIFiles.Sum(xci => xci.PotentialSavingsB / BytesPerMb));
}
}
@ -525,7 +527,19 @@ namespace Ryujinx.Ava.UI.ViewModels
{
get
{
return string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerSavingsMb], AllXCIFiles.Sum(xci => xci.CurrentSavingsB / BytesPerMb));
return string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmer_SavingsMb], AllXCIFiles.Sum(xci => xci.CurrentSavingsB / BytesPerMb));
}
}
public string SavingsDifference
{
get
{
long potentialSavings = AllXCIFiles.Sum(xci => xci.PotentialSavingsB);
long actualSavings = AllXCIFiles.Sum(xci => xci.CurrentSavingsB);
long differenceMb = (potentialSavings - actualSavings) / BytesPerMb;
return string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmer_CanStillSaveMB], differenceMb);
}
}

View File

@ -105,7 +105,7 @@
FontSize="10"
LineHeight="12"
PointerPressed="AmiiboLabel_OnPointerPressed"
Text="{ext:Locale AboutAmiiboDisclaimerMessage}"
Text="{ext:Locale Amiibo_AboutDisclaimerMessage}"
TextAlignment="Center"
TextWrapping="Wrap" />
<StackPanel

View File

@ -13,102 +13,101 @@
x:DataType="viewModels:XciTrimmerViewModel"
Focusable="True"
mc:Ignorable="d">
<Grid Margin="20 0 20 0" RowDefinitions="Auto,Auto,*,Auto,Auto">
<Grid Margin="25,10,25,0" RowDefinitions="Auto,Auto,*,Auto,Auto">
<Panel
Margin="10 10 10 10"
Margin="0,0,0,10"
Grid.Row="0">
<TextBlock Text="{Binding Status}" />
</Panel>
<Panel
Margin="0 0 10 10"
IsVisible="{Binding !Processing}"
Grid.Row="1">
<Grid ColumnDefinitions="Auto,*,Auto">
<StackPanel
Grid.Column="0"
Orientation="Horizontal">
<DropDownButton
Width="150"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content="{Binding SortingFieldName}">
<DropDownButton.Flyout>
<Flyout Placement="Bottom">
<StackPanel
Margin="0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<StackPanel>
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale XCITrimmerSortName}"
GroupName="Sort"
IsChecked="{Binding IsSortedByName, Mode=OneTime}"
Tag="Name" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale XCITrimmerSortSaved}"
GroupName="Sort"
IsChecked="{Binding IsSortedBySaved, Mode=OneTime}"
Tag="Saved" />
</StackPanel>
<Border
Width="60"
Height="2"
Margin="5"
HorizontalAlignment="Stretch"
BorderBrush="White"
BorderThickness="0,1,0,0">
<Separator Height="0" HorizontalAlignment="Stretch" />
</Border>
<Grid Margin="0,0,0,10" Grid.Row="1" IsVisible="{Binding !Processing}" ColumnDefinitions="Auto,*">
<StackPanel
Grid.Column="0"
Orientation="Horizontal"
HorizontalAlignment="Left"
VerticalAlignment="Center">
<Button
Name="SelectAllButton"
MinWidth="90"
Margin="0,0,10,0"
Command="{Binding SelectAll}">
<TextBlock Text="{ext:Locale XCITrimmer_SelectAll}" />
</Button>
<Button
Name="DeselectAllButton"
MinWidth="90"
Margin="0,0,0,0"
Command="{Binding DeselectAll}">
<TextBlock Text="{ext:Locale XCITrimmer_DeselectAll}" />
</Button>
</StackPanel>
<StackPanel
Orientation="Horizontal"
Grid.Column="1"
HorizontalAlignment="Right">
<DropDownButton
Width="150"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Content="{Binding SortingFieldName}">
<DropDownButton.Flyout>
<Flyout Placement="Bottom">
<StackPanel
Margin="0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<StackPanel>
<RadioButton
Checked="Order_Checked"
Content="{ext:Locale OrderAscending}"
GroupName="Order"
IsChecked="{Binding SortingAscending, Mode=OneTime}"
Tag="Ascending" />
Checked="Sort_Checked"
Content="{ext:Locale XCITrimmer_SortName}"
GroupName="Sort"
IsChecked="{Binding IsSortedByName, Mode=OneTime}"
Tag="Name" />
<RadioButton
Checked="Order_Checked"
Content="{ext:Locale OrderDescending}"
GroupName="Order"
IsChecked="{Binding !SortingAscending, Mode=OneTime}"
Tag="Descending" />
Checked="Sort_Checked"
Content="{ext:Locale XCITrimmer_SortSaved}"
GroupName="Sort"
IsChecked="{Binding IsSortedBySaved, Mode=OneTime}"
Tag="Saved" />
</StackPanel>
</Flyout>
</DropDownButton.Flyout>
</DropDownButton>
</StackPanel>
<Border
Width="60"
Height="2"
Margin="5"
HorizontalAlignment="Stretch"
BorderBrush="White"
BorderThickness="0,1,0,0">
<Separator Height="0" HorizontalAlignment="Stretch" />
</Border>
<RadioButton
Checked="Order_Checked"
Content="{ext:Locale OrderAscending}"
GroupName="Order"
IsChecked="{Binding SortingAscending, Mode=OneTime}"
Tag="Ascending" />
<RadioButton
Checked="Order_Checked"
Content="{ext:Locale OrderDescending}"
GroupName="Order"
IsChecked="{Binding !SortingAscending, Mode=OneTime}"
Tag="Descending" />
</StackPanel>
</Flyout>
</DropDownButton.Flyout>
</DropDownButton>
<TextBox
Grid.Column="1"
MinHeight="29"
MaxHeight="29"
Margin="5 0 5 0"
HorizontalAlignment="Stretch"
Width="200"
MaxWidth="200"
Margin="5,0,0,0"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Watermark="{ext:Locale Search}"
Text="{Binding Search}" />
<StackPanel
Grid.Column="2"
Orientation="Horizontal">
<Button
Name="SelectDisplayedButton"
MinWidth="90"
Margin="5"
Command="{Binding SelectDisplayed}">
<TextBlock Text="{ext:Locale XCITrimmerSelectDisplayed}" />
</Button>
<Button
Name="DeselectDisplayedButton"
MinWidth="90"
Margin="5"
Command="{Binding DeselectDisplayed}">
<TextBlock Text="{ext:Locale XCITrimmerDeselectDisplayed}" />
</Button>
</StackPanel>
</Grid>
</Panel>
</StackPanel>
</Grid>
<Border
Grid.Row="2"
Margin="0 0 0 10"
Margin="0,0,0,20"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
@ -124,45 +123,50 @@
SelectedItems="{Binding SelectedDisplayedXCIFiles, Mode=OneWay}"
ItemsSource="{Binding DisplayedXCIFiles}"
IsEnabled="{Binding !Processing}">
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="Margin" Value="0" />
<Setter Property="Background" Value="Transparent" />
</Style>
</ListBox.Styles>
<ListBox.DataTemplates>
<DataTemplate
DataType="models:XCITrimmerFileModel">
<Panel Margin="10">
<Grid ColumnDefinitions="65*,35*">
<Grid ColumnDefinitions="65*,40*">
<TextBlock
Grid.Column="0"
Margin="10,0,10,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="2"
TextWrapping="Wrap"
TextTrimming="CharacterEllipsis"
Text="{Binding Name}">
</TextBlock>
<Grid Grid.Column="1" ColumnDefinitions="50*,70*">
<ProgressBar
Height="10"
Margin="10,0,10,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
CornerRadius="5"
IsVisible="{Binding $parent[UserControl].((viewModels:XciTrimmerViewModel)DataContext).Processing}"
Maximum="100"
Minimum="0"
Value="{Binding PercentageProgress}" />
<TextBlock
Grid.Column="0"
Margin="10 0 10 0"
Margin="10,0,10,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="2"
TextWrapping="Wrap"
TextTrimming="CharacterEllipsis"
Text="{Binding Name}">
</TextBlock>
<Grid Grid.Column="1" ColumnDefinitions="45*,55*">
<ProgressBar
Height="10"
Margin="10 0 10 0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
CornerRadius="5"
IsVisible="{Binding $parent[UserControl].((viewModels:XciTrimmerViewModel)DataContext).Processing}"
Maximum="100"
Minimum="0"
Value="{Binding PercentageProgress}" />
<TextBlock
Grid.Column="0"
Margin="10 0 10 0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="1"
Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileStatusConverter.Instance}}">
MaxLines="1"
Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileStatusConverter.Instance}}">
<ToolTip IsOpen="{Binding IsFailed}">
<ToolTip.Tip>
<StackPanel
IsVisible="{Binding IsFailed}">
<StackPanel>
<TextBlock
Classes="h1"
Text="{ext:Locale XCITrimmerTitleStatusFailed}" />
Text="{ext:Locale XCITrimmer_TitleStatus_Failed}" />
<TextBlock
Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileStatusDetailConverter.Instance}}"
MaxLines="5"
@ -172,74 +176,47 @@
TextWrapping="Wrap"/>
</StackPanel>
</ToolTip.Tip>
</TextBlock>
<TextBlock
Grid.Column="1"
Margin="10 0 10 0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="1"
Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileSpaceSavingsConverter.Instance}}">>
</TextBlock>
</Grid>
</ToolTip>
</TextBlock>
<TextBlock
Grid.Column="1"
Margin="10,0,10,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
MaxLines="1"
Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileSpaceSavingsConverter.Instance}}">
</TextBlock>
</Grid>
</Panel>
</Grid>
</DataTemplate>
</ListBox.DataTemplates>
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="Background" Value="Transparent" />
</Style>
</ListBox.Styles>
</ListBox>
</Border>
<Border
Grid.Row="3"
Margin="0 0 0 10"
HorizontalAlignment="Stretch"
BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
BorderThickness="1"
CornerRadius="5"
Padding="2.5">
<Grid ColumnDefinitions="Auto,*" RowDefinitions="Auto,Auto">
<TextBlock
Grid.Column="0"
Grid.Row="0"
Classes="h1"
Margin="5"
HorizontalAlignment="Right"
VerticalAlignment="Center"
MaxLines="1"
Text="{ext:Locale XCITrimmerPotentialSavings}" />
<TextBlock
Grid.Column="0"
Grid.Row="1"
Classes="h1"
Margin="5"
HorizontalAlignment="Right"
VerticalAlignment="Center"
MaxLines="1"
Text="{ext:Locale XCITrimmerActualSavings}" />
<TextBlock
Grid.Column="1"
Grid.Row="0"
Margin="5"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="1"
Text="{Binding PotentialSavings}" />
<TextBlock
Grid.Column="1"
Grid.Row="1"
Margin="5"
HorizontalAlignment="Left"
VerticalAlignment="Center"
MaxLines="1"
Text="{Binding ActualSavings}" />
</Grid>
</Border>
<StackPanel Grid.Row="3" Margin="0,0,0,20" Spacing="5" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
<TextBlock
Classes="h1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
MaxLines="1"
Text="{ext:Locale XCITrimmer_TotalSavings}" />
<TextBlock
Classes="h1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Regular"
MaxLines="1"
Text="{Binding ActualSavings}" />
<TextBlock
Classes="h1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Regular"
MaxLines="1"
Text="{Binding SavingsDifference}" />
</StackPanel>
<Panel
Grid.Row="4"
Margin="0,10,0,0"
HorizontalAlignment="Stretch">
<Grid ColumnDefinitions="*,Auto">
<StackPanel
@ -250,18 +227,16 @@
<Button
Name="TrimButton"
MinWidth="90"
Margin="5"
Click="Trim"
IsEnabled="{Binding CanTrim}">
<TextBlock Text="{ext:Locale XCITrimmerTrim}" />
<TextBlock Text="{ext:Locale XCITrimmer_Trim}" />
</Button>
<Button
Name="UntrimButton"
MinWidth="90"
Margin="5"
Click="Untrim"
IsEnabled="{Binding CanUntrim}">
<TextBlock Text="{ext:Locale XCITrimmerUntrim}" />
<TextBlock Text="{ext:Locale XCITrimmer_Untrim}" />
</Button>
</StackPanel>
<StackPanel
@ -272,7 +247,6 @@
<Button
Name="CancellingButton"
MinWidth="90"
Margin="5"
Click="Cancel"
IsEnabled="False">
<Button.IsVisible>
@ -286,7 +260,6 @@
<Button
Name="CancelButton"
MinWidth="90"
Margin="5"
Click="Cancel">
<Button.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
@ -299,10 +272,9 @@
<Button
Name="CloseButton"
MinWidth="90"
Margin="5"
Click="Close"
IsVisible="{Binding !Processing}">
<TextBlock Text="{ext:Locale InputDialogClose}" />
<TextBlock Text="{ext:Locale SettingsButtonClose}" />
</Button>
</StackPanel>
</Grid>

View File

@ -29,7 +29,7 @@ namespace Ryujinx.Ava.UI.Views.Dialog
{
ViewModel = new XciTrimmerViewModel(RyujinxApp.MainWindow.ViewModel)
},
Title = LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]
Title = LocaleManager.Instance[LocaleKeys.XCITrimmer_MenuBarActions_OpenTrimmer]
};
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());

View File

@ -167,19 +167,19 @@
Icon="{ext:Icon fa-solid fa-stop}"
InputGesture="Escape"
IsEnabled="{Binding IsGameRunning}" />
<MenuItem Command="{Binding SimulateWakeUpMessage}" Header="{ext:Locale MenuBarOptionsSimulateWakeUpMessage}" Icon="{ext:Icon fa-solid fa-sun}" />
<MenuItem Command="{Binding SimulateWakeUpMessage}" Header="{ext:Locale MenuBarOptionsSimulateWakeUpMessage}" Icon="{ext:Icon fa-solid fa-sun}" InputGesture="Ctrl+M" />
<Separator />
<MenuItem
Command="{Binding OpenAmiiboWindow}"
AttachedToVisualTree="ScanAmiiboMenuItem_AttachedToVisualTree"
Header="{ext:Locale MenuBarActionsScanAmiibo}"
Header="{ext:Locale Amiibo_MenuBarActions_ScanAmiibo}"
Icon="{ext:Icon fa-solid fa-cube}"
InputGesture="Ctrl + A"
IsEnabled="{Binding IsAmiiboRequested}" />
<MenuItem
Command="{Binding OpenBinFile}"
Command="{Binding OpenAmiiboBinFile}"
AttachedToVisualTree="ScanBinAmiiboMenuItem_AttachedToVisualTree"
Header="{ext:Locale MenuBarActionsScanAmiiboBin}"
Header="{ext:Locale Amiibo_MenuBarActions_ScanAmiiboBin}"
Icon="{ext:Icon fa-solid fa-cube}"
IsVisible="{Binding CanScanAmiiboBinaries}"
InputGesture="Ctrl + B"
@ -197,9 +197,10 @@
InputGesture="{Binding ShowUiKey}"
IsEnabled="{Binding IsGameRunning}" />
<MenuItem
Name="CheatManagerMenuItem"
Command="{Binding OpenCheatManagerForCurrentApp}"
Header="{ext:Locale GameListContextMenuManageCheat}"
Icon="{ext:Icon fa-solid fa-code}"
InputGesture="Ctrl + C"
IsEnabled="{Binding IsGameRunning}" />
<Separator IsVisible="{Binding RenderDocIsAvailable}" />
<MenuItem
@ -226,13 +227,13 @@
IsEnabled="{Binding IsGameRunning}" />
</MenuItem>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarActions}" IsVisible="{Binding EnableNonGameRunningControls}">
<MenuItem Header="{ext:Locale MenuBarActionsInstallKeys}" Icon="{ext:Icon fa-solid fa-key}">
<MenuItem Command="{Binding InstallKeysFromFile}" Header="{ext:Locale MenuBarFileActionsInstallKeysFromFile}" Icon="{ext:Icon fa-solid fa-file-code}" />
<MenuItem Command="{Binding InstallKeysFromFolder}" Header="{ext:Locale MenuBarFileActionsInstallKeysFromFolder}" Icon="{ext:Icon fa-solid fa-folder-closed}" />
<MenuItem Header="{ext:Locale Keys_MenuBarActions_Install}" Icon="{ext:Icon fa-solid fa-key}">
<MenuItem Command="{Binding InstallKeysFromFile}" Header="{ext:Locale Keys_MenuBarActions_InstallFromKeys}" Icon="{ext:Icon fa-solid fa-file-code}" />
<MenuItem Command="{Binding InstallKeysFromFolder}" Header="{ext:Locale Keys_MenuBarFileActions_InstallFromFolder}" Icon="{ext:Icon fa-solid fa-folder-closed}" />
</MenuItem>
<MenuItem Header="{ext:Locale MenuBarActionsInstallFirmware}" Icon="{ext:Icon fa-solid fa-floppy-disk}">
<MenuItem Command="{Binding InstallFirmwareFromFile}" Header="{ext:Locale MenuBarActionsInstallFirmwareFromFile}" Icon="{ext:Icon fa-solid fa-file-code}" />
<MenuItem Command="{Binding InstallFirmwareFromFolder}" Header="{ext:Locale MenuBarActionsInstallFirmwareFromDirectory}" Icon="{ext:Icon fa-solid fa-folder-closed}" />
<MenuItem Header="{ext:Locale Firmware_MenuBarActions_Install}" Icon="{ext:Icon fa-solid fa-floppy-disk}">
<MenuItem Command="{Binding InstallFirmwareFromFile}" Header="{ext:Locale Firmware_MenuBarActions_InstallFromFile}" Icon="{ext:Icon fa-solid fa-file-code}" />
<MenuItem Command="{Binding InstallFirmwareFromFolder}" Header="{ext:Locale Firmware_MenuBarActions_InstallFromDirectory}" Icon="{ext:Icon fa-solid fa-folder-closed}" />
</MenuItem>
<MenuItem Header="{ext:Locale MenuBarActionsManageFileTypes}" IsVisible="{Binding ManageFileTypesVisible}" Icon="{ext:Icon fa-solid fa-clipboard}">
<MenuItem Name="InstallFileTypesMenuItem" Header="{ext:Locale MenuBarActionsInstallFileTypes}" IsEnabled="{Binding AreMimeTypesRegistered, Converter={x:Static BoolConverters.Not}}" Icon="{ext:Icon fa-solid fa-square-plus}" />
@ -241,8 +242,8 @@
<Separator />
<MenuItem Header="{ext:Locale MenuBarActionsTools}" Icon="{ext:Icon fa-solid fa-toolbox}">
<MenuItem
Name="MiiAppletMenuItem" Header="{ext:Locale MenuBarActionsOpenMiiEditor}" Icon="{ext:Icon fa-solid fa-face-grin-wide}" ToolTip.Tip="{ext:Locale MenuBarActionsOpenMiiEditorToolTip}" />
<MenuItem Name="XciTrimmerMenuItem" Header="{ext:Locale MenuBarActionsXCITrimmer}" Icon="{ext:Icon fa-solid fa-scissors}" />
Name="MiiAppletMenuItem" Header="{ext:Locale MiiEditor_MenuBarActions_OpenEditor}" Icon="{ext:Icon fa-solid fa-face-grin-wide}" />
<MenuItem Name="XciTrimmerMenuItem" Header="{ext:Locale XCITrimmer_MenuBarActions_OpenTrimmer}" Icon="{ext:Icon fa-solid fa-scissors}" ToolTip.Tip="{ext:Locale XCITrimmer_MenuBarActions_OpenTrimmer_ToolTip}" />
</MenuItem>
</MenuItem>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarView}">

View File

@ -43,7 +43,6 @@ namespace Ryujinx.Ava.UI.Views.Main
PauseEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Pause());
ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume());
StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted());
CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp);
InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes);
UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes);
XciTrimmerMenuItem.Command = Commands.Create(XciTrimmerView.Show);
@ -153,7 +152,7 @@ namespace Ryujinx.Ava.UI.Views.Main
ViewModel.LoadConfigurableHotKeys();
}
public AppletMetadata MiiApplet => new(ViewModel.ContentManager, "miiEdit", 0x0100000000001009);
public AppletMetadata MiiApplet => new(ViewModel.ContentManager, LocaleManager.Instance[LocaleKeys.MiiEditor_MenuBarActions_OpenEditor], 0x0100000000001009);
public async Task OpenMiiApplet()
{
@ -163,24 +162,6 @@ namespace Ryujinx.Ava.UI.Views.Main
await ViewModel.LoadApplication(appData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData);
}
public async Task OpenCheatManagerForCurrentApp()
{
if (!ViewModel.IsGameRunning)
return;
string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
await StyleableAppWindow.ShowAsync(
new CheatWindow(
Window.VirtualFileSystem,
ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText,
name,
ViewModel.SelectedApplication.Path)
);
ViewModel.AppHost.Device.EnableCheats();
}
private void ScanAmiiboMenuItem_AttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e)
{
if (sender is MenuItem)

View File

@ -50,17 +50,18 @@
VerticalAlignment="Center"
IsVisible="{Binding EnableNonGameRunningControls}"
Text="{ext:Locale StatusBarGamesLoaded}" />
<controls:MiniVerticalSeparator Grid.Column="2" IsVisible="{Binding StatusBarProgressStatusVisible}" />
<TextBlock
Name="StatusBarProgressStatus"
Grid.Column="2"
Grid.Column="3"
MinWidth="200"
Margin="10,0,5,0"
Margin="5,0,5,0"
VerticalAlignment="Center"
IsVisible="{Binding StatusBarProgressStatusVisible}"
Text="{Binding StatusBarProgressStatusText}" />
<ProgressBar
Name="LoadProgressBar"
Grid.Column="3"
Grid.Column="4"
MinWidth="200"
Height="6"
VerticalAlignment="Center"
@ -69,9 +70,9 @@
IsVisible="{Binding StatusBarVisible}"
Maximum="{Binding StatusBarProgressMaximum}"
Value="{Binding StatusBarProgressValue}" />
<controls:MiniVerticalSeparator Grid.Column="4" IsVisible="{Binding ShowTotalTimePlayed}" />
<controls:MiniVerticalSeparator Grid.Column="5" IsVisible="{Binding ShowTotalTimePlayed}" />
<TextBlock
Grid.Column="5"
Grid.Column="6"
Margin="5,0,5,0"
VerticalAlignment="Center"
IsVisible="{Binding ShowTotalTimePlayed}"
@ -267,7 +268,7 @@
</StackPanel>
<StackPanel
Grid.Column="3"
Margin="0, 0, 5, 0"
Margin="0,0,5,0"
IsVisible="{Binding IsGameRunning}"
VerticalAlignment="Center"
Orientation="Horizontal">
@ -305,7 +306,7 @@
<Binding Path="UpdateAvailable" />
</MultiBinding>
</StackPanel.IsVisible>
<Button Margin="0, 0, 5, -2"
<Button Margin="0,0,5,-2"
Command="{Binding UpdateCommand}"
Background="{DynamicResource SystemAccentColor}">
<TextBlock
@ -326,10 +327,10 @@
<controls:MiniVerticalSeparator IsVisible="{Binding IsGameRunning}" />
<TextBlock
Name="FirmwareStatus"
Margin="5, 0, 0, 0"
Margin="5,0,0,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Text="{ext:Locale StatusBarSystemVersion}" />
Text="{ext:Locale Firmware_StatusBar_Version}" />
</StackPanel>
</Grid>
</UserControl>

View File

@ -14,77 +14,79 @@
x:DataType="viewModels:AmiiboWindowViewModel"
CanResize="False"
WindowStartupLocation="CenterOwner"
Width="800"
Width="850"
MinHeight="650"
Height="650"
Height="700"
SizeToContent="Manual"
MinWidth="600"
Focusable="True">
<Design.DataContext>
<viewModels:AmiiboWindowViewModel />
</Design.DataContext>
<Grid RowDefinitions="Auto,Auto,*,Auto" Margin="15" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid Name="FlushControls" ColumnDefinitions="Auto,Auto" Grid.Row="1" Margin="-15">
<controls:RyujinxLogo
<Grid Grid.Row="0" RowDefinitions="Auto,Auto,*,Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<!-- UI FlushControls -->
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto" Name="FlushControls">
<controls:RyujinxLogo
Grid.Column="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="8, 8, 7, 0"
ToolTip.Tip="{ext:WindowTitle Amiibo}" />
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="0, 0, 0, 20">
<StackPanel Spacing="10" Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox Margin="0, 8, 0, 0" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
Margin="7,0,7,0"
ToolTip.Tip="{ext:WindowTitle Amiibo_Amiibo}" />
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Margin="8,0,0,0" VerticalAlignment="Center" Text="{ext:Locale Amiibo_SeriesLabel}" />
<ComboBox Margin="5,5,0,5" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
<CheckBox Grid.Column="2" Margin="15,0,0,0" IsChecked="{Binding ShowAllAmiibo}">
<TextBlock Text="{ext:Locale Amiibo_OptionsShowAllLabel}" />
</CheckBox>
<CheckBox Grid.Column="3" Margin="15,0,0,0" IsChecked="{Binding UseRandomUuid}" HotKey="H">
<TextBlock Text="{ext:Locale Amiibo_OptionsUsRandomTagLabel}" />
</CheckBox>
</Grid>
<Grid Name="NormalControls" ColumnDefinitions="*,*" Grid.Row="1" HorizontalAlignment="Stretch" >
<StackPanel Spacing="10" Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
<!-- UI NormalControls -->
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto" Name="NormalControls">
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Margin="15,0,0,0" VerticalAlignment="Center" Text="{ext:Locale Amiibo_SeriesLabel}" />
<ComboBox Margin="5,5,0,5" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
<CheckBox Grid.Column="1" Margin="15,0,0,0" IsChecked="{Binding ShowAllAmiibo}">
<TextBlock Text="{ext:Locale Amiibo_OptionsShowAllLabel}" />
</CheckBox>
<CheckBox Grid.Column="2" Margin="15,0,0,0" IsChecked="{Binding UseRandomUuid}" HotKey="H">
<TextBlock Text="{ext:Locale Amiibo_OptionsUsRandomTagLabel}" />
</CheckBox>
</Grid>
<DockPanel Grid.Row="2">
<!-- Amiibo ListBox, Images, Buttons -->
<StackPanel Grid.Row="2" Margin="0,20,0,20" Orientation="Horizontal" HorizontalAlignment="Center" Spacing="50">
<ListBox
DockPanel.Dock="Left"
Width="300"
Margin="20"
Padding="5"
SelectionMode="Single"
ItemsSource="{Binding AmiiboList}"
SelectedIndex="{Binding AmiiboSelectedIndex}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Margin="10, 0, 0 ,0" Text="{Binding Name}" />
<TextBlock Margin="10,0,0,0" Text="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<StackPanel Margin="20">
<Image Source="{Binding AmiiboImage}" Height="350" Width="150" HorizontalAlignment="Center" />
<ScrollViewer MaxHeight="120" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"
Margin="20" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<TextBlock TextWrapping="Wrap" Text="{Binding Usage}" HorizontalAlignment="Center"
TextAlignment="Center" />
<StackPanel Width="300">
<Image Source="{Binding AmiiboImage}" Height="400" Width="200" />
<ScrollViewer MaxHeight="120" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Margin="20" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<TextBlock TextWrapping="Wrap" Text="{Binding Usage}" HorizontalAlignment="Center" TextAlignment="Center" />
</ScrollViewer>
</StackPanel>
</DockPanel>
<Grid Grid.Row="3" ColumnDefinitions="Auto,Auto,*,Auto,Auto">
<CheckBox Margin="10" Grid.Column="0" VerticalContentAlignment="Center"
IsChecked="{Binding ShowAllAmiibo}"
Content="{ext:Locale AmiiboOptionsShowAllLabel}" />
<CheckBox HotKey="H"
Margin="10" VerticalContentAlignment="Center" Grid.Column="1"
IsChecked="{Binding UseRandomUuid}"
Content="{ext:Locale AmiiboOptionsUsRandomTagLabel}" />
</StackPanel>
<Grid Grid.Row="3" Margin="0,0,10,10" ColumnDefinitions="Auto,Auto,*,Auto,Auto">
<Button Grid.Column="3"
IsEnabled="{Binding EnableScanning}"
Width="80"
Name="ScanButton"
HotKey="Return"
Content="{ext:Locale AmiiboScanButtonLabel}"
Content="{ext:Locale Amiibo_ScanButtonLabel}"
Click="ScanButton_Click" />
<Button Grid.Column="4"
Margin="10,0"
Margin="10,0,0,0"
Width="80"
Name="CancelButton"
HotKey="Escape"

View File

@ -20,7 +20,7 @@ namespace Ryujinx.Ava.UI.Windows
FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI;
NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI;
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo);
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo_Amiibo);
}
public AmiiboWindow()
@ -31,7 +31,7 @@ namespace Ryujinx.Ava.UI.Windows
if (Program.PreviewerDetached)
{
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo);
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo_Amiibo);
}
}

View File

@ -40,7 +40,9 @@
<KeyBinding Gesture="F9" Command="{Binding ToggleDockMode}" />
<KeyBinding Gesture="Escape" Command="{Binding ExitCurrentState}" />
<KeyBinding Gesture="Ctrl+A" Command="{Binding OpenAmiiboWindow}" />
<KeyBinding Gesture="Ctrl+B" Command="{Binding OpenBinFile}" />
<KeyBinding Gesture="Ctrl+B" Command="{Binding OpenAmiiboBinFile}" />
<KeyBinding Gesture="Ctrl+C" Command="{Binding OpenCheatManagerForCurrentApp}" />
<KeyBinding Gesture="Ctrl+M" Command="{Binding SimulateWakeUpMessage}" />
<KeyBinding Gesture="Ctrl+Shift+R" Command="{Binding ReloadRenderDocApi}" />
<KeyBinding Gesture="Ctrl+Shift+C" Command="{Binding ToggleCapture}" />
</Window.KeyBindings>
@ -107,24 +109,12 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"
IsVisible="{Binding ShowLoadProgress}" ColumnDefinitions="Auto,*">
<Border
Grid.RowSpan="2"
Grid.Column="0"
<Image
Margin="20"
Width="256"
Height="256"
Margin="10"
Padding="4"
BorderBrush="Black"
BorderThickness="2"
BoxShadow="4 4 32 8 #40000000"
CornerRadius="3"
IsVisible="{Binding ShowLoadProgress}">
<Image
Width="256"
Height="256"
IsVisible="{Binding ShowLoadProgress}"
Source="{Binding SelectedIcon, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" />
</Border>
IsVisible="{Binding ShowLoadProgress}"
Source="{Binding SelectedIcon, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" />
<Grid
Grid.Column="1"
HorizontalAlignment="Stretch"