Compare commits

..

9 Commits

Author SHA1 Message Date
heihei123456780
0502da96cd Merge branch 'master' into master 2024-12-25 10:37:12 +08:00
Evan Husted
16a60fdf12 UI: Rename App to RyujinxApp
Add more NotificationHelper methods
Simplify ID copy logic
2024-12-24 13:39:48 -06:00
Evan Husted
4d7350fc6e UI: Copy Title ID by clicking on it. 2024-12-24 13:23:43 -06:00
heihei123456780
7df0fb587e Updated zh-CN translation 2024-12-24 16:26:40 +08:00
heihei123456780
50847f0687 Merge branch 'GreemDev:master' into master 2024-12-24 16:23:41 +08:00
heihei123456780
125f6d2777 Updated zh-CN translation 2024-12-24 13:03:34 +08:00
heihei123456780
dfc4831828 Update locales.json
Fix format error.
2024-12-24 10:58:05 +08:00
heihei123456780
45feeae9db Update locales.json
Updated zh-CN translation
2024-12-24 10:52:44 +08:00
heihei123456780
e67df5219c Update locales.json
Add missing zh-CN translation.
2024-12-24 10:34:49 +08:00
15 changed files with 203 additions and 122 deletions

View File

@@ -89,7 +89,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Аплет для редагування Mii",
"zh_CN": "",
"zh_CN": "Mii 小程序",
"zh_TW": ""
}
},
@@ -713,7 +713,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "从bin文件扫描 Amiibo",
"zh_TW": ""
}
},
@@ -833,7 +833,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "安装密匙",
"zh_TW": ""
}
},
@@ -857,7 +857,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "从.KEYS文件或ZIP压缩包安装密匙",
"zh_TW": ""
}
},
@@ -881,7 +881,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "从一个文件夹安装密匙",
"zh_TW": ""
}
},
@@ -977,7 +977,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізати XCI файли",
"zh_CN": "",
"zh_CN": "XCI文件瘦身",
"zh_TW": ""
}
},
@@ -1217,7 +1217,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "常见问题和问题排除页面",
"zh_TW": ""
}
},
@@ -1241,7 +1241,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "打开Ryujinx官方wiki的常见问题和问题排除页面",
"zh_TW": ""
}
},
@@ -1265,7 +1265,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "安装与配置指南",
"zh_TW": ""
}
},
@@ -1289,7 +1289,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "打开Ryujinx官方wiki的安装与配置指南",
"zh_TW": ""
}
},
@@ -1313,7 +1313,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "多人游戏LDN/LAN指南",
"zh_TW": ""
}
},
@@ -1337,7 +1337,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "打开Ryujinx官方wiki的多人游戏指南",
"zh_TW": ""
}
},
@@ -2441,7 +2441,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Перевірка та Нарізка XCI Файлів",
"zh_CN": "",
"zh_CN": "检查并瘦身XCI文件",
"zh_TW": ""
}
},
@@ -2465,7 +2465,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Перевірка та Нарізка XCI Файлів для збереження місця на диску",
"zh_CN": "",
"zh_CN": "检查并瘦身XCI文件以节约磁盘空间",
"zh_TW": ""
}
},
@@ -2537,7 +2537,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізано XCI Файлів '{0}'",
"zh_CN": "",
"zh_CN": "XCI文件瘦身中'{0}'",
"zh_TW": ""
}
},
@@ -10097,7 +10097,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Скасування",
"zh_CN": "",
"zh_CN": "正在取消",
"zh_TW": ""
}
},
@@ -10121,7 +10121,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Закрити",
"zh_CN": "",
"zh_CN": "关闭",
"zh_TW": ""
}
},
@@ -11369,7 +11369,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Показати список змін",
"zh_CN": "",
"zh_CN": "显示更新日志",
"zh_TW": ""
}
},
@@ -11825,7 +11825,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "XCI文件瘦身窗口",
"zh_TW": ""
}
},
@@ -12521,7 +12521,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "在{0}发现了一个无效的密匙文件",
"zh_TW": ""
}
},
@@ -12545,7 +12545,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Встановлення Ключів",
"zh_CN": "",
"zh_CN": "安装密匙",
"zh_TW": ""
}
},
@@ -12569,7 +12569,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Новий файл Ключів буде встановлено",
"zh_CN": "",
"zh_CN": "将会安装新密匙文件",
"zh_TW": ""
}
},
@@ -12593,7 +12593,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "\n\nЦе замінить собою поточні файли Ключів.",
"zh_CN": "",
"zh_CN": "\n\n这也许会替换掉一些当前已安装的密匙",
"zh_TW": ""
}
},
@@ -12617,7 +12617,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "\n\nВи хочете продовжити?",
"zh_CN": "",
"zh_CN": "\n\n你想要继续吗",
"zh_TW": ""
}
},
@@ -12641,7 +12641,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Встановлення Ключів...",
"zh_CN": "",
"zh_CN": "安装密匙中。。。",
"zh_TW": ""
}
},
@@ -12665,7 +12665,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Нові ключі встановлено.",
"zh_CN": "",
"zh_CN": "已成功安装新密匙文件",
"zh_TW": ""
}
},
@@ -13673,7 +13673,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Минулі розробники:",
"zh_CN": "",
"zh_CN": "曾经的维护者:",
"zh_TW": ""
}
},
@@ -14657,7 +14657,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "重新同步系统时间以匹配您电脑的当前日期和时间。\n\n这个操作不会实时同步系统时间与电脑时间时间仍然可能不同步在这种情况下只需再次单击此按钮即可。",
"zh_TW": ""
}
},
@@ -16817,7 +16817,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Часткові",
"zh_CN": "",
"zh_CN": "分区",
"zh_TW": ""
}
},
@@ -16841,7 +16841,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Необрізані",
"zh_CN": "",
"zh_CN": "没有瘦身的",
"zh_TW": ""
}
},
@@ -16865,7 +16865,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізані",
"zh_CN": "",
"zh_CN": "经过瘦身的",
"zh_TW": ""
}
},
@@ -16889,7 +16889,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "(Невдача)",
"zh_CN": "",
"zh_CN": "(失败)",
"zh_TW": ""
}
},
@@ -16913,7 +16913,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Зберегти {0:n0} Мб",
"zh_CN": "",
"zh_CN": "能节约 {0:n0} Mb",
"zh_TW": ""
}
},
@@ -16937,7 +16937,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Збережено {0:n0} Мб",
"zh_CN": "",
"zh_CN": "节约了 {0:n0} Mb",
"zh_TW": ""
}
},
@@ -17129,7 +17129,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вкажіть Ваше нове ім'я Amiibo",
"zh_CN": "",
"zh_CN": "输入你的 Amiibo 的新名字",
"zh_TW": ""
}
},
@@ -17153,7 +17153,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Будь ласка, проскануйте Ваш Amiibo.",
"zh_CN": "",
"zh_CN": "请现在扫描你的 Amiibo",
"zh_TW": ""
}
},
@@ -18233,7 +18233,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Перевірити та Обрізати XCI файл",
"zh_CN": "",
"zh_CN": "检查并瘦身XCI文件",
"zh_TW": ""
}
},
@@ -18257,7 +18257,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.",
"zh_CN": "",
"zh_CN": "这个功能将会先检查XCI文件再对其执行瘦身操作以节约磁盘空间。",
"zh_TW": ""
}
},
@@ -18281,7 +18281,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB",
"zh_CN": "",
"zh_CN": "当前文件大小: {0:n} MB\n游戏数据大小: {1:n} MB\n节约的磁盘空间: {2:n} MB",
"zh_TW": ""
}
},
@@ -18305,7 +18305,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації",
"zh_CN": "",
"zh_CN": "XCI文件不需要被瘦身。查看日志以获得更多细节。",
"zh_TW": ""
}
},
@@ -18329,7 +18329,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації",
"zh_CN": "",
"zh_CN": "XCI文件不能被瘦身。查看日志以获得更多细节。",
"zh_TW": ""
}
},
@@ -18353,7 +18353,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації",
"zh_CN": "",
"zh_CN": "XCI文件是只读的且不可以被标记为可读取的。查看日志以获得更多细节。",
"zh_TW": ""
}
},
@@ -18377,7 +18377,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову",
"zh_CN": "",
"zh_CN": "XCI文件在扫描后大小发生了变化。请检查文件是否未被写入然后重试。",
"zh_TW": ""
}
},
@@ -18401,7 +18401,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна",
"zh_CN": "",
"zh_CN": "XCI文件的空闲区域内有数据不能安全瘦身。",
"zh_TW": ""
}
},
@@ -18425,7 +18425,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації",
"zh_CN": "",
"zh_CN": "XCI文件含有无效数据。查看日志以获得更多细节。",
"zh_TW": ""
}
},
@@ -18449,7 +18449,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації",
"zh_CN": "",
"zh_CN": "XCI文件不能被读写。查看日志以获得更多细节。",
"zh_TW": ""
}
},
@@ -18473,7 +18473,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Не вдалося обрізати файл XCI",
"zh_CN": "",
"zh_CN": "XCI文件瘦身失败",
"zh_TW": ""
}
},
@@ -18497,7 +18497,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Операція перервана",
"zh_CN": "",
"zh_CN": "操作已取消",
"zh_TW": ""
}
},
@@ -18521,7 +18521,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Операція не проводилася",
"zh_CN": "",
"zh_CN": "未执行操作",
"zh_TW": ""
}
},
@@ -18665,7 +18665,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізка XCI Файлів",
"zh_CN": "",
"zh_CN": "XCI文件瘦身器",
"zh_TW": ""
}
},
@@ -18689,7 +18689,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "{0} з {1} тайтл(ів) обрано",
"zh_CN": "",
"zh_CN": "在 {1} 中选中了 {0} 个游戏 ",
"zh_TW": ""
}
},
@@ -18713,7 +18713,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "{0} з {1} тайтл(ів) обрано ({2} відображається)",
"zh_CN": "",
"zh_CN": "在 {1} 中选中了 {0} 个游戏 (显示了 {2} 个)",
"zh_TW": ""
}
},
@@ -18737,7 +18737,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізка {0} тайтл(ів)...",
"zh_CN": "",
"zh_CN": "{0} 个游戏瘦身中。。。",
"zh_TW": ""
}
},
@@ -18785,7 +18785,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Невдача",
"zh_CN": "",
"zh_CN": "失败",
"zh_TW": ""
}
},
@@ -18809,7 +18809,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Потенційна економія",
"zh_CN": "",
"zh_CN": "潜在的储存空间节省",
"zh_TW": ""
}
},
@@ -18833,7 +18833,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Зекономлено",
"zh_CN": "",
"zh_CN": "实际的储存空间节省",
"zh_TW": ""
}
},
@@ -18881,7 +18881,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вибрати показане",
"zh_CN": "",
"zh_CN": "选定显示的",
"zh_TW": ""
}
},
@@ -18905,7 +18905,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Скасувати вибір показаного",
"zh_CN": "",
"zh_CN": "反选显示的",
"zh_TW": ""
}
},
@@ -18977,7 +18977,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Обрізка",
"zh_CN": "",
"zh_CN": "瘦身",
"zh_TW": ""
}
},
@@ -19337,7 +19337,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Продовжити",
"zh_CN": "",
"zh_CN": "继续",
"zh_TW": ""
}
},
@@ -19697,7 +19697,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "自动",
"zh_TW": ""
}
},
@@ -19721,7 +19721,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "使用Vulkan。\n在ARM Mac上当玩在其下运行良好的游戏时使用Metal后端。",
"zh_TW": ""
}
},
@@ -21065,7 +21065,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вимкнути хостинг P2P мережі (може збільшити затримку)",
"zh_CN": "",
"zh_CN": "禁用P2P网络连接 (也许会增加延迟)",
"zh_TW": ""
}
},
@@ -21089,7 +21089,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.",
"zh_CN": "",
"zh_CN": "禁用P2P网络连接对方将通过主服务器进行连接而不是直接连接到您。",
"zh_TW": ""
}
},
@@ -21113,7 +21113,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Мережевий пароль:",
"zh_CN": "",
"zh_CN": "网络密码:",
"zh_TW": ""
}
},
@@ -21137,7 +21137,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
"zh_CN": "",
"zh_CN": "您只能看到与您使用相同密码的游戏房间。",
"zh_TW": ""
}
},
@@ -21161,7 +21161,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
"zh_CN": "",
"zh_CN": "以Ryujinx-<8个十六进制字符>的格式输入密码。您只能看到与您使用相同密码的游戏房间。",
"zh_TW": ""
}
},
@@ -21185,7 +21185,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "(публічний)",
"zh_CN": "",
"zh_CN": "(公开的)",
"zh_TW": ""
}
},
@@ -21209,7 +21209,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Згенерувати випадкову",
"zh_CN": "",
"zh_CN": "随机生成",
"zh_TW": ""
}
},
@@ -21233,7 +21233,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Генерує новий пароль, яким можна поділитися з іншими гравцями.",
"zh_CN": "",
"zh_CN": "生成一个新的密码,可以与其他玩家共享。",
"zh_TW": ""
}
},
@@ -21257,7 +21257,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Очистити",
"zh_CN": "",
"zh_CN": "清除",
"zh_TW": ""
}
},
@@ -21281,7 +21281,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Очищає поточну пароль, повертаючись до публічної мережі.",
"zh_CN": "",
"zh_CN": "清除当前密码,返回公共网络。",
"zh_TW": ""
}
},
@@ -21305,7 +21305,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\"",
"zh_CN": "",
"zh_CN": "无效密码!密码的格式必须是\"Ryujinx-<8个十六进制字符>\"",
"zh_TW": ""
}
},
@@ -21329,7 +21329,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вертикальна синхронізація (VSync):",
"zh_CN": "",
"zh_CN": "垂直同步VSync",
"zh_TW": ""
}
},
@@ -21353,7 +21353,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Увімкнути користувацьку частоту оновлення (Експериментально)",
"zh_CN": "",
"zh_CN": "启动自定义刷新率(实验性功能)",
"zh_TW": ""
}
},
@@ -21401,7 +21401,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Безмежна",
"zh_CN": "",
"zh_CN": "无限制",
"zh_TW": ""
}
},
@@ -21425,7 +21425,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Користувацька",
"zh_CN": "",
"zh_CN": "自定义刷新率",
"zh_TW": ""
}
},
@@ -21449,7 +21449,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.",
"zh_CN": "",
"zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。",
"zh_TW": ""
}
},
@@ -21473,7 +21473,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.",
"zh_CN": "",
"zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。“自定义刷新率”模拟指定的自定义刷新率。",
"zh_TW": ""
}
},
@@ -21497,7 +21497,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.",
"zh_CN": "",
"zh_CN": "允许用户指定模拟刷新率。在某些游戏中这可能会加快或减慢游戏逻辑的速度。在其他游戏中它可能允许将FPS限制在刷新率的某个倍数或者导致不可预测的行为。这是一个实验性功能无法保证游戏会受到怎样的影响。\n\n如果不确定请关闭。",
"zh_TW": ""
}
},
@@ -21521,7 +21521,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Цільове значення користувацької частоти оновлення.",
"zh_CN": "",
"zh_CN": "目标自定义刷新率值。",
"zh_TW": ""
}
},
@@ -21545,7 +21545,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.",
"zh_CN": "",
"zh_CN": "自定义刷新率占正常SWitch刷新率的百分比值。",
"zh_TW": ""
}
},
@@ -21569,7 +21569,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Користувацька частота оновлення %:",
"zh_CN": "",
"zh_CN": "自定义刷新率值 %:",
"zh_TW": ""
}
},
@@ -21593,7 +21593,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Значення користувацька частота оновлення:",
"zh_CN": "",
"zh_CN": "自定义刷新率值:",
"zh_TW": ""
}
},
@@ -21617,7 +21617,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "间隔",
"zh_TW": ""
}
},
@@ -21641,7 +21641,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Перемкнути VSync режим:",
"zh_CN": "",
"zh_CN": "设置 VSync 模式:",
"zh_TW": ""
}
},
@@ -21665,7 +21665,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Підвищити користувацьку частоту оновлення",
"zh_CN": "",
"zh_CN": "提高自定义刷新率:",
"zh_TW": ""
}
},
@@ -21689,7 +21689,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "Понизити користувацьку частоту оновлення",
"zh_CN": "",
"zh_CN": "降低自定义刷新率:",
"zh_TW": ""
}
}

View File

@@ -146,7 +146,7 @@ namespace Ryujinx.Ava.Common
var cancellationToken = new CancellationTokenSource();
UpdateWaitWindow waitingDialog = new(
App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)),
cancellationToken);
@@ -268,10 +268,9 @@ namespace Ryujinx.Ava.Common
{
Dispatcher.UIThread.Post(waitingDialog.Close);
NotificationHelper.Show(
App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
$"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}",
NotificationType.Information);
NotificationHelper.ShowInformation(
RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
$"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}");
}
}

View File

@@ -65,7 +65,7 @@ namespace Ryujinx.Ava
}
public static AppBuilder BuildAvaloniaApp() =>
AppBuilder.Configure<App>()
AppBuilder.Configure<RyujinxApp>()
.UsePlatformDetect()
.With(new X11PlatformOptions
{
@@ -100,7 +100,7 @@ namespace Ryujinx.Ava
// Delete backup files after updating.
Task.Run(Updater.CleanupUpdate);
Console.Title = $"{App.FullAppName} Console {Version}";
Console.Title = $"{RyujinxApp.FullAppName} Console {Version}";
// Hook unhandled exception and process exit events.
AppDomain.CurrentDomain.UnhandledException += (sender, e)
@@ -225,7 +225,7 @@ namespace Ryujinx.Ava
private static void PrintSystemInfo()
{
Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}");
Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}");
SystemInfo.Gather().Print();
var enabledLogLevels = Logger.GetEnabledLevels().ToArray();

View File

@@ -1,5 +1,5 @@
<Application
x:Class="Ryujinx.Ava.App"
x:Class="Ryujinx.Ava.RyujinxApp"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sty="using:FluentAvalonia.Styling">

View File

@@ -1,5 +1,6 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Input.Platform;
using Avalonia.Markup.Xaml;
using Avalonia.Platform;
using Avalonia.Styling;
@@ -19,7 +20,7 @@ using System.Diagnostics;
namespace Ryujinx.Ava
{
public class App : Application
public class RyujinxApp : Application
{
internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
=> windowTitleKey is null
@@ -32,6 +33,12 @@ namespace Ryujinx.Ava
.ApplicationLifetime.Cast<IClassicDesktopStyleApplicationLifetime>()
.MainWindow.Cast<MainWindow>();
public static bool IsClipboardAvailable(out IClipboard clipboard)
{
clipboard = MainWindow.Clipboard;
return clipboard != null;
}
public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state);
public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total);
public static void SetTaskbarProgressValue(long current, long total) => SetTaskbarProgressValue(Convert.ToUInt64(current), Convert.ToUInt64(total));
@@ -132,7 +139,7 @@ namespace Ryujinx.Ava
};
public static ThemeVariant DetectSystemTheme() =>
Current is App { PlatformSettings: not null } app
Current is RyujinxApp { PlatformSettings: not null } app
? ConvertThemeVariant(app.PlatformSettings.GetColorValues().ThemeVariant)
: ThemeVariant.Default;
}

View File

@@ -101,11 +101,21 @@
VerticalAlignment="Top"
Orientation="Vertical"
Spacing="5">
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding IdString}"
TextAlignment="Start"
TextWrapping="Wrap" />
<Button
Click="IdString_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
Background="{DynamicResource AppListBackgroundColor}"
Margin="-1, 0, 0, 0"
Padding="0" >
<TextBlock
Margin="1.5"
HorizontalAlignment="Stretch"
Text="{Binding IdString}"
Tag="{Binding Id}"
TextAlignment="Start"
TextWrapping="Wrap" />
</Button>
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FileExtension}"

View File

@@ -1,10 +1,13 @@
using Avalonia.Controls;
using Avalonia.Controls.Notifications;
using Avalonia.Input;
using Avalonia.Interactivity;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.UI.App.Common;
using System;
using System.Linq;
namespace Ryujinx.Ava.UI.Controls
{
@@ -32,5 +35,27 @@ namespace Ryujinx.Ava.UI.Controls
if (DataContext is MainWindowViewModel viewModel && sender is ListBox { SelectedItem: ApplicationData selected })
viewModel.ListSelectedApplication = selected;
}
private async void IdString_OnClick(object sender, RoutedEventArgs e)
{
if (DataContext is not MainWindowViewModel mwvm)
return;
if (sender is not Button { Content: TextBlock idText })
return;
if (!RyujinxApp.IsClipboardAvailable(out var clipboard))
return;
var appData = mwvm.Applications.FirstOrDefault(it => it.IdString == idText.Text);
if (appData is null)
return;
await clipboard.SetTextAsync(appData.IdString);
NotificationHelper.ShowInformation(
"Copied Title ID",
$"{appData.Name} ({appData.IdString})");
}
}
}

View File

@@ -62,9 +62,46 @@ namespace Ryujinx.Ava.UI.Helpers
_notifications.Add(new Notification(title, text, type, delay, onClick, onClose));
}
public static void ShowError(string message)
{
Show(LocaleManager.Instance[LocaleKeys.DialogErrorTitle], $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}", NotificationType.Error);
}
public static void ShowError(string message) =>
ShowError(
LocaleManager.Instance[LocaleKeys.DialogErrorTitle],
$"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}"
);
public static void ShowInformation(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) =>
Show(
title,
text,
NotificationType.Information,
waitingExit,
onClick,
onClose);
public static void ShowSuccess(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) =>
Show(
title,
text,
NotificationType.Success,
waitingExit,
onClick,
onClose);
public static void ShowWarning(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) =>
Show(
title,
text,
NotificationType.Warning,
waitingExit,
onClick,
onClose);
public static void ShowError(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) =>
Show(
title,
text,
NotificationType.Error,
waitingExit,
onClick,
onClose);
}
}

View File

@@ -51,7 +51,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public AboutWindowViewModel()
{
Version = App.FullAppName + "\n" + Program.Version;
Version = RyujinxApp.FullAppName + "\n" + Program.Version;
UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value);
ThemeManager.ThemeChanged += ThemeManager_ThemeChanged;
@@ -64,7 +64,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private void UpdateLogoTheme(string theme)
{
bool isDarkTheme = theme == "Dark" || (theme == "Auto" && App.DetectSystemTheme() == ThemeVariant.Dark);
bool isDarkTheme = theme == "Dark" || (theme == "Auto" && RyujinxApp.DetectSystemTheme() == ThemeVariant.Dark);
string basePath = "resm:Ryujinx.UI.Common.Resources.";
string themeSuffix = isDarkTheme ? "Dark.png" : "Light.png";

View File

@@ -2051,7 +2051,7 @@ namespace Ryujinx.Ava.UI.ViewModels
Dispatcher.UIThread.InvokeAsync(() =>
{
Title = App.FormatTitle();
Title = RyujinxApp.FormatTitle();
});
}

View File

@@ -16,7 +16,7 @@ namespace Ryujinx.Ava.UI.Windows
InitializeComponent();
Title = App.FormatTitle(LocaleKeys.Amiibo);
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo);
}
public AmiiboWindow()
@@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.Windows
if (Program.PreviewerDetached)
{
Title = App.FormatTitle(LocaleKeys.Amiibo);
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo);
}
}

View File

@@ -28,7 +28,7 @@ namespace Ryujinx.Ava.UI.Windows
InitializeComponent();
Title = App.FormatTitle(LocaleKeys.CheatWindowTitle);
Title = RyujinxApp.FormatTitle(LocaleKeys.CheatWindowTitle);
}
public CheatWindow(VirtualFileSystem virtualFileSystem, string titleId, string titleName, string titlePath)
@@ -93,7 +93,7 @@ namespace Ryujinx.Ava.UI.Windows
DataContext = this;
Title = App.FormatTitle(LocaleKeys.CheatWindowTitle);
Title = RyujinxApp.FormatTitle(LocaleKeys.CheatWindowTitle);
}
public void Save()

View File

@@ -86,7 +86,7 @@ namespace Ryujinx.Ava.UI.Windows
UiHandler = new AvaHostUIHandler(this);
ViewModel.Title = App.FormatTitle();
ViewModel.Title = RyujinxApp.FormatTitle();
TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar;
TitleBar.TitleBarHitTestType = (ConfigurationState.Instance.ShowTitleBar) ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex;
@@ -98,6 +98,9 @@ namespace Ryujinx.Ava.UI.Windows
StatusBarHeight = StatusBarView.StatusBar.MinHeight;
MenuBarHeight = MenuBar.MinHeight;
ApplicationList.DataContext = DataContext;
ApplicationGrid.DataContext = DataContext;
SetWindowSizePosition();
if (Program.PreviewerDetached)
@@ -114,7 +117,7 @@ namespace Ryujinx.Ava.UI.Windows
/// </summary>
private static void OnPlatformColorValuesChanged(object sender, PlatformColorValues e)
{
if (Application.Current is App app)
if (Application.Current is RyujinxApp app)
app.ApplyConfiguredTheme(ConfigurationState.Instance.UI.BaseStyle);
}

View File

@@ -14,7 +14,7 @@ namespace Ryujinx.Ava.UI.Windows
public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
{
Title = App.FormatTitle(LocaleKeys.Settings);
Title = RyujinxApp.FormatTitle(LocaleKeys.Settings);
DataContext = ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);

View File

@@ -76,7 +76,7 @@ namespace Ryujinx.Ava
if (!Version.TryParse(Program.Version, out Version currentVersion))
{
Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {App.FullAppName} version!");
Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {RyujinxApp.FullAppName} version!");
await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage],
@@ -159,7 +159,7 @@ namespace Ryujinx.Ava
if (!Version.TryParse(_buildVer, out Version newVersion))
{
Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {App.FullAppName} version from GitHub!");
Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {RyujinxApp.FullAppName} version from GitHub!");
await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage],
@@ -266,7 +266,7 @@ namespace Ryujinx.Ava
SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterDownloading],
IconSource = new SymbolIconSource { Symbol = Symbol.Download },
ShowProgressBar = true,
XamlRoot = App.MainWindow,
XamlRoot = RyujinxApp.MainWindow,
};
taskDialog.Opened += (s, e) =>
@@ -490,7 +490,7 @@ namespace Ryujinx.Ava
bytesWritten += readSize;
taskDialog.SetProgressBarState(GetPercentage(bytesWritten, totalBytes), TaskDialogProgressState.Normal);
App.SetTaskbarProgressValue(bytesWritten, totalBytes);
RyujinxApp.SetTaskbarProgressValue(bytesWritten, totalBytes);
updateFileStream.Write(buffer, 0, readSize);
}