mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-17 08:47:49 +00:00
Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 365866c35f | |||
| 3d6d69568d | |||
| 62a2107c06 | |||
| cf2f419942 | |||
| f657529ab5 | |||
| 8eae2d60e5 | |||
| 3e64e53cd7 | |||
| ef9afa8cbc | |||
| 143461d597 | |||
| ae887e10d6 | |||
| 186c70591a | |||
| 777e7893e3 | |||
| b2a1b172e2 | |||
| fc72ac5c63 | |||
| f1576c7798 | |||
| 388526d02d | |||
| cb65fb4b11 | |||
| b82c9cf6e6 | |||
| 04fff476d5 | |||
| 66bcdfd84e | |||
| 8494f2ec3e | |||
| 52f25708ad | |||
| 24b02114cb | |||
| 651215723d | |||
| ca9831be05 | |||
| f7fd7b712f | |||
| 3859c0e483 | |||
| 2db92536fd | |||
| a6ffc8f04d | |||
| 4df8cb5026 | |||
| a86d473280 | |||
| 4d226b00fc | |||
| 8b16b156ed | |||
| 4029a43637 | |||
| 57f4555350 | |||
| bd87cc852b | |||
| 30d7c9bb81 | |||
| 890599c7bb | |||
| b8e48d2146 | |||
| da1db5a053 | |||
| 60353df7ed | |||
| 13b6ed5ad9 | |||
| 89bbbf6fe4 | |||
| fdc556edee | |||
| f87e794c3f | |||
| 56719df827 | |||
| 3c11bb71f6 | |||
| 413cec9244 | |||
| 935de1ad0c | |||
| 9542708c92 | |||
| b3c363c89f | |||
| 5f5e8ad5d7 | |||
| 6b6de2fcd5 |
+11
-6
@@ -129,7 +129,7 @@ class PluginBrowser:
|
||||
logger.warning(f"Plugin {name} not installed, skipping uninstallation")
|
||||
except Exception as e:
|
||||
logger.error(f"Plugin {name} in {plugin_dir} was not uninstalled")
|
||||
logger.error(f"Error at %s", exc_info=e)
|
||||
logger.error(f"Error at {str(e)}", exc_info=e)
|
||||
if self.loader.watcher:
|
||||
self.loader.watcher.disabled = False
|
||||
|
||||
@@ -239,10 +239,15 @@ class PluginBrowser:
|
||||
name (string): The name of the plugin
|
||||
"""
|
||||
hidden_plugins = self.settings.getSetting("hiddenPlugins", [])
|
||||
hidden_plugins.remove(name)
|
||||
self.settings.setSetting("hiddenPlugins", hidden_plugins)
|
||||
if name in hidden_plugins:
|
||||
hidden_plugins.remove(name)
|
||||
self.settings.setSetting("hiddenPlugins", hidden_plugins)
|
||||
|
||||
plugin_order = self.settings.getSetting("pluginOrder")
|
||||
plugin_order.remove(name)
|
||||
self.settings.setSetting("pluginOrder", plugin_order)
|
||||
|
||||
plugin_order = self.settings.getSetting("pluginOrder", [])
|
||||
|
||||
if name in plugin_order:
|
||||
plugin_order.remove(name)
|
||||
self.settings.setSetting("pluginOrder", plugin_order)
|
||||
|
||||
logger.debug("Removed any settings for plugin %s", name)
|
||||
|
||||
+1
-1
@@ -159,4 +159,4 @@ async def stop_systemd_unit(unit_name: str) -> bool:
|
||||
return await localplatform.service_stop(unit_name)
|
||||
|
||||
async def start_systemd_unit(unit_name: str) -> bool:
|
||||
return await localplatform.service_start(unit_name)
|
||||
return await localplatform.service_start(unit_name)
|
||||
|
||||
@@ -0,0 +1,252 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"stable": "Стабилен",
|
||||
"testing": "Тестване",
|
||||
"label": "Канал за обновления",
|
||||
"prerelease": "Предварителни издания"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Презареждане след 5 секунди",
|
||||
"disabling": "Изключване на React DevTools",
|
||||
"enabling": "Включване на React DevTools"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Назад"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"unknown": "Възникна неизвестна грешка. Грешката в суров вид е: {{raw_error}}",
|
||||
"file_not_found": "Посоченият път е неправилен. Проверете го и го въведете правилно.",
|
||||
"perm_denied": "Нямате достъп до посочената папка. Проверете дали потребителят (deck на Steam Deck) има съответните правомощия за достъп до посочената папка/файл."
|
||||
}
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"file": {
|
||||
"select": "Избиране на този файл"
|
||||
},
|
||||
"files": {
|
||||
"all_files": "Всички файлове",
|
||||
"file_type": "Файлов тип",
|
||||
"show_hidden": "Показване на скритите файлове"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "Дата на създаване (първо най-старите)",
|
||||
"created_desc": "Дата на създаване (първо най-новите)",
|
||||
"modified_asce": "Дата на промяна (първо най-старите)",
|
||||
"modified_desc": "Дата на промяна (първо най-новите)",
|
||||
"name_asce": "Я-А",
|
||||
"name_desc": "А-Я",
|
||||
"size_asce": "Размер (първо най-малките)",
|
||||
"size_desc": "Размер (първо най-големите)"
|
||||
},
|
||||
"folder": {
|
||||
"label": "Папка",
|
||||
"show_more": "Показване на още файлове",
|
||||
"select": "Използване на тази папка"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"description": {
|
||||
"install": "Инсталиране на {{name}} {{version}}",
|
||||
"reinstall": "Преинсталиране на {{name}} {{version}}",
|
||||
"update": "Обновяване на {{name}} до {{version}}"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Потвърждаване",
|
||||
"loading": "В процес на работа"
|
||||
},
|
||||
"title": {
|
||||
"mixed_one": "Промяна на {{count}} добавка",
|
||||
"mixed_other": "Промяна на {{count}} добавки",
|
||||
"update_one": "Обновяване на 1 добавка",
|
||||
"update_other": "Обновяване на {{count}} добавки",
|
||||
"install_one": "Инсталиране на 1 добавка",
|
||||
"install_other": "Инсталиране на {{count}} добавки",
|
||||
"reinstall_one": "Преинсталиране на 1 добавка",
|
||||
"reinstall_other": "Преинсталиране на {{count}} добавки"
|
||||
},
|
||||
"confirm": "Наистина ли искате да направите следните промени?"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "Тази добавка има пълен достъп до Вашия Steam Deck.",
|
||||
"plugin_install": "Инсталиране",
|
||||
"plugin_no_desc": "Няма описание.",
|
||||
"plugin_version_label": "Версия на добавката"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Инсталиране",
|
||||
"desc": "Наистина ли искате да инсталирате {{artifact}} {{version}}?",
|
||||
"title": "Инсталиране на {{artifact}}",
|
||||
"button_processing": "Инсталиране"
|
||||
},
|
||||
"reinstall": {
|
||||
"button_idle": "Преинсталиране",
|
||||
"button_processing": "Преинсталиране",
|
||||
"desc": "Наистина ли искате да преинсталирате {{artifact}} {{version}}?",
|
||||
"title": "Преинсталиране на {{artifact}}"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Обновяване",
|
||||
"title": "Обновяване на {{artifact}}",
|
||||
"button_processing": "Обновяване",
|
||||
"desc": "Наистина ли искате да обновите {{artifact}} {{version}}?"
|
||||
},
|
||||
"no_hash": "Тази добавка няма хеш. Инсталирате я на свой собствен риск."
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"hide": "Бърз достъп: Скриване",
|
||||
"no_plugin": "Няма инсталирани добавки!",
|
||||
"plugin_actions": "Действия с добавката",
|
||||
"reinstall": "Преинсталиране",
|
||||
"uninstall": "Деинсталиране",
|
||||
"update_to": "Обновяване до {{name}}",
|
||||
"reload": "Презареждане",
|
||||
"show": "Бърз достъп: Показване",
|
||||
"update_all_one": "Обновяване на 1 добавка",
|
||||
"update_all_other": "Обновяване на {{count}} добавки"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Скрито от менюто за бърз достъп"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"error": "Грешка",
|
||||
"plugin_load_error": {
|
||||
"message": "Грешка при зареждането на добавката {{name}}",
|
||||
"toast": "Грешка при зареждането на {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Деинсталиране",
|
||||
"desc": "Наистина ли искате да деинсталирате {{name}}?",
|
||||
"title": "Деинсталиране на {{name}}"
|
||||
},
|
||||
"plugin_update_one": "Има налично обновление за 1 добавка!",
|
||||
"plugin_update_other": "Има налични обновления за {{count}} добавки!",
|
||||
"decky_update_available": "Има налично обновление до {{tag_name}}!",
|
||||
"plugin_error_uninstall": "Зареждането на {{name}} предизвика грешка, както се вижда по-горе. Това обикновено означава, че добавката изисква обновяване на новата версия на SteamUI. Проверете дали има обновление или изберете да я премахнете в настройките на Decky, в раздела с добавките."
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Разрешаване на достъп без удостоверяване до дебъгера на CEF на всеки от Вашата мрежа",
|
||||
"label": "Разрешаване на отдалеченото дебъгване на CEF"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Отваряне на конзолата",
|
||||
"label": "Конзола на CEF",
|
||||
"desc": "Отваря конзолата на CEF. Това има смисъл единствено за дебъгване. Нещата тук може да са опасни и трябва да бъдат използвани само ако Вие сте разработчик на добавка, или получавате насоки от такъв."
|
||||
},
|
||||
"header": "Други",
|
||||
"react_devtools": {
|
||||
"ip_label": "IP",
|
||||
"label": "Включване на React DevTools",
|
||||
"desc": "Включва свързването към компютър, на който работи React DevTools. Промяната на тази настройка ще презареди Steam. Задайте IP адреса преди да включите това."
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Инсталиране",
|
||||
"button_zip": "Разглеждане",
|
||||
"header": "Добавки от външен източник",
|
||||
"label_desc": "Адрес",
|
||||
"label_zip": "Инсталиране на добавка от файл ZIP",
|
||||
"label_url": "Инсталиране на добавка от адрес в Интернет"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc2": "Не пипайте нищо в това меню, освен ако не знаете какво правите.",
|
||||
"label": "Включване на вътрешното меню на Valve",
|
||||
"desc1": "Включва вътрешното меню за разработчици на Valve."
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Версия на Decky",
|
||||
"header": "Относно"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Режим за разработчици"
|
||||
},
|
||||
"notifications": {
|
||||
"decky_updates_label": "Има налично обновление на Decky",
|
||||
"header": "Известия",
|
||||
"plugin_updates_label": "Има налични обновления на добавките"
|
||||
},
|
||||
"other": {
|
||||
"header": "Други"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Обновления"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Участие в бета-версии"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Разработчик",
|
||||
"general_title": "Общи",
|
||||
"plugins_title": "Добавки"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "Допринасяне",
|
||||
"desc": "Ако искате да допринесете към магазина за добавки на Decky, разгледайте хранилището SteamDeckHomebrew/decky-plugin-template в GitHub. Може да намерите информация относно разработката и разпространението във файла README."
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Филтър",
|
||||
"label_def": "Всички"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Търсене"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Подредба",
|
||||
"label_def": "Последно обновление (първо най-новите)"
|
||||
},
|
||||
"store_source": {
|
||||
"label": "Изходен код",
|
||||
"desc": "Целият изходен код е наличен в хранилището SteamDeckHomebrew/decky-plugin-database в GitHub."
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Относно",
|
||||
"alph_asce": "По азбучен ред (Я -> А)",
|
||||
"alph_desc": "По азбучен ред (А -> Я)",
|
||||
"title": "Разглеждане"
|
||||
},
|
||||
"store_testing_cta": "Помислете дали искате да тествате новите добавки, за да помогнете на екипа на Decky Loader!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Персонализиран магазин",
|
||||
"url_label": "Адрес"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Персонализиран",
|
||||
"default": "По подразбиране",
|
||||
"label": "Канал за магазина",
|
||||
"testing": "Тестване"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Обновления на Decky",
|
||||
"patch_notes_desc": "Бележки за промените",
|
||||
"updates": {
|
||||
"check_button": "Проверка за обновления",
|
||||
"checking": "Проверяване",
|
||||
"cur_version": "Текуща версия: {{ver}}",
|
||||
"label": "Обновления",
|
||||
"lat_version": "Използвате най-новата версия: {{ver}}",
|
||||
"reloading": "Презареждане",
|
||||
"updating": "Обновяване",
|
||||
"install_button": "Инсталиране на обновлението"
|
||||
},
|
||||
"no_patch_notes_desc": "няма бележки за промените в тази версия"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 добавка е скрита от този списък",
|
||||
"hidden_other": "{{count}} добавки са скрити от този списък"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"label": "Aktualizační kanál",
|
||||
"prerelease": "Předběžná vydání",
|
||||
"stable": "Stabilní",
|
||||
"testing": "Testování"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"disabling": "Vypínám React DevTools",
|
||||
"enabling": "Zapínám React DevTools",
|
||||
"5secreload": "Znovu načtení za 5 vteřin"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "Použít tuto složku"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plugin je v tomto seznamu skrytý",
|
||||
"hidden_few": "{{count}} pluginů je v tomto seznamu skryto",
|
||||
"hidden_other": "{{count}} pluginů je v tomto seznamu skryto"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Skryto z nabídky rychlého přístupu"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "Tento plugin má plný přístup k vašemu Steam Decku.",
|
||||
"plugin_install": "Instalovat",
|
||||
"plugin_no_desc": "Nebyl uveden žádný popis.",
|
||||
"plugin_version_label": "Verze pluginu"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Instalovat",
|
||||
"button_processing": "Instalování",
|
||||
"title": "Instalovat {{artifact}}",
|
||||
"desc": "Jste si jisti, že chcete nainstalovat {{artifact}} {{version}}?"
|
||||
},
|
||||
"no_hash": "Tento plugin nemá hash, instalujete jej na vlastní nebezpečí.",
|
||||
"reinstall": {
|
||||
"button_idle": "Přeinstalovat",
|
||||
"button_processing": "Přeinstalování",
|
||||
"title": "Přeinstalovat {{artifact}}",
|
||||
"desc": "Jste si jisti, že chcete přeinstalovat {{artifact}} {{version}}?"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Aktualizovat",
|
||||
"button_processing": "Aktualizování",
|
||||
"desc": "Jste si jisti, že chcete aktualizovat {{artifact}} {{version}}?",
|
||||
"title": "Aktualizovat {{artifact}}"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Upravit 1 plugin",
|
||||
"mixed_few": "Upravit {{count}} pluginů",
|
||||
"mixed_other": "Upravit {{count}} pluginů",
|
||||
"reinstall_one": "Přeinstalovat 1 plugin",
|
||||
"reinstall_few": "Přeinstalovat {{count}} pluginů",
|
||||
"reinstall_other": "Přeinstalovat {{count}} pluginů",
|
||||
"install_one": "Instalovat 1 plugin",
|
||||
"install_few": "Instalovat {{count}} pluginů",
|
||||
"install_other": "Instalovat {{count}} pluginů",
|
||||
"update_one": "Aktualizovat 1 plugin",
|
||||
"update_few": "Aktualizovat {{count}} pluginů",
|
||||
"update_other": "Aktualizovat {{count}} pluginů"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Potvrdit",
|
||||
"loading": "Probíhá"
|
||||
},
|
||||
"description": {
|
||||
"install": "Instalovat {{name}} {{version}}",
|
||||
"update": "Aktualizovat {{name}} na {{version}}",
|
||||
"reinstall": "Přeinstalovat {{name}} {{version}}"
|
||||
},
|
||||
"confirm": "Jste si jisti, že chcete udělat následující úpravy?"
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Nejsou nainstalovány žádné pluginy!",
|
||||
"plugin_actions": "Akce pluginu",
|
||||
"reinstall": "Přeinstalovat",
|
||||
"reload": "Znovu načíst",
|
||||
"uninstall": "Odinstalovat",
|
||||
"update_to": "Aktualizovat na {{name}}",
|
||||
"show": "Rychlý přístup: Zobrazit",
|
||||
"hide": "Rychlý přístup: Skrýt",
|
||||
"update_all_one": "Aktualizovat 1 plugin",
|
||||
"update_all_few": "Aktualizovat {{count}} pluginů",
|
||||
"update_all_other": "Aktualizovat {{count}} pluginů"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "Aktualizace na {{tag_name}} dostupná!",
|
||||
"error": "Chyba",
|
||||
"plugin_load_error": {
|
||||
"message": "Chyba při načítání pluginu {{name}}",
|
||||
"toast": "Chyba při načítání {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Odinstalovat",
|
||||
"desc": "Opravdu chcete odinstalovat {{name}}?",
|
||||
"title": "Odinstalovat {{name}}"
|
||||
},
|
||||
"plugin_update_one": "Je dostupná aktualizace pro 1 plugin!",
|
||||
"plugin_update_few": "Jsou dostupné aktualizace pro {{count}} pluginů!",
|
||||
"plugin_update_other": "Jsou dostupné aktualizace pro {{count}} pluginů!",
|
||||
"plugin_error_uninstall": "Načítání {{name}} způsobilo chybu uvedenou výše. To obvykle znamená, že plugin vyžaduje aktualizaci SteamUI. Zkontrolujte, zda je aktualizace k dispozici, nebo zvažte odstranění pluginu v nastavení Decky v sekci Pluginy."
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Otevřít konzoli",
|
||||
"label": "CEF konzole",
|
||||
"desc": "Otevře CEF konzoli. Užitečné pouze pro účely ladění. Věci zde jsou potenciálně nebezpečné a měly by být používány pouze v případě, že jste vývojář pluginů, nebo vás sem nějaký nasměroval."
|
||||
},
|
||||
"header": "Ostatní",
|
||||
"react_devtools": {
|
||||
"desc": "Umožňuje připojení k počítači, na kterém běží React DevTools. Změnou tohoto nastavení se znovu načte Steam. Před povolením nastavte IP adresu.",
|
||||
"ip_label": "IP adresa",
|
||||
"label": "Zapnout React DevTools"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Instalovat",
|
||||
"button_zip": "Procházet",
|
||||
"header": "Pluginy třetí strany",
|
||||
"label_desc": "URL",
|
||||
"label_url": "Instalovat plugin z URL",
|
||||
"label_zip": "Instalovat plugin ze ZIP souboru"
|
||||
},
|
||||
"toast_zip": {
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Zapíná interní vývojářské menu Valve.",
|
||||
"desc2": "Nedotýkejte se ničeho v této nabídce, pokud nevíte, co děláte.",
|
||||
"label": "Zapnout Valve Internal"
|
||||
}
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"label": "Povolit vzdálené CEF ladění",
|
||||
"desc": "Umožní neověřený přístup k CEF ladění komukoli ve vaší síti"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Decky verze",
|
||||
"header": "O Decky"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Účast v betě"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Vývojářský režim"
|
||||
},
|
||||
"other": {
|
||||
"header": "Ostatní"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Aktualizace"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Vývojář",
|
||||
"general_title": "Obecné",
|
||||
"plugins_title": "Pluginy"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "Přispívání",
|
||||
"desc": "Pokud byste chtěli přispět do obchodu Decky Plugin Store, podívejte se na repozitář SteamDeckHomebrew/decky-plugin-template na GitHubu. Informace o vývoji a distribuci jsou k dispozici v README."
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Filtr",
|
||||
"label_def": "Vše"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Hledat"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Seřadit",
|
||||
"label_def": "Naposledy aktualizováno (Nejnovější)"
|
||||
},
|
||||
"store_source": {
|
||||
"desc": "Veškerý zdrojový kód pluginu je dostupný v repozitáři SteamDeckHomebrew/decky-plugin-database na GitHubu.",
|
||||
"label": "Zdrojový kód"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "O Decky Plugin Store",
|
||||
"alph_asce": "Abecedně (Z do A)",
|
||||
"alph_desc": "Abecedně (A do Z)",
|
||||
"title": "Procházet"
|
||||
},
|
||||
"store_testing_cta": "Zvažte prosím testování nových pluginů, pomůžete tím týmu Decky Loader!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Vlastní obchod",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Vlastní",
|
||||
"default": "Výchozí",
|
||||
"label": "Kanál obchodu",
|
||||
"testing": "Testování"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"updates": {
|
||||
"lat_version": "Aktuální: běží na verzi {{ver}}",
|
||||
"reloading": "Znovu načítání",
|
||||
"updating": "Aktualizování",
|
||||
"check_button": "Zkontrolovat aktualizace",
|
||||
"checking": "Kontrolování",
|
||||
"cur_version": "Aktuální verze: {{ver}}",
|
||||
"install_button": "Instalovat aktualizaci",
|
||||
"label": "Aktualizace"
|
||||
},
|
||||
"decky_updates": "Aktualizace Decky",
|
||||
"patch_notes_desc": "Poznámky k verzi",
|
||||
"no_patch_notes_desc": "žádné poznámky pro tuto verzi"
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,9 @@
|
||||
"reinstall": "Neu installieren",
|
||||
"reload": "Neu laden",
|
||||
"uninstall": "Deinstallieren",
|
||||
"update_to": "Aktualisieren zu {{name}}"
|
||||
"update_to": "Aktualisieren zu {{name}}",
|
||||
"update_all_one": "",
|
||||
"update_all_other": ""
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
@@ -91,7 +93,6 @@
|
||||
"label_url": "Installiere Erweiterung via URL"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Installation fehlgeschlagen! Nur ZIP Datein werden unterstützt.",
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
@@ -109,7 +110,6 @@
|
||||
"header": "Beta Teilnahme"
|
||||
},
|
||||
"developer_mode": {
|
||||
"desc": "Aktiviere Deckys Entwickleroptionen.",
|
||||
"label": "Entwickleroptionen"
|
||||
},
|
||||
"other": {
|
||||
@@ -122,8 +122,7 @@
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Entwickler",
|
||||
"general_title": "Allgemein",
|
||||
"plugins_title": "Erweiterungen",
|
||||
"navbar_settings": "Decky Einstellungen"
|
||||
"plugins_title": "Erweiterungen"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
@@ -179,5 +178,21 @@
|
||||
"updating": "Aktualisiere"
|
||||
},
|
||||
"no_patch_notes_desc": "Für diese Version gibt es keine Patchnotizen"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "",
|
||||
"hidden_other": ""
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"install_one": "",
|
||||
"install_other": "",
|
||||
"mixed_one": "",
|
||||
"mixed_other": "",
|
||||
"update_one": "",
|
||||
"update_other": "",
|
||||
"reinstall_one": "",
|
||||
"reinstall_other": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"label_zip": "Εγκατάσταση επέκτασης από αρχείο ZIP"
|
||||
},
|
||||
"toast_zip": {
|
||||
"title": "Decky",
|
||||
"body": "Η εγκατάσταση απέτυχε. Μόνο αρχεία ZIP επιτρέπονται."
|
||||
},
|
||||
"valve_internal": {
|
||||
@@ -69,7 +68,9 @@
|
||||
"reinstall": "Επανεγκατάσταση",
|
||||
"reload": "Επαναφόρτωση",
|
||||
"uninstall": "Απεγκατάσταση",
|
||||
"update_to": "Ενημέρωση σε {{name}}"
|
||||
"update_to": "Ενημέρωση σε {{name}}",
|
||||
"update_all_one": "",
|
||||
"update_all_other": ""
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
@@ -84,7 +85,9 @@
|
||||
"button": "Απεγκατάσταση",
|
||||
"desc": "Σίγουρα θέλετε να απεγκαταστήσετε το {{name}};",
|
||||
"title": "Απεγκατάσταση {{name}}"
|
||||
}
|
||||
},
|
||||
"plugin_update_one": "",
|
||||
"plugin_update_other": ""
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
@@ -98,7 +101,6 @@
|
||||
"header": "Σχετικά"
|
||||
},
|
||||
"developer_mode": {
|
||||
"desc": "Ενεργοποιεί το μενού προγραμματιστή του Decky.",
|
||||
"label": "Λειτουργία προγραμματιστή"
|
||||
},
|
||||
"other": {
|
||||
@@ -114,8 +116,7 @@
|
||||
"SettingsIndex": {
|
||||
"plugins_title": "Επεκτάσεις",
|
||||
"developer_title": "Προγραμματιστής",
|
||||
"general_title": "Γενικά",
|
||||
"navbar_settings": "Ρυθμίσεις Decky"
|
||||
"general_title": "Γενικά"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
@@ -176,5 +177,21 @@
|
||||
"folder": {
|
||||
"select": "Χρησιμοποιήστε αυτό το φάκελο"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "",
|
||||
"hidden_other": ""
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "",
|
||||
"mixed_other": "",
|
||||
"update_one": "",
|
||||
"update_other": "",
|
||||
"reinstall_one": "",
|
||||
"reinstall_other": "",
|
||||
"install_one": "",
|
||||
"install_other": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+249
-218
@@ -1,221 +1,252 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"label": "Update Channel",
|
||||
"prerelease": "Prerelease",
|
||||
"stable": "Stable",
|
||||
"testing": "Testing"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Reloading in 5 seconds",
|
||||
"disabling": "Disabling React DevTools",
|
||||
"enabling": "Enabling React DevTools"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "Use this folder"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plugin is hidden from this list",
|
||||
"hidden_other": "{{count}} plugins are hidden from this list"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Hidden from the quick access menu"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "This plugin has full access to your Steam Deck.",
|
||||
"plugin_install": "Install",
|
||||
"plugin_no_desc": "No description provided.",
|
||||
"plugin_version_label": "Plugin Version"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Install",
|
||||
"button_processing": "Installing",
|
||||
"desc": "Are you sure you want to install {{artifact}} {{version}}?",
|
||||
"title": "Install {{artifact}}"
|
||||
},
|
||||
"no_hash": "This plugin does not have a hash, you are installing it at your own risk.",
|
||||
"reinstall": {
|
||||
"button_idle": "Reinstall",
|
||||
"button_processing": "Reinstalling",
|
||||
"desc": "Are you sure you want to reinstall {{artifact}} {{version}}?",
|
||||
"title": "Reinstall {{artifact}}"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Update",
|
||||
"button_processing": "Updating",
|
||||
"desc": "Are you sure you want to update {{artifact}} {{version}}?",
|
||||
"title": "Update {{artifact}}"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Modify 1 plugin",
|
||||
"mixed_other": "Modify {{count}} plugins",
|
||||
"update_one": "Update 1 plugin",
|
||||
"update_other": "Update {{count}} plugins",
|
||||
"reinstall_one": "Reinstall 1 plugin",
|
||||
"reinstall_other": "Reinstall {{count}} plugins",
|
||||
"install_one": "Install 1 plugin",
|
||||
"install_other": "Install {{count}} plugins"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Confirm",
|
||||
"loading": "Working"
|
||||
},
|
||||
"confirm": "Are you sure you want to make the following modifications?",
|
||||
"description": {
|
||||
"install": "Install {{name}} {{version}}",
|
||||
"update": "Update {{name}} to {{version}}",
|
||||
"reinstall": "Reinstall {{name}} {{version}}"
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "No plugins installed!",
|
||||
"plugin_actions": "Plugin Actions",
|
||||
"reinstall": "Reinstall",
|
||||
"reload": "Reload",
|
||||
"uninstall": "Uninstall",
|
||||
"update_to": "Update to {{name}}",
|
||||
"show": "Quick access: Show",
|
||||
"hide": "Quick access: Hide",
|
||||
"update_all_one": "Update 1 plugin",
|
||||
"update_all_other": "Update {{count}} plugins"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "Update to {{tag_name}} available!",
|
||||
"error": "Error",
|
||||
"plugin_error_uninstall": "Loading {{name}} caused an exception as shown above. This usually means that the plugin requires an update for the new version of SteamUI. Check if an update is present or evaluate its removal in the Decky settings, in the Plugins section.",
|
||||
"plugin_load_error": {
|
||||
"message": "Error loading plugin {{name}}",
|
||||
"toast": "Error loading {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Uninstall",
|
||||
"desc": "Are you sure you want to uninstall {{name}}?",
|
||||
"title": "Uninstall {{name}}"
|
||||
},
|
||||
"plugin_update_one": "Updates available for 1 plugin!",
|
||||
"plugin_update_other": "Updates available for {{count}} plugins!"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Allow unauthenticated access to the CEF debugger to anyone in your network",
|
||||
"label": "Allow Remote CEF Debugging"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Open Console",
|
||||
"desc": "Opens the CEF Console. Only useful for debugging purposes. Stuff here is potentially dangerous and should only be used if you are a plugin dev, or are directed here by one.",
|
||||
"label": "CEF Console"
|
||||
},
|
||||
"header": "Other",
|
||||
"react_devtools": {
|
||||
"desc": "Enables connection to a computer running React DevTools. Changing this setting will reload Steam. Set the IP address before enabling.",
|
||||
"ip_label": "IP",
|
||||
"label": "Enable React DevTools"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Install",
|
||||
"button_zip": "Browse",
|
||||
"header": "Third-Party Plugins",
|
||||
"label_desc": "URL",
|
||||
"label_url": "Install Plugin from URL",
|
||||
"label_zip": "Install Plugin from ZIP File"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Installation failed! Only ZIP files are supported.",
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Enables the Valve internal developer menu.",
|
||||
"desc2": "Do not touch anything in this menu unless you know what it does.",
|
||||
"label": "Enable Valve Internal"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Decky Version",
|
||||
"header": "About"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Beta participation"
|
||||
},
|
||||
"developer_mode": {
|
||||
"desc": "Enables Decky's developer settings.",
|
||||
"label": "Developer mode"
|
||||
},
|
||||
"other": {
|
||||
"header": "Other"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Updates"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Developer",
|
||||
"general_title": "General",
|
||||
"navbar_settings": "Decky Settings",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"desc": "If you would like to contribute to the Decky Plugin Store, check the SteamDeckHomebrew/decky-plugin-template repository on GitHub. Information on development and distribution is available in the README.",
|
||||
"label": "Contributing"
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Filter",
|
||||
"label_def": "All"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Search"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Sort",
|
||||
"label_def": "Last Updated (Newest)"
|
||||
},
|
||||
"store_source": {
|
||||
"desc": "All plugin source code is available on SteamDeckHomebrew/decky-plugin-database repository on GitHub.",
|
||||
"label": "Source Code"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "About",
|
||||
"alph_asce": "Alphabetical (Z to A)",
|
||||
"alph_desc": "Alphabetical (A to Z)",
|
||||
"title": "Browse"
|
||||
},
|
||||
"store_testing_cta": "Please consider testing new plugins to help the Decky Loader team!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Custom Store",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Custom",
|
||||
"default": "Default",
|
||||
"label": "Store Channel",
|
||||
"testing": "Testing"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Decky Updates",
|
||||
"no_patch_notes_desc": "no patch notes for this version",
|
||||
"patch_notes_desc": "Patch Notes",
|
||||
"updates": {
|
||||
"check_button": "Check For Updates",
|
||||
"checking": "Checking",
|
||||
"cur_version": "Current version: {{ver}}",
|
||||
"install_button": "Install Update",
|
||||
"label": "Updates",
|
||||
"lat_version": "Up to date: running {{ver}}",
|
||||
"reloading": "Reloading",
|
||||
"updating": "Updating"
|
||||
}
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"label": "Update Channel",
|
||||
"prerelease": "Prerelease",
|
||||
"stable": "Stable",
|
||||
"testing": "Testing"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Reloading in 5 seconds",
|
||||
"disabling": "Disabling React DevTools",
|
||||
"enabling": "Enabling React DevTools"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Back"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"file_not_found": "The path specified is not valid. Please check it and reenter it correctly.",
|
||||
"perm_denied": "You do not have access to the specified directory. Please check if your user (deck on Steam Deck) has the corresponding permission to access the specified folder/file.",
|
||||
"unknown": "An unknown error occurred. The raw error is: {{raw_error}}"
|
||||
}
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"file": {
|
||||
"select": "Select this file"
|
||||
},
|
||||
"files": {
|
||||
"all_files": "All Files",
|
||||
"file_type": "File Type",
|
||||
"show_hidden": "Show Hidden Files"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "Created (Oldest)",
|
||||
"created_desc": "Created (Newest)",
|
||||
"modified_asce": "Modified (Oldest)",
|
||||
"modified_desc": "Modified (Newest)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"size_asce": "Size (Smallest)",
|
||||
"size_desc": "Size (Largest)"
|
||||
},
|
||||
"folder": {
|
||||
"label": "Folder",
|
||||
"select": "Use this folder",
|
||||
"show_more": "Show more files"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"confirm": "Are you sure you want to make the following modifications?",
|
||||
"description": {
|
||||
"install": "Install {{name}} {{version}}",
|
||||
"reinstall": "Reinstall {{name}} {{version}}",
|
||||
"update": "Update {{name}} to {{version}}"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Confirm",
|
||||
"loading": "Working"
|
||||
},
|
||||
"title": {
|
||||
"install_one": "Install 1 plugin",
|
||||
"install_other": "Install {{count}} plugins",
|
||||
"mixed_one": "Modify {{count}} plugin",
|
||||
"mixed_other": "Modify {{count}} plugins",
|
||||
"reinstall_one": "Reinstall 1 plugin",
|
||||
"reinstall_other": "Reinstall {{count}} plugins",
|
||||
"update_one": "Update 1 plugin",
|
||||
"update_other": "Update {{count}} plugins"
|
||||
}
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "This plugin has full access to your Steam Deck.",
|
||||
"plugin_install": "Install",
|
||||
"plugin_no_desc": "No description provided.",
|
||||
"plugin_version_label": "Plugin Version"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Install",
|
||||
"button_processing": "Installing",
|
||||
"desc": "Are you sure you want to install {{artifact}} {{version}}?",
|
||||
"title": "Install {{artifact}}"
|
||||
},
|
||||
"no_hash": "This plugin does not have a hash, you are installing it at your own risk.",
|
||||
"reinstall": {
|
||||
"button_idle": "Reinstall",
|
||||
"button_processing": "Reinstalling",
|
||||
"desc": "Are you sure you want to reinstall {{artifact}} {{version}}?",
|
||||
"title": "Reinstall {{artifact}}"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Update",
|
||||
"button_processing": "Updating",
|
||||
"desc": "Are you sure you want to update {{artifact}} {{version}}?",
|
||||
"title": "Update {{artifact}}"
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"hide": "Quick access: Hide",
|
||||
"no_plugin": "No plugins installed!",
|
||||
"plugin_actions": "Plugin Actions",
|
||||
"reinstall": "Reinstall",
|
||||
"reload": "Reload",
|
||||
"show": "Quick access: Show",
|
||||
"uninstall": "Uninstall",
|
||||
"update_all_one": "Update 1 plugin",
|
||||
"update_all_other": "Update {{count}} plugins",
|
||||
"update_to": "Update to {{name}}"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Hidden from the quick access menu"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "Update to {{tag_name}} available!",
|
||||
"error": "Error",
|
||||
"plugin_error_uninstall": "Loading {{name}} caused an exception as shown above. This usually means that the plugin requires an update for the new version of SteamUI. Check if an update is present or evaluate its removal in the Decky settings, in the Plugins section.",
|
||||
"plugin_load_error": {
|
||||
"message": "Error loading plugin {{name}}",
|
||||
"toast": "Error loading {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Uninstall",
|
||||
"desc": "Are you sure you want to uninstall {{name}}?",
|
||||
"title": "Uninstall {{name}}"
|
||||
},
|
||||
"plugin_update_one": "Updates available for 1 plugin!",
|
||||
"plugin_update_other": "Updates available for {{count}} plugins!"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plugin is hidden from this list",
|
||||
"hidden_other": "{{count}} plugins are hidden from this list"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Allow unauthenticated access to the CEF debugger to anyone in your network",
|
||||
"label": "Allow Remote CEF Debugging"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Open Console",
|
||||
"desc": "Opens the CEF Console. Only useful for debugging purposes. Stuff here is potentially dangerous and should only be used if you are a plugin dev, or are directed here by one.",
|
||||
"label": "CEF Console"
|
||||
},
|
||||
"header": "Other",
|
||||
"react_devtools": {
|
||||
"desc": "Enables connection to a computer running React DevTools. Changing this setting will reload Steam. Set the IP address before enabling.",
|
||||
"ip_label": "IP",
|
||||
"label": "Enable React DevTools"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Install",
|
||||
"button_zip": "Browse",
|
||||
"header": "Third-Party Plugins",
|
||||
"label_desc": "URL",
|
||||
"label_url": "Install Plugin from URL",
|
||||
"label_zip": "Install Plugin from ZIP File"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Enables the Valve internal developer menu.",
|
||||
"desc2": "Do not touch anything in this menu unless you know what it does.",
|
||||
"label": "Enable Valve Internal"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Decky Version",
|
||||
"header": "About"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Beta participation"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Developer mode"
|
||||
},
|
||||
"notifications": {
|
||||
"decky_updates_label": "Decky update available",
|
||||
"header": "Notifications",
|
||||
"plugin_updates_label": "Plugin updates available"
|
||||
},
|
||||
"other": {
|
||||
"header": "Other"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Updates"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Developer",
|
||||
"general_title": "General",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"desc": "If you would like to contribute to the Decky Plugin Store, check the SteamDeckHomebrew/decky-plugin-template repository on GitHub. Information on development and distribution is available in the README.",
|
||||
"label": "Contributing"
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Filter",
|
||||
"label_def": "All"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Search"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Sort",
|
||||
"label_def": "Last Updated (Newest)"
|
||||
},
|
||||
"store_source": {
|
||||
"desc": "All plugin source code is available on SteamDeckHomebrew/decky-plugin-database repository on GitHub.",
|
||||
"label": "Source Code"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "About",
|
||||
"alph_asce": "Alphabetical (Z to A)",
|
||||
"alph_desc": "Alphabetical (A to Z)",
|
||||
"title": "Browse"
|
||||
},
|
||||
"store_testing_cta": "Please consider testing new plugins to help the Decky Loader team!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Custom Store",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Custom",
|
||||
"default": "Default",
|
||||
"label": "Store Channel",
|
||||
"testing": "Testing"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Decky Updates",
|
||||
"no_patch_notes_desc": "no patch notes for this version",
|
||||
"patch_notes_desc": "Patch Notes",
|
||||
"updates": {
|
||||
"check_button": "Check For Updates",
|
||||
"checking": "Checking",
|
||||
"cur_version": "Current version: {{ver}}",
|
||||
"install_button": "Install Update",
|
||||
"label": "Updates",
|
||||
"lat_version": "Up to date: running {{ver}}",
|
||||
"reloading": "Reloading",
|
||||
"updating": "Updating"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"desc1": "Activa el menú interno de desarrollo de Valve."
|
||||
},
|
||||
"toast_zip": {
|
||||
"title": "Decky",
|
||||
"body": "¡Ha fallado la instalación! Solo se permiten archivos ZIP."
|
||||
},
|
||||
"cef_console": {
|
||||
@@ -118,8 +117,7 @@
|
||||
"decky_version": "Versión de Decky"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Modo desarrollador",
|
||||
"desc": "Activa los ajustes de desarrollador de Decky."
|
||||
"label": "Modo desarrollador"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Participación en la beta"
|
||||
@@ -131,7 +129,6 @@
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Desarrollador",
|
||||
"general_title": "General",
|
||||
"navbar_settings": "Ajustes de Decky",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
@@ -214,5 +211,10 @@
|
||||
"label": "Canál de la tienda",
|
||||
"testing": "Pruebas"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "",
|
||||
"hidden_many": "",
|
||||
"hidden_other": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"label_zip": "Installer le plugin à partir d'un fichier ZIP"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Échec de l'installation! Seuls les fichiers ZIP sont pris en charge.",
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
@@ -101,12 +100,15 @@
|
||||
"reload": "Recharger",
|
||||
"uninstall": "Désinstaller",
|
||||
"update_to": "Mettre à jour vers {{name}}",
|
||||
"no_plugin": "Aucun plugin installé !"
|
||||
"no_plugin": "Aucun plugin installé !",
|
||||
"update_all_one": "",
|
||||
"update_all_many": "",
|
||||
"update_all_other": ""
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"error": "Erreur",
|
||||
"plugin_error_uninstall": "Allez sur <0></0> dans le menu de Decky si vous voulez désinstaller ce plugin.",
|
||||
"plugin_error_uninstall": "Allez sur {{name}} dans le menu de Decky si vous voulez désinstaller ce plugin.",
|
||||
"plugin_load_error": {
|
||||
"message": "Erreur lors du chargement du plugin {{name}}",
|
||||
"toast": "Erreur lors du chargement de {{name}}"
|
||||
@@ -136,7 +138,6 @@
|
||||
"header": "Participation à la Bêta"
|
||||
},
|
||||
"developer_mode": {
|
||||
"desc": "Active les paramètres de développeur de Decky.",
|
||||
"label": "Mode développeur"
|
||||
},
|
||||
"other": {
|
||||
@@ -149,7 +150,6 @@
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Développeur",
|
||||
"general_title": "Général",
|
||||
"navbar_settings": "Paramètres de Decky",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
@@ -179,5 +179,26 @@
|
||||
"title": "Explorer"
|
||||
},
|
||||
"store_testing_cta": "Pensez à tester de nouveaux plugins pour aider l'équipe Decky Loader !"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "",
|
||||
"hidden_many": "",
|
||||
"hidden_other": ""
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"reinstall_one": "",
|
||||
"reinstall_many": "",
|
||||
"reinstall_other": "",
|
||||
"install_one": "",
|
||||
"install_many": "",
|
||||
"install_other": "",
|
||||
"mixed_one": "",
|
||||
"mixed_many": "",
|
||||
"mixed_other": "",
|
||||
"update_one": "",
|
||||
"update_many": "",
|
||||
"update_other": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+85
-51
@@ -8,13 +8,71 @@
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Ricarico in 5 secondi",
|
||||
"5secreload": "Ricarico tra 5 secondi",
|
||||
"disabling": "Disabilito i tools di React",
|
||||
"enabling": "Abilito i tools di React"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Indietro"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"file_not_found": "Il percorso specificato non è valido. Controllalo e prova a reinserirlo di nuovo.",
|
||||
"unknown": "È avvenuto un'errore sconosciuto. L'errore segnalato è {{raw_error}}",
|
||||
"perm_denied": "Il tuo utente non ha accesso alla directory specificata. Verifica se l'utente corrente (è deck su Steam Deck di default) ha i permessi corrispondenti per accedere alla cartella/file desiderato."
|
||||
}
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"file": {
|
||||
"select": "Seleziona questo file"
|
||||
},
|
||||
"files": {
|
||||
"all_files": "Tutti i file",
|
||||
"file_type": "Tipo di file",
|
||||
"show_hidden": "Mostra nascosti"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "Creazione (meno recente)",
|
||||
"created_desc": "Creazione (più recente)",
|
||||
"modified_asce": "Modifica (meno recente)",
|
||||
"modified_desc": "Modifica (più recente)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"size_asce": "Dimensione (più piccolo)",
|
||||
"size_desc": "Dimensione (più grande)"
|
||||
},
|
||||
"folder": {
|
||||
"select": "Usa questa cartella"
|
||||
"label": "Cartella",
|
||||
"select": "Usa questa cartella",
|
||||
"show_more": "Mostra più file"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"confirm": "Sei sicuro di voler effettuare le modifiche seguenti?",
|
||||
"description": {
|
||||
"install": "Installa {{name}} {{version}}",
|
||||
"reinstall": "Reinstalla {{name}} {{version}}",
|
||||
"update": "Aggiorna {{name}} alla versione {{version}}"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Conferma",
|
||||
"loading": "Elaboro"
|
||||
},
|
||||
"title": {
|
||||
"install_one": "Installa un plugin",
|
||||
"install_many": "Installa {{count}} plugins",
|
||||
"install_other": "Installa {{count}} plugins",
|
||||
"mixed_one": "Modifica un plugin",
|
||||
"mixed_many": "Modifica {{count}} plugins",
|
||||
"mixed_other": "Modifica {{count}} plugins",
|
||||
"reinstall_one": "Reinstalla un plugin",
|
||||
"reinstall_many": "Reinstalla {{count}} plugins",
|
||||
"reinstall_other": "Reinstalla {{count}} plugins",
|
||||
"update_one": "Aggiorna un plugin",
|
||||
"update_many": "Aggiorna {{count}} plugins",
|
||||
"update_other": "Aggiorna {{count}} plugins"
|
||||
}
|
||||
},
|
||||
"PluginCard": {
|
||||
@@ -45,17 +103,20 @@
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"hide": "Accesso rapido: Nascondi",
|
||||
"no_plugin": "Nessun plugin installato!",
|
||||
"plugin_actions": "Operazioni sui plugins",
|
||||
"reinstall": "Reinstalla",
|
||||
"reload": "Ricarica",
|
||||
"show": "Accesso rapido: Mostra",
|
||||
"uninstall": "Rimuovi",
|
||||
"update_to": "Aggiorna a {{name}}",
|
||||
"update_all_one": "Aggiorna un plugin",
|
||||
"update_all_many": "Aggiorna {{count}} plugins",
|
||||
"update_all_other": "Aggiorna {{count}} plugins",
|
||||
"show": "Accesso rapido: Mostra",
|
||||
"hide": "Accesso rapido: Nascondi"
|
||||
"update_to": "Aggiorna a {{name}}"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Nascosto dal menu di accesso rapido"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
@@ -75,6 +136,14 @@
|
||||
"plugin_update_many": "Aggiornamenti disponibili per {{count}} plugins!",
|
||||
"plugin_update_other": "Aggiornamenti disponibili per {{count}} plugins!"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "Un plugin è nascosto dalla lista",
|
||||
"hidden_many": "Sono nascosti {{count}} plugin dalla lista",
|
||||
"hidden_other": "Sono nascosti {{count}} plugin dalla lista"
|
||||
},
|
||||
"notifications": {
|
||||
"plugin_updates_label": "Aggiornamenti dei plugins"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Permetti l'accesso non autenticato al debugger di CEF da tutti gli indirizzi sulla tua rete locale",
|
||||
@@ -82,9 +151,14 @@
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Apri la console",
|
||||
"desc": "Apri la console di CEF. Utile solamente per ragioni di debug. Questa opzione deve essere usata solo se sei uno sviluppatore di plugin o se uno di questi ti ha chiesto di farlo, visto che questa feature potrebbe essere potenzialmente pericolosa.",
|
||||
"label": "Console CEF"
|
||||
},
|
||||
"header": "Altro",
|
||||
"react_devtools": {
|
||||
"desc": "Abilita la connessione ad un computer che esegue i DevTools di React. Cambiando questa impostazione ricaricherà Steam. Imposta l'indirizzo IP prima di abilitarlo.",
|
||||
"desc": "Abilita la connessione ad un computer che esegue i DevTools di React. Steam verrà ricaricato se lo stato cambia. Imposta il tuo indirizzo IP prima di abilitarlo.",
|
||||
"ip_label": "IP",
|
||||
"label": "Abilita i DevTools di React"
|
||||
},
|
||||
@@ -96,19 +170,10 @@
|
||||
"label_url": "Installa plugin da un'indirizzo web",
|
||||
"label_zip": "Installa plugin da un file ZIP"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Installazione non riuscita! Solo supportati solo file ZIP.",
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Abilita il menu di sviluppo interno di Valve.",
|
||||
"desc2": "Non toccare nulla in questo menu se non sai quello che fa.",
|
||||
"label": "Abilita Menu Sviluppatore"
|
||||
},
|
||||
"cef_console": {
|
||||
"label": "Console CEF",
|
||||
"button": "Apri la console",
|
||||
"desc": "Apri la console di CEF. Utile solamente per ragioni di debug. Questa opzione deve essere usata solo se sei uno sviluppatore di plugin o se uno di questi ti ha chiesto di farlo, visto che questa feature potrebbe essere potenzialmente pericolosa."
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
@@ -120,7 +185,6 @@
|
||||
"header": "Partecipazione alla beta"
|
||||
},
|
||||
"developer_mode": {
|
||||
"desc": "Abilità le impostazioni di sviluppo di Decky.",
|
||||
"label": "Modalità sviluppatore"
|
||||
},
|
||||
"other": {
|
||||
@@ -128,12 +192,16 @@
|
||||
},
|
||||
"updates": {
|
||||
"header": "Aggiornamenti"
|
||||
},
|
||||
"notifications": {
|
||||
"header": "Notifiche",
|
||||
"decky_updates_label": "Aggiornamenti di Decky",
|
||||
"plugin_updates_label": "Aggiornamenti dei plugins"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Sviluppatore",
|
||||
"general_title": "Generali",
|
||||
"navbar_settings": "Impostazioni Decky",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
@@ -190,39 +258,5 @@
|
||||
"reloading": "Ricaricando",
|
||||
"updating": "Aggiornando"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Modifica un plugin",
|
||||
"mixed_many": "Modifica {{count}} plugins",
|
||||
"mixed_other": "Modifica {{count}} plugins",
|
||||
"update_one": "Aggiorna un plugin",
|
||||
"update_many": "Aggiorna {{count}} plugins",
|
||||
"update_other": "Aggiorna {{count}} plugins",
|
||||
"reinstall_one": "Reinstalla un plugin",
|
||||
"reinstall_many": "Reinstalla {{count}} plugins",
|
||||
"reinstall_other": "Reinstalla {{count}} plugins",
|
||||
"install_one": "Installa un plugin",
|
||||
"install_many": "Installa {{count}} plugins",
|
||||
"install_other": "Installa {{count}} plugins"
|
||||
},
|
||||
"confirm": "Sei sicuro di voler effettuare le modifiche seguenti?",
|
||||
"ok_button": {
|
||||
"idle": "Conferma",
|
||||
"loading": "Elaboro"
|
||||
},
|
||||
"description": {
|
||||
"install": "Installa {{name}} {{version}}",
|
||||
"update": "Aggiorna {{name}} alla versione {{version}}",
|
||||
"reinstall": "Reinstalla {{name}} {{version}}"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "Un plugin è nascosto in questa lista",
|
||||
"hidden_many": "Sono nascosti {{count}} plugin da questa lista",
|
||||
"hidden_other": "Sono nascosti {{count}} plugin da questa lista"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Nascosti dal menu di accesso rapido"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"label": "업데이트 배포 채널",
|
||||
"stable": "안정판",
|
||||
"testing": "시험판",
|
||||
"prerelease": "사전 출시판"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"disabling": "React DevTools 비활성화",
|
||||
"enabling": "React DevTools 활성화",
|
||||
"5secreload": "5초 내로 다시 로드 됩니다"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "이 폴더 사용",
|
||||
"label": "폴더",
|
||||
"show_more": "더 많은 파일 표시"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "만든 날짜 (오름차순)",
|
||||
"modified_asce": "수정한 날짜 (오름차순)",
|
||||
"created_desc": "만든 날짜 (내림차 순)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"size_asce": "크기 (오름차순)",
|
||||
"modified_desc": "수정한 날짜 (내림차순)",
|
||||
"size_desc": "크기 (내림차순)"
|
||||
},
|
||||
"files": {
|
||||
"all_files": "모든 파일",
|
||||
"show_hidden": "숨김 파일 표시",
|
||||
"file_type": "파일 형식"
|
||||
},
|
||||
"file": {
|
||||
"select": "이 파일 선택"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_other": "플러그인 {{count}}개 숨김"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "빠른 액세스 메뉴에서 숨김"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_install": "설치",
|
||||
"plugin_no_desc": "플러그인 설명이 제공되지 않았습니다.",
|
||||
"plugin_version_label": "플러그인 버전",
|
||||
"plugin_full_access": "이 플러그인은 Steam Deck의 모든 접근 권한을 가집니다."
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "설치",
|
||||
"button_processing": "설치 중",
|
||||
"desc": "{{artifact}} {{version}}을(를) 설치하겠습니까?",
|
||||
"title": "{{artifact}} 설치"
|
||||
},
|
||||
"reinstall": {
|
||||
"button_idle": "재설치",
|
||||
"button_processing": "재설치 중",
|
||||
"desc": "{{artifact}} {{version}}을(를) 재설치하겠습니까?",
|
||||
"title": "{{artifact}} 재설치"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "업데이트",
|
||||
"button_processing": "업데이트 중",
|
||||
"title": "{{artifact}} 업데이트",
|
||||
"desc": "{{artifact}} {{version}} 업데이트를 설치하겠습니까?"
|
||||
},
|
||||
"no_hash": "이 플러그인은 해시 확인을 하지 않습니다, 설치에 따른 위험은 사용자가 감수해야 합니다."
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_other": "플러그인 {{count}}개 수정",
|
||||
"update_other": "플러그인 {{count}}개 업데이트",
|
||||
"reinstall_other": "플러그인 {{count}}개 재설치",
|
||||
"install_other": "플러그인 {{count}}개 설치"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "확인",
|
||||
"loading": "작업 중"
|
||||
},
|
||||
"confirm": "해당 수정을 적용하겠습니까?",
|
||||
"description": {
|
||||
"install": "{{name}} {{version}} 플러그인 설치",
|
||||
"update": "{{name}}의 {{version}} 업데이트 설치",
|
||||
"reinstall": "{{name}} {{version}} 재설치"
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"plugin_actions": "플러그인 동작",
|
||||
"reinstall": "재설치",
|
||||
"reload": "다시 로드",
|
||||
"uninstall": "설치 제거",
|
||||
"show": "빠른 액세스 메뉴: 표시",
|
||||
"hide": "빠른 액세스 메뉴: 숨김",
|
||||
"update_all_other": "플러그인 {{count}}개 업데이트",
|
||||
"no_plugin": "설치된 플러그인이 없습니다!",
|
||||
"update_to": "{{name}}(으)로 업데이트"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "{{tag_name}} 업데이트를 설치할 수 있습니다!",
|
||||
"error": "오류",
|
||||
"plugin_load_error": {
|
||||
"message": "{{name}} 플러그인 불러오기 오류",
|
||||
"toast": "{{name}} 불러오기 오류"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "설치 제거",
|
||||
"desc": "{{name}}을(를) 설치 제거하겠습니까?",
|
||||
"title": "{{name}} 설치 제거"
|
||||
},
|
||||
"plugin_update_other": "플러그인 {{count}}개를 업데이트 할 수 있습니다!",
|
||||
"plugin_error_uninstall": "{{name}} 플러그인을 불러올 때 위와 같은 예외가 발생했습니다. 이는 보통 SteamUI 최신 버전에 맞는 플러그인 업데이트가 필요할 때 발생합니다. Decky 설정의 플러그인 섹션에서 업데이트가 있는지 확인하거나 설치 제거를 시도 해 보세요."
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"label": "리모트 CEF 디버그 허용",
|
||||
"desc": "네트워크의 모든 사용자에게 CEF 디버거에 대한 인증되지 않은 액세스 허용"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "콘솔 열기",
|
||||
"label": "CEF 콘솔",
|
||||
"desc": "CEF 콘솔을 엽니다. 디버그 전용입니다. 이 항목들은 위험 가능성이 있으므로 플러그인 개발자이거나 개발자의 가이드를 따를 경우에만 사용해야 합니다."
|
||||
},
|
||||
"header": "기타",
|
||||
"react_devtools": {
|
||||
"ip_label": "IP",
|
||||
"label": "React DevTools 활성화",
|
||||
"desc": "React DevTools를 실행하고 있는 컴퓨터에 연결을 활성화합니다. 이 설정을 변경하면 Steam이 다시 로드됩니다. 활성화하기 전에 IP 주소를 설정하세요."
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "설치",
|
||||
"button_zip": "검색",
|
||||
"header": "서드파티 플러그인",
|
||||
"label_desc": "URL",
|
||||
"label_url": "URL에서 플러그인 설치",
|
||||
"label_zip": "ZIP 파일에서 플러그인 설치"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Valve 내부 개발자 메뉴를 활성화합니다.",
|
||||
"label": "Valve 내부 개발자 메뉴 활성화",
|
||||
"desc2": "이 메뉴의 기능을 모른다면 어떤 것도 건드리지 마세요."
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Decky 버전",
|
||||
"header": "정보"
|
||||
},
|
||||
"beta": {
|
||||
"header": "베타 참가"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "개발자 모드"
|
||||
},
|
||||
"other": {
|
||||
"header": "기타"
|
||||
},
|
||||
"updates": {
|
||||
"header": "업데이트"
|
||||
},
|
||||
"notifications": {
|
||||
"header": "알림",
|
||||
"plugin_updates_label": "플러그인 업데이트 가능",
|
||||
"decky_updates_label": "Decky 업데이트 가능"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "개발자",
|
||||
"general_title": "일반",
|
||||
"plugins_title": "플러그인"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"desc": "Decky 플러그인 스토어에 기여하고 싶다면 SteamDeckHomebrew/decky-plugin-template Github 저장소를 확인하세요. 개발 및 배포에 대한 정보는 README에서 확인할 수 있습니다.",
|
||||
"label": "기여하기"
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "필터",
|
||||
"label_def": "모두"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "검색"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "정렬",
|
||||
"label_def": "최근 업데이트 순"
|
||||
},
|
||||
"store_source": {
|
||||
"desc": "모든 플러그인 소스 코드는 SteamDeckHomebrew/decky-plugin-database Github 저장소에서 확인할 수 있습니다.",
|
||||
"label": "소스 코드"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "정보",
|
||||
"alph_asce": "알파벳순 (Z-A)",
|
||||
"alph_desc": "알파벳순 (A-Z)",
|
||||
"title": "검색"
|
||||
},
|
||||
"store_testing_cta": "새로운 플러그인을 테스트하여 Decky Loader 팀을 도와주세요!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "사용자 지정 스토어",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "사용자 지정",
|
||||
"label": "스토어 배포 채널",
|
||||
"default": "기본",
|
||||
"testing": "시험"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Decky 업데이트",
|
||||
"no_patch_notes_desc": "이 버전에는 패치 노트가 없습니다",
|
||||
"patch_notes_desc": "패치 노트",
|
||||
"updates": {
|
||||
"check_button": "업데이트 확인",
|
||||
"checking": "확인 중",
|
||||
"cur_version": "현재 버전: {{ver}}",
|
||||
"install_button": "업데이트 설치",
|
||||
"label": "업데이트",
|
||||
"lat_version": "최신 상태: {{ver}} 실행 중",
|
||||
"reloading": "다시 로드 중",
|
||||
"updating": "업데이트 중"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"file_not_found": "지정된 경로가 잘못되었습니다. 확인 후에 다시 입력해 주세요.",
|
||||
"unknown": "알 수 없는 오류가 발생했습니다. Raw 오류: {{raw_error}}",
|
||||
"perm_denied": "선택한 경로에 접근 할 수 없습니다. 선택한 폴더/파일 접근 권한이 유저(Steam Deck의 deck 유저)에 맞게 올바르게 설정 되었는지 확인하세요."
|
||||
}
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "뒤로"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"prerelease": "Vooruitgave",
|
||||
"stable": "Stabiel",
|
||||
"label": "Update Kanaal",
|
||||
"testing": "Test"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Herlaad in 5 seconden",
|
||||
"disabling": "Uitschakelen React DevTools",
|
||||
"enabling": "Inschakelen React DevTools"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Terug"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"unknown": "Een onbekende fout is opgetreden. De ruwe fout is: {{raw_error}}",
|
||||
"file_not_found": "Het opgegeven pad is niet geldig. Controleer het en voer het opnieuw correct in."
|
||||
}
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"files": {
|
||||
"all_files": "Alle bestanden",
|
||||
"file_type": "Bestandstype",
|
||||
"show_hidden": "Toon verborgen bestanden"
|
||||
},
|
||||
"filter": {
|
||||
"created_desc": "Gecreëerd ( Nieuwste)",
|
||||
"modified_asce": "Veranderd (Oudste)",
|
||||
"modified_desc": "Veranderd (Nieuwste)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"size_asce": "Grootte (Kleinste)",
|
||||
"size_desc": "Grootte (Grootste)",
|
||||
"created_asce": "Gecreëerd (Oudste)"
|
||||
},
|
||||
"folder": {
|
||||
"label": "Map",
|
||||
"select": "Gebruik deze map",
|
||||
"show_more": "Toon meer bestanden"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plug-in is verborgen in deze lijst",
|
||||
"hidden_other": "{{count}} plug-ins zijn verborgen in deze lijst"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Verborgen in het snelmenu"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_install": "Installeren",
|
||||
"plugin_no_desc": "Geen beschrijving gegeven.",
|
||||
"plugin_version_label": "Plugin Versie",
|
||||
"plugin_full_access": "Deze plug-in heeft volledige toegang tot je Steam Deck."
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Installeren",
|
||||
"button_processing": "Bezig met installeren",
|
||||
"title": "Installeer {{artifact}}",
|
||||
"desc": "Weet je zeker dat je {{artifact}} {{version}} wilt installeren?"
|
||||
},
|
||||
"no_hash": "Deze plug-in heeft geen hash, u installeert deze op eigen risico.",
|
||||
"reinstall": {
|
||||
"button_idle": "Herinstalleren",
|
||||
"button_processing": "Bezig te herinstalleren",
|
||||
"desc": "Weet je zeker dat je {{artifact}} {{version}} opnieuw wilt installeren?",
|
||||
"title": "Installeer {{artifact}} opnieuw"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Update",
|
||||
"button_processing": "Bezig met updaten",
|
||||
"title": "{{artifact}} bijwerken",
|
||||
"desc": "Weet je zeker dat je {{artifact}} {{version}} wilt updaten?"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Wijzig {{count}} plug-in",
|
||||
"mixed_other": "Pas {{count}} plug-ins aan",
|
||||
"update_one": "1 plugin bijwerken",
|
||||
"update_other": "{{count}} plug-ins bijwerken",
|
||||
"install_one": "Installeer 1 plugin",
|
||||
"install_other": "Installeer {{count}} plugins",
|
||||
"reinstall_one": "1 plugin opnieuw installeren",
|
||||
"reinstall_other": "{{count}} plugins opnieuw installeren"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Bevestigen",
|
||||
"loading": "Werkend"
|
||||
},
|
||||
"confirm": "Weet u zeker dat u de volgende wijzigingen wilt aanbrengen?",
|
||||
"description": {
|
||||
"install": "Installeer {{name}} {{version}}",
|
||||
"update": "Update {{name}} naar {{version}}",
|
||||
"reinstall": "Installeer opnieuw {{name}} {{version}}"
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Geen plugins geïnstalleerd!",
|
||||
"plugin_actions": "Plugin Acties",
|
||||
"reload": "Herladen",
|
||||
"uninstall": "Verwijderen",
|
||||
"update_to": "Update naar {{name}}",
|
||||
"hide": "Snelle toegang: Verberg",
|
||||
"update_all_one": "Update 1 plugin",
|
||||
"update_all_other": "Update {{count}} plugins",
|
||||
"reinstall": "Opnieuw installeren",
|
||||
"show": "Snelle toegang: Toon"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"error": "Fout",
|
||||
"plugin_load_error": {
|
||||
"message": "Fout bij het laden van plugin {{name}}",
|
||||
"toast": "Fout bij het laden van {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Verwijderen",
|
||||
"desc": "Weet je zeker dat je {{name}} wilt verwijderen?",
|
||||
"title": "Verwijder {{name}}"
|
||||
},
|
||||
"plugin_update_one": "Updates beschikbaar voor 1 plugin!",
|
||||
"plugin_update_other": "Updates beschikbaar voor {{count}} plugins!",
|
||||
"decky_update_available": "Update naar {{tag_name}} beschikbaar!",
|
||||
"plugin_error_uninstall": "Het laden van {{name}} veroorzaakte een uitzondering zoals hierboven weergegeven. Dit betekent meestal dat de plug-in een update vereist voor de nieuwe versie van SteamUI. Controleer of er een update aanwezig is of evalueer de verwijdering ervan in de Decky-instellingen, in het gedeelte Plug-ins."
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Sta ongeauthenticeerde toegang tot de CEF-foutopsporing toe aan iedereen in uw netwerk",
|
||||
"label": "Externe CEF-foutopsporing toestaan"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Console openen",
|
||||
"label": "CEF Bedieningsscherm",
|
||||
"desc": "Opent de CEF-console. Alleen nuttig voor foutopsporingsdoeleinden. Dingen hier zijn potentieel gevaarlijk en mogen alleen worden gebruikt als u een ontwikkelaar van plug-ins bent, of hier door een ontwikkelaar naartoe wordt geleid."
|
||||
},
|
||||
"header": "Andere",
|
||||
"react_devtools": {
|
||||
"ip_label": "IP",
|
||||
"label": "Aanzetten React DevTools",
|
||||
"desc": "Maakt verbinding met een computer met React DevTools mogelijk. Als je deze instelling wijzigt, wordt Steam opnieuw geladen. Stel het IP-adres in voordat u het inschakelt."
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"header": "Plug-ins van derden",
|
||||
"label_desc": "URL",
|
||||
"label_url": "Installeer Plugin van URL",
|
||||
"label_zip": "Installeer Plugin van Zip bestand",
|
||||
"button_install": "Installeren",
|
||||
"button_zip": "Bladeren"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Installatie mislukt! Alleen ZIP-bestanden worden ondersteund."
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Schakelt het interne ontwikkelaarsmenu van Valve in.",
|
||||
"desc2": "Raak niets in dit menu aan tenzij u weet wat het doet.",
|
||||
"label": "Valve Internal inschakelen"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Decky versie",
|
||||
"header": "Over"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Beta deelname"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Ontwikkelaars modus"
|
||||
},
|
||||
"other": {
|
||||
"header": "Overige"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Nieuwe Versies"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Ontwikkelaar",
|
||||
"general_title": "Algemeen",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
"store_filter": {
|
||||
"label": "Filter",
|
||||
"label_def": "Alles"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Zoek"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Sorteren",
|
||||
"label_def": "Laatste Geupdate (Nieuwste)"
|
||||
},
|
||||
"store_source": {
|
||||
"label": "Bron Code",
|
||||
"desc": "Alle broncode van de plug-in is beschikbaar in de SteamDeckHomebrew/decky-plugin-database-repository op GitHub."
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Over",
|
||||
"alph_asce": "Alfabetisch (Z naar A)",
|
||||
"alph_desc": "Alfabetisch (A naar Z)",
|
||||
"title": "Bladeren"
|
||||
},
|
||||
"store_testing_cta": "Overweeg alsjeblieft om nieuwe plug-ins te testen om het Decky Loader-team te helpen!",
|
||||
"store_contrib": {
|
||||
"desc": "Als je wilt bijdragen aan de Decky Plugin winkel, kijk dan in de SteamDeckHomebrew/decky-plugin-template repository op GitHub. Informatie over ontwikkeling en distributie is beschikbaar in de README.",
|
||||
"label": "Bijdragende"
|
||||
}
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Aangepassingen winkel",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Aanpassingen",
|
||||
"default": "Standaard",
|
||||
"label": "Winkel Kanaal",
|
||||
"testing": "Testen"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"patch_notes_desc": "Correctie opmerkingen",
|
||||
"updates": {
|
||||
"check_button": "Controleer op updates",
|
||||
"checking": "Controleren",
|
||||
"cur_version": "Huidige versie: {{ver}}",
|
||||
"install_button": "Installeer Update",
|
||||
"label": "Update",
|
||||
"lat_version": "Up-to-date: loopt {{ver}}",
|
||||
"reloading": "Herstarten",
|
||||
"updating": "Aan het updaten"
|
||||
},
|
||||
"decky_updates": "Decky Nieuwe Versies",
|
||||
"no_patch_notes_desc": "geen correctie-opmerkingen voor deze versie"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"prerelease": "Pré-lançamento",
|
||||
"stable": "Estável",
|
||||
"testing": "Em Teste",
|
||||
"label": "Canal de Atualização"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Recarregando em 5 segundos",
|
||||
"enabling": "Habilitando React DevTools",
|
||||
"disabling": "Desabilitando React DevTools"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "Use esta pasta",
|
||||
"label": "Pasta",
|
||||
"show_more": "Mostrar mais arquivos"
|
||||
},
|
||||
"files": {
|
||||
"show_hidden": "Mostrar Arquivos Ocultos",
|
||||
"all_files": "Todos os arquivos",
|
||||
"file_type": "Formato de arquivo"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "Criado (Mais antigo)",
|
||||
"created_desc": "Criado (Mais recente)",
|
||||
"modified_asce": "Alterado (Mais antigo)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"size_asce": "Tamanho (Menor)",
|
||||
"size_desc": "Tamanho (Maior)",
|
||||
"modified_desc": "Alterado (Mais recente)"
|
||||
},
|
||||
"file": {
|
||||
"select": "Selecione este arquivo"
|
||||
}
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Oculto no menu de acesso rápido"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "Este plugin tem acesso total ao seu Steam Deck.",
|
||||
"plugin_install": "Instalar",
|
||||
"plugin_no_desc": "Nenhuma descrição fornecida.",
|
||||
"plugin_version_label": "Versão do plugin"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Instalar",
|
||||
"button_processing": "Instalando",
|
||||
"desc": "Você tem certeza que deseja instalar {{artifact}} {{version}}?",
|
||||
"title": "Instalar {{artifact}}"
|
||||
},
|
||||
"reinstall": {
|
||||
"button_idle": "Reinstalar",
|
||||
"button_processing": "Reinstalando",
|
||||
"desc": "Tem certeza que voce deseja reinstalar {{artifact}} {{version}}?",
|
||||
"title": "Reinstalar {{artifact}}"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Atualizar",
|
||||
"button_processing": "Atualizando",
|
||||
"desc": "Tem certeza que voce deseja atualizar {{artifact}} {{version}}?",
|
||||
"title": "Atualizar {{artifact}}"
|
||||
},
|
||||
"no_hash": "Este plugin não tem um hash, você o está instalando por sua conta em risco."
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Modificar {{count}} plugin",
|
||||
"mixed_many": "Modificar {{count}} plugins",
|
||||
"mixed_other": "Modificar {{count}} plugins",
|
||||
"update_one": "Atualizar 1 plugin",
|
||||
"update_many": "Atualizar {{count}} plugins",
|
||||
"update_other": "Atualizar {{count}} plugins",
|
||||
"install_one": "Instalar 1 plugin",
|
||||
"install_many": "Instalar {{count}} plugins",
|
||||
"install_other": "Instalar {{count}} plugins",
|
||||
"reinstall_one": "Reinstalar 1 plugin",
|
||||
"reinstall_many": "Reinstalar {{count}} plugins",
|
||||
"reinstall_other": "Reinstalar {{count}} plugins"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Confirmar",
|
||||
"loading": "Carregando"
|
||||
},
|
||||
"description": {
|
||||
"install": "Instalar {{name}} {{version}}",
|
||||
"update": "Atualizar {{name}} para {{version}}",
|
||||
"reinstall": "Reinstalar {{name}} {{version}}"
|
||||
},
|
||||
"confirm": "Tem certeza que deseja fazer as seguintes modificações?"
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Nenhum plugin instalado!",
|
||||
"plugin_actions": "Ações do plugin",
|
||||
"reinstall": "Reinstalar",
|
||||
"reload": "Recarregar",
|
||||
"uninstall": "Desinstalar",
|
||||
"update_to": "Atualizar para {{name}}",
|
||||
"show": "Acesso Rápido: Mostrar",
|
||||
"update_all_one": "Atualizar 1 plugin",
|
||||
"update_all_many": "Atualizar {{count}} plugins",
|
||||
"update_all_other": "Atualizar {{count}} plugins",
|
||||
"hide": "Acesso Rápido: Ocultar"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"error": "Erro",
|
||||
"plugin_load_error": {
|
||||
"message": "Erro ao carregar o plugin {{name}}",
|
||||
"toast": "Erro ao carregar {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Desinstalar",
|
||||
"desc": "Você tem certeza que deseja desinstalar {{name}}?",
|
||||
"title": "Desinstalar {{name}}"
|
||||
},
|
||||
"decky_update_available": "Atualização para {{tag_name}} disponível!",
|
||||
"plugin_error_uninstall": "Um erro aconteceu ao carregar {{name}}, como mostrado acima. Isso normalmente significa que o plugin precisa de uma atualização para a nova versão do SteamUI. Confira se existe uma atualização ou avalie a remoção do plugin nas configurações do Decky, na sessão de plugins.",
|
||||
"plugin_update_one": "Atualizações disponível para 1 plugin!",
|
||||
"plugin_update_many": "Atualizações disponíveis para {{count}} plugins!",
|
||||
"plugin_update_other": "Atualizações disponíveis para {{count}} plugins!"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"label": "Permitir Depuração CEF Demota",
|
||||
"desc": "Permitir acesso não autenticato ao depurador CEF para qualquer um na sua rede"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Abrir o Console",
|
||||
"label": "Console CEF",
|
||||
"desc": "Abre o Console CEF. Somente útil para fins de depuração. O material aqui é potencialmente perigoso e só deve ser usado se você for um desenvolvedor de plugin, ou direcionado até aqui por um."
|
||||
},
|
||||
"header": "Outros",
|
||||
"react_devtools": {
|
||||
"desc": "Habilita a conexão a um computador executando React DevTools. Alterar essa configuração irá recarregar a Steam. Defina o endereço IP antes de habilitar.",
|
||||
"ip_label": "IP",
|
||||
"label": "Habilitar React DevTools"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Instalar",
|
||||
"button_zip": "Navegar",
|
||||
"header": "Plugins de terceiros",
|
||||
"label_url": "Instalar Plugin a partir da URL",
|
||||
"label_zip": "Instalar Plugin a partir de um arquivo ZIP",
|
||||
"label_desc": "URL"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Falha na instalação! Somente arquivos ZIP são suportados."
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Habilita o menu interno de desenvolvedor da Valve.",
|
||||
"desc2": "Não toque em nada neste menu, a não ser que você saiba o que está fazendo.",
|
||||
"label": "Habilitar Menu Interno da Valve"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Versão do Decky",
|
||||
"header": "Sobre"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Modo Deselvolvedor"
|
||||
},
|
||||
"other": {
|
||||
"header": "Outros"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Atualizações"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Participação no Beta"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Desenvolvedor",
|
||||
"general_title": "Geral",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "Contribuindo",
|
||||
"desc": "Se você deseja contribuir para a Loja de Plugins para o Decky, confira o repositório SteamDeckHomebrew/decky-plugin-template no GitHub. Informações sobre o desenvolvimento e distribuição estão disponíveis no README."
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Filtros",
|
||||
"label_def": "Todos"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Buscar"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Ordenar",
|
||||
"label_def": "Último atualizado (Mais recente)"
|
||||
},
|
||||
"store_source": {
|
||||
"desc": "Todos os códigos fonte dos plugins estão disponíveis no repositório SteamDeckHomebrew/decky-plugin-database no GitHub.",
|
||||
"label": "Código Fonte"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Sobre",
|
||||
"alph_desc": "Alfabética (A - Z)",
|
||||
"title": "Navegar",
|
||||
"alph_asce": "Alfabética (Z - A)"
|
||||
},
|
||||
"store_testing_cta": "Por favor, considere testar os novos plugins para ajudar o time do Decky Loader!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Loja Personalizada",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Personalizada",
|
||||
"default": "Padrão",
|
||||
"label": "Canal da Loja",
|
||||
"testing": "Em Teste"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"no_patch_notes_desc": "nenhuma nota de alteração para esta versão",
|
||||
"patch_notes_desc": "Notas de alteração",
|
||||
"updates": {
|
||||
"check_button": "Buscar Atualizações",
|
||||
"checking": "Buscando",
|
||||
"cur_version": "Versão atual: {{ver}}",
|
||||
"install_button": "Instalar Atualização",
|
||||
"label": "Atualizações",
|
||||
"lat_version": "Atualizado: rodando {{ver}}",
|
||||
"reloading": "Recarregando",
|
||||
"updating": "Atualizando"
|
||||
},
|
||||
"decky_updates": "Atualizações do Decky"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plugin está oculto nesta lista",
|
||||
"hidden_many": "{{count}} plugins estão ocultos nesta lista",
|
||||
"hidden_other": "{{count}} plugins estão ocultos nesta lista"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Voltar"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"file_not_found": "O caminho especificado não é válido. Por favor, confira e reinsira corretamente.",
|
||||
"unknown": "Ocorreu um erro desconhecido. O erro completo é: {{raw_error}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "Usar esta pasta"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "1 plugin está oculto desta lista",
|
||||
"hidden_many": "{{count}} plugins estão ocultos desta lista",
|
||||
"hidden_other": "{{count}} plugins estão ocultos desta lista"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "Este plugin tem acesso total à tua Steam Deck.",
|
||||
"plugin_install": "Instalar",
|
||||
"plugin_version_label": "Versão do plugin",
|
||||
"plugin_no_desc": "Não tem descrição."
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Instalar",
|
||||
"button_processing": "Instalação em curso",
|
||||
"title": "Instalar {{artifact}}",
|
||||
"desc": "De certeza que queres instalar {{artifact}} {{version}}?"
|
||||
},
|
||||
"reinstall": {
|
||||
"button_idle": "Reinstalar",
|
||||
"button_processing": "Reinstalação em curso",
|
||||
"title": "Reinstalar {{artifact}}",
|
||||
"desc": "De certeza que queres reinstalar {{artifact}} {{version}}?"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Actualizar",
|
||||
"button_processing": "Actualização em curso",
|
||||
"title": "Actualizar {{artifact}}",
|
||||
"desc": "De certeza que queres actualizar {{artifact}} {{version}}?"
|
||||
},
|
||||
"no_hash": "Este plugin não tem um hash, estás a instalá-lo por tua conta e risco."
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Alterar 1 plugin",
|
||||
"mixed_many": "Alterar {{count}} plugins",
|
||||
"mixed_other": "Alterar {{count}} plugins",
|
||||
"update_one": "Actualizar 1 plugin",
|
||||
"update_many": "Actualizar {{count}} plugins",
|
||||
"update_other": "Actualizar {{count}} plugins",
|
||||
"reinstall_one": "Reinstalar 1 plugin",
|
||||
"reinstall_many": "Reinstalar {{count}} plugins",
|
||||
"reinstall_other": "Reinstalar {{count}} plugins",
|
||||
"install_one": "Instalar 1 plugin",
|
||||
"install_many": "Instalar {{count}} plugins",
|
||||
"install_other": "Instalar {{count}} plugins"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Confirmar",
|
||||
"loading": "Em curso"
|
||||
},
|
||||
"description": {
|
||||
"install": "Instalar {{name}} {{version}}",
|
||||
"update": "Actualizar {{name}} para {{version}}",
|
||||
"reinstall": "Reinstalar {{name}} {{version}}"
|
||||
},
|
||||
"confirm": "De certeza que queres fazer as seguintes alterações?"
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Nenhum plugin instalado!",
|
||||
"reinstall": "Reinstalar",
|
||||
"uninstall": "Desinstalar",
|
||||
"update_to": "Actualizar para {{name}}",
|
||||
"update_all_one": "Actualizar 1 plugin",
|
||||
"update_all_many": "Actualizar {{count}} plugins",
|
||||
"update_all_other": "Actualizar {{count}} plugins",
|
||||
"plugin_actions": "Operações de plugin",
|
||||
"reload": "Recarregar",
|
||||
"show": "Acesso rápido: Mostrar",
|
||||
"hide": "Acesso rápido: Ocultar"
|
||||
},
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"stable": "Estável",
|
||||
"testing": "Em teste",
|
||||
"label": "Canal de actualização",
|
||||
"prerelease": "Pré-lançamento"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Vai recarregar em 5 segundos",
|
||||
"disabling": "Desactivando React DevTools",
|
||||
"enabling": "Activando React DevTools"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Oculto do menu de acesso rápido"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"error": "Erro",
|
||||
"plugin_load_error": {
|
||||
"message": "Erro ao carregar o plugin {{name}}",
|
||||
"toast": "Erro ao carregar {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Desinstalar",
|
||||
"title": "Desinstalar {{name}}",
|
||||
"desc": "De certeza que queres desinstalar {{name}}?"
|
||||
},
|
||||
"decky_update_available": "Está disponível uma nova versão de {{tag_name}} !",
|
||||
"plugin_update_one": "1 plugin tem actualizações disponíveis!",
|
||||
"plugin_update_many": "{{count}} plugins têm actualizações disponíveis!",
|
||||
"plugin_update_other": "{{count}} plugins têm actualizações disponíveis!",
|
||||
"plugin_error_uninstall": "Houve uma excepção ao carregar {{name}}, como mostrado em cima. Pode ter sido porque o plugin requere a última versão do SteamUI. Verifica se há uma actualização disponível ou desinstala o plugin nas definições do Decky."
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Abrir consola",
|
||||
"label": "Consola CEF",
|
||||
"desc": "Abre a consola do CEF. Só é útil para efeitos de debugging. Pode ser perigosa e só deve ser usada se és um desenvolvedor de plugins, ou se foste aqui indicado por um desenvolvedor."
|
||||
},
|
||||
"header": "Outros",
|
||||
"react_devtools": {
|
||||
"desc": "Permite a conecção a um computador que está a correr React DevTools. Mudar esta definição vai recarregar o Steam. Define o endereço de IP antes de activar.",
|
||||
"ip_label": "IP",
|
||||
"label": "Activar React DevTools"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Instalar",
|
||||
"button_zip": "Navegar",
|
||||
"header": "Plugins de terceiros",
|
||||
"label_desc": "URl",
|
||||
"label_url": "Instalar plugin a partir dum URL",
|
||||
"label_zip": "Instalar plugin a partir dum ficheiro ZIP"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "A instalação falhou! Só ficheiros ZIP são suportados."
|
||||
},
|
||||
"valve_internal": {
|
||||
"label": "Activar menu interno da Valve",
|
||||
"desc1": "Activa o menu interno de programador da Valve.",
|
||||
"desc2": "Não toques em nada deste menu se não souberes a sua função."
|
||||
}
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Permitir acesso não autenticado ao debugger do CEF a qualquer pessoa na tua rede",
|
||||
"label": "Permitir debugging remoto do CEF"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Versão do Decky",
|
||||
"header": "Sobre"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Participação na versão Beta"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Modo de programador"
|
||||
},
|
||||
"other": {
|
||||
"header": "Outros"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Actualizações"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Programador",
|
||||
"general_title": "Geral",
|
||||
"plugins_title": "Plugins"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "Contribuir",
|
||||
"desc": "Se queres contribuir com um novo plugin, vai ao repositório SteamDeckHomebrew/decky-plugin-template no GitHub. No README, podes encontrar mais informação sobre desenvolvimento e distribuição."
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Filtro",
|
||||
"label_def": "Todos"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Procurar"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Ordenar",
|
||||
"label_def": "Última actualização (mais recente)"
|
||||
},
|
||||
"store_source": {
|
||||
"label": "Código fonte",
|
||||
"desc": "O código fonte de cada plugin está disponível no repositório SteamDeckHomebrew/decky-plugin-database no GitHub."
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Sobre",
|
||||
"alph_asce": "Alfabeticamente (Z-A)",
|
||||
"alph_desc": "Alfabeticamente (A-Z)",
|
||||
"title": "Navegar"
|
||||
},
|
||||
"store_testing_cta": "Testa novos plugins e ajuda a equipa do Decky Loader!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"url_label": "URL",
|
||||
"label": "Loja personalizada"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Personalizada",
|
||||
"default": "Standard",
|
||||
"testing": "Em teste",
|
||||
"label": "Canal de loja"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Actualizações do Decky",
|
||||
"no_patch_notes_desc": "sem registo de alterações desta versão",
|
||||
"patch_notes_desc": "Registo de alterações",
|
||||
"updates": {
|
||||
"check_button": "Procurar actualizações",
|
||||
"checking": "Busca de actualizações em curso",
|
||||
"cur_version": "Versão actual: {{ver}}",
|
||||
"label": "Actualizações",
|
||||
"lat_version": "Actualizado: a correr {{ver}}",
|
||||
"updating": "Actualização em curso",
|
||||
"reloading": "Recarregar",
|
||||
"install_button": "Instalar actualização"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,259 @@
|
||||
{
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"update_one": "Переустановить {{count}} плагин",
|
||||
"update_few": "Переустановить {{count}} плагинов",
|
||||
"update_many": "Переустановить {{count}} плагинов",
|
||||
"reinstall_one": "Переустановить {{count}} плагин",
|
||||
"reinstall_few": "Переустановить {{count}} плагинов",
|
||||
"reinstall_many": "Переустановить {{count}} плагинов",
|
||||
"install_one": "Установить {{count}} плагин",
|
||||
"install_few": "Установить {{count}} плагинов",
|
||||
"install_many": "Установить {{count}} плагинов",
|
||||
"mixed_one": "Изменить {{count}} плагин",
|
||||
"mixed_few": "Изменить {{count}} плагинов",
|
||||
"mixed_many": "Изменить {{count}} плагинов"
|
||||
},
|
||||
"description": {
|
||||
"install": "Установить {{name}} {{version}}",
|
||||
"reinstall": "Переустановить {{name}} {{version}}",
|
||||
"update": "Обновить с {{name}} на {{version}}"
|
||||
},
|
||||
"confirm": "Вы уверены, что хотите внести следующие изменения?",
|
||||
"ok_button": {
|
||||
"idle": "Подтвердить",
|
||||
"loading": "В процессе"
|
||||
}
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"update_all_one": "Обновить {{count}} плагин",
|
||||
"update_all_few": "Обновить {{count}} плагинов",
|
||||
"update_all_many": "Обновить {{count}} плагинов",
|
||||
"hide": "Быстрый доступ: Скрыть",
|
||||
"reload": "Перезагрузить",
|
||||
"uninstall": "Удалить",
|
||||
"update_to": "Обновить на {{name}}",
|
||||
"show": "Быстрый доступ: Показать",
|
||||
"plugin_actions": "Действия с плагинами",
|
||||
"no_plugin": "Не установлено ни одного плагина!",
|
||||
"reinstall": "Переустановить"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"plugin_update_one": "Обновления доступны для {{count}} плагина!",
|
||||
"plugin_update_few": "Обновления доступны для {{count}} плагинов!",
|
||||
"plugin_update_many": "Обновления доступны для {{count}} плагинов!",
|
||||
"plugin_error_uninstall": "Загрузка {{name}} вызвала исключение, указанное выше. Обычно это означает, что плагин требует обновления для новой версии SteamUI. Проверьте наличие обновления или попробуйте его удалить в настройках Decky, в разделе Плагины.",
|
||||
"plugin_load_error": {
|
||||
"message": "Ошибка загрузки плагина {{name}}",
|
||||
"toast": "Ошибка загрузки {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"button": "Удалить",
|
||||
"desc": "Вы уверенны, что хотите удалить {{name}}?",
|
||||
"title": "Удалить {{name}}"
|
||||
},
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "Доступно обновление на {{tag_name}}!",
|
||||
"error": "Ошибка"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "{{count}} плагин скрыт из списка",
|
||||
"hidden_few": "{{count}} плагинов скрыт из списка",
|
||||
"hidden_many": "{{count}} плагинов скрыт из списка"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"files": {
|
||||
"show_hidden": "Показать скрытые файлы",
|
||||
"all_files": "Все файлы",
|
||||
"file_type": "Тип файла"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "Создан (самый старый)",
|
||||
"modified_asce": "Модифицирован (самый новый)",
|
||||
"modified_desc": "Модифицирован (самый старый)",
|
||||
"size_asce": "Размер (самый малый)",
|
||||
"size_desc": "Размер (самый большой)",
|
||||
"name_asce": "Z-A",
|
||||
"name_desc": "A-Z",
|
||||
"created_desc": "Создан (самый новый)"
|
||||
},
|
||||
"folder": {
|
||||
"label": "Папка",
|
||||
"show_more": "Показать больше файлов",
|
||||
"select": "Использовать этот каталог"
|
||||
},
|
||||
"file": {
|
||||
"select": "Выберите этот файл"
|
||||
}
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_install": "Установить",
|
||||
"plugin_no_desc": "Нет описания.",
|
||||
"plugin_version_label": "Версия плагина",
|
||||
"plugin_full_access": "Этот плагин имеет полный доступ к вашему Steam Deck."
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_processing": "Установка",
|
||||
"title": "Установить {{artifact}}",
|
||||
"button_idle": "Установить",
|
||||
"desc": "Вы уверенны, что хотите установить {{artifact}} {{version}}?"
|
||||
},
|
||||
"no_hash": "У данного плагина отсутствует хэш, устанавливайте на свой страх и риск.",
|
||||
"reinstall": {
|
||||
"title": "Переустановить {{artifact}}",
|
||||
"desc": "Вы уверенны, что хотите переустановить {{artifact}} {{version}}?",
|
||||
"button_idle": "Переустановить",
|
||||
"button_processing": "Переустановка"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Обновить",
|
||||
"button_processing": "Обновление",
|
||||
"desc": "Вы уверенны, что хотите обновить {{artifact}} {{version}}?",
|
||||
"title": "Обновить {{artifact}}"
|
||||
}
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Скрыто из меню быстрого доступа"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Разрешить неаутентифицированный доступ к отладчику CEF всем в вашей сети",
|
||||
"label": "Разрешить удаленную отладку CEF"
|
||||
}
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"header": "Другое",
|
||||
"third_party_plugins": {
|
||||
"button_install": "Установить",
|
||||
"label_zip": "Установить плагин из ZIP файла",
|
||||
"label_url": "Установить плагин из URL",
|
||||
"button_zip": "Обзор",
|
||||
"header": "Сторонние плагины",
|
||||
"label_desc": "Ссылка"
|
||||
},
|
||||
"react_devtools": {
|
||||
"ip_label": "IP",
|
||||
"desc": "Позволяет подключиться к компьютеру, на котором работает React DevTools. Изменение этого параметра приведет к перезагрузке Steam. Установите IP-адрес перед включением.",
|
||||
"label": "Включить React DevTools"
|
||||
},
|
||||
"cef_console": {
|
||||
"button": "Открыть консоль",
|
||||
"desc": "Открывает консоль CEF. Полезно только для целей отладки. Настройки здесь потенциально опасны и должны использоваться только в том случае, если вы являетесь разработчиком плагинов или направленны сюда одним из них.",
|
||||
"label": "CEF Консоль"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Включает внутреннее меню разработчика Valve.",
|
||||
"label": "Включить Valve Internal",
|
||||
"desc2": "Ничего не трогайте в этом меню, если не знаете, что оно делает."
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"beta": {
|
||||
"header": "Бета программа"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Режим разработчика"
|
||||
},
|
||||
"other": {
|
||||
"header": "Другое"
|
||||
},
|
||||
"about": {
|
||||
"decky_version": "Версия Decky",
|
||||
"header": "Информация"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Обновления"
|
||||
},
|
||||
"notifications": {
|
||||
"decky_updates_label": "Обновление Decky доступно",
|
||||
"header": "Уведомления",
|
||||
"plugin_updates_label": "Доступны обновления плагинов"
|
||||
}
|
||||
},
|
||||
"Store": {
|
||||
"store_sort": {
|
||||
"label": "Сортировка",
|
||||
"label_def": "Последнее обновление(самые новые)"
|
||||
},
|
||||
"store_source": {
|
||||
"label": "Исходный код",
|
||||
"desc": "Весь исходный код плагина доступен в репозитории SteamDeckHomebrew/decky-plugin-database на GitHub."
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Информация",
|
||||
"alph_desc": "По алфавиту (A - Z)",
|
||||
"title": "Обзор",
|
||||
"alph_asce": "По алфавиту (Z - A)"
|
||||
},
|
||||
"store_testing_cta": "Пожалуйста, рассмотрите возможность тестирования новых плагинов, чтобы помочь команде Decky Loader!",
|
||||
"store_contrib": {
|
||||
"desc": "Если вы хотите внести свой вклад в магазин плагинов Decky, проверьте репозиторий SteamDeckHomebrew/decky-plugin-template на GitHub. Информация о разработке и распространении доступна в README.",
|
||||
"label": "Помощь проекту"
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Фильтр",
|
||||
"label_def": "Все"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Поиск"
|
||||
}
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Сторонний магазин",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Сторонний",
|
||||
"default": "По-умолчанию",
|
||||
"label": "Канал магазина",
|
||||
"testing": "Тестирование"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Обновления Decky",
|
||||
"no_patch_notes_desc": "нет примечаний к патчу для этой версии",
|
||||
"updates": {
|
||||
"check_button": "Проверить обновления",
|
||||
"checking": "Проверка",
|
||||
"cur_version": "Текущая версия: {{ver}}",
|
||||
"updating": "Обновление",
|
||||
"install_button": "Установить обновление",
|
||||
"label": "Обновления",
|
||||
"lat_version": "Обновлено: версия {{ver}}",
|
||||
"reloading": "Перезагрузка"
|
||||
},
|
||||
"patch_notes_desc": "Примечания к патчу"
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"perm_denied": "У вас нет доступа к указанному каталогу.. Пожалуйста, проверьте имеет ли пользователь (deck на Steam Deck) соответствующие права доступа к указанной папке/файлу.",
|
||||
"file_not_found": "Указан недействительный путь. Пожалуйста, проверьте его и повторите ввод.",
|
||||
"unknown": "Произошла неизвестная ошибка. Текст ошибки: {{raw_error}}"
|
||||
}
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "Назад"
|
||||
}
|
||||
},
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"prerelease": "Предрелиз",
|
||||
"stable": "Стабильный",
|
||||
"testing": "Тестовый",
|
||||
"label": "Канал обновлений"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Перезагрузка через 5 секунд",
|
||||
"disabling": "Выключение React DevTools",
|
||||
"enabling": "Включение React DevTools"
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Разработчик",
|
||||
"general_title": "Общее",
|
||||
"plugins_title": "Плагины"
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,6 @@
|
||||
"label_desc": "URL",
|
||||
"label_url": "Instalo Shtes Nga URL",
|
||||
"label_zip": "Instalo Shtes Nga ZIP"
|
||||
},
|
||||
"toast_zip": {
|
||||
"title": "Decky"
|
||||
}
|
||||
},
|
||||
"BranchSelect": {
|
||||
@@ -59,11 +56,15 @@
|
||||
"desc": "Je i sigurt që don ta çinstalojsh {{name}}?"
|
||||
},
|
||||
"error": "Gabim",
|
||||
"plugin_error_uninstall": "Ju lutem shko nga <0></0> në Decky menu nëse don ta çinstalojsh këtë shtese."
|
||||
"plugin_error_uninstall": "Ju lutem shko nga {{name}} në Decky menu nëse don ta çinstalojsh këtë shtese.",
|
||||
"plugin_update_one": "",
|
||||
"plugin_update_other": ""
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Nuk ka shtesa të instaluar!",
|
||||
"uninstall": "Çinstalo"
|
||||
"uninstall": "Çinstalo",
|
||||
"update_all_one": "",
|
||||
"update_all_other": ""
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"other": {
|
||||
@@ -78,8 +79,7 @@
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Zhvillues",
|
||||
"general_title": "Gjeneral",
|
||||
"navbar_settings": "Cilësimet Decky"
|
||||
"general_title": "Gjeneral"
|
||||
},
|
||||
"Store": {
|
||||
"store_sort": {
|
||||
@@ -111,5 +111,21 @@
|
||||
"updates": {
|
||||
"cur_version": "Versioni e tanishëme: {{ver}}"
|
||||
}
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "",
|
||||
"mixed_other": "",
|
||||
"update_one": "",
|
||||
"update_other": "",
|
||||
"reinstall_one": "",
|
||||
"reinstall_other": "",
|
||||
"install_one": "",
|
||||
"install_other": ""
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "",
|
||||
"hidden_other": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"BranchSelect": {
|
||||
"update_channel": {
|
||||
"prerelease": "Передреліз",
|
||||
"testing": "Тестовий",
|
||||
"label": "Канал оновлень",
|
||||
"stable": "Стабільний"
|
||||
}
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "Перезавантаження за 5 секунд",
|
||||
"enabling": "Увімкнення React DevTools",
|
||||
"disabling": "Вимкнення React DevTools"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "Використовувати цю папку"
|
||||
}
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "Приховано з меню швидкого доступу"
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_full_access": "Цей плагін має повний доступ до вашого Steam Deck.",
|
||||
"plugin_install": "Встановити",
|
||||
"plugin_no_desc": "Опис не надано.",
|
||||
"plugin_version_label": "Версія плагіна"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
"button_idle": "Встановити",
|
||||
"button_processing": "Встановлення",
|
||||
"title": "Встановити {{artifact}}",
|
||||
"desc": "Ви впевнені, що хочете встановити {{artifact}} {{version}}?"
|
||||
},
|
||||
"reinstall": {
|
||||
"button_idle": "Перевстановити",
|
||||
"desc": "Ви впевнені, що хочете перевстановити {{artifact}} {{version}}?",
|
||||
"title": "Перевстановити {{artifact}}",
|
||||
"button_processing": "Перевстановлення"
|
||||
},
|
||||
"update": {
|
||||
"button_idle": "Оновити",
|
||||
"button_processing": "Оновлення",
|
||||
"title": "Оновити {{artifact}}",
|
||||
"desc": "Ви впевнені, що хочете оновити {{artifact}} {{version}}?"
|
||||
},
|
||||
"no_hash": "Цей плагін не має хешу, ви встановлюєте його на власний ризик."
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_one": "Модифікувати 1 плагін",
|
||||
"mixed_few": "Модифікувати {{count}} плагінів",
|
||||
"mixed_many": "",
|
||||
"reinstall_one": "Перевстановити 1 плагін",
|
||||
"reinstall_few": "Перевстановити {{count}} плагінів",
|
||||
"reinstall_many": "Перевстановити {{count}} плагінів",
|
||||
"update_one": "Оновити 1 плагін",
|
||||
"update_few": "Оновити {{count}} плагінів",
|
||||
"update_many": "Оновити {{count}} плагінів",
|
||||
"install_one": "Встановити 1 плагін",
|
||||
"install_few": "Встановити {{count}} плагінів",
|
||||
"install_many": "Встановити {{count}} плагінів"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "Підтвердити",
|
||||
"loading": "Опрацювання"
|
||||
},
|
||||
"description": {
|
||||
"install": "Встановити {{name}} {{version}}",
|
||||
"update": "Оновити {{name}} до {{version}}",
|
||||
"reinstall": "Перевстановити {{name}} {{version}}"
|
||||
},
|
||||
"confirm": "Ви впевнені, що хочете застосувати такі модифікації?"
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "Плагінів не встановлено!",
|
||||
"plugin_actions": "Дії плагінів",
|
||||
"reinstall": "Перевстановити",
|
||||
"reload": "Перезавантажити",
|
||||
"update_to": "Оновити {{name}}",
|
||||
"show": "Швидкий доступ: Показати",
|
||||
"hide": "Швидкий доступ: Приховати",
|
||||
"uninstall": "Видалити",
|
||||
"update_all_one": "Оновити 1 плагін",
|
||||
"update_all_few": "Оновити {{count}} плагінів",
|
||||
"update_all_many": "Оновити {{count}} плагінів"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
"decky_update_available": "Доступне оновлення до {{tag_name}}!",
|
||||
"error": "Помилка",
|
||||
"plugin_load_error": {
|
||||
"message": "Помилка завантаження плагіна {{name}}",
|
||||
"toast": "Помилка завантаження {{name}}"
|
||||
},
|
||||
"plugin_uninstall": {
|
||||
"desc": "Ви впевнені, що хочете видалити {{name}}?",
|
||||
"title": "Видалити {{name}}",
|
||||
"button": "Видалення"
|
||||
},
|
||||
"plugin_error_uninstall": "Завантаження {{name}} спровокувало помилку показану вище. Зазвичай це означає, що плагін вимагає оновлення до нової версії SteamUI. Перевірте чи таке оновлення доступне або виконайте його видалення у налаштуваннях Decky, у секції Плагіни.",
|
||||
"plugin_update_one": "Доступне оновлення для 1 плагіна!",
|
||||
"plugin_update_few": "Доступне оновлення для {{count}} плагінів!",
|
||||
"plugin_update_many": "Доступне оновлення для {{count}} плагінів!"
|
||||
},
|
||||
"SettingsDeveloperIndex": {
|
||||
"cef_console": {
|
||||
"button": "Відкрити консоль",
|
||||
"label": "CEF-консоль",
|
||||
"desc": "Відкрити CEF-консоль. Корисно тільки для дебагу. Ця штука потенційно небезпечна і повинна використовувати виключно якщо ви розробник плагіна, або якщо розробник спрямував вас сюди."
|
||||
},
|
||||
"header": "Інше",
|
||||
"react_devtools": {
|
||||
"desc": "Вмикає доступ до компʼютера із запущеним React DevTools. Зміна цього налаштування перезавантажить Steam. Вкажіть IP перед увімкненням.",
|
||||
"label": "Увімкнути React DevTools",
|
||||
"ip_label": "IP"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "Встановити",
|
||||
"header": "Сторонні плагіни",
|
||||
"label_desc": "URL",
|
||||
"label_url": "Встановити плагін з URL",
|
||||
"label_zip": "Встановити плагін з ZIP-файлу",
|
||||
"button_zip": "Огляд"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "Помилка встановлення! Підтримуються лише ZIP-файли."
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "Вмикає внутрішнє розробницьке меню Valve.",
|
||||
"label": "Увімкнути Valve Internal",
|
||||
"desc2": "Нічого не торкайтесь у цьому меню, якщо не розумієте, що ви робите."
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
"decky_version": "Версія Decky",
|
||||
"header": "Про нас"
|
||||
},
|
||||
"beta": {
|
||||
"header": "Участь у Beta"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "Розробницький режим"
|
||||
},
|
||||
"other": {
|
||||
"header": "Інше"
|
||||
},
|
||||
"updates": {
|
||||
"header": "Оновлення"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "Розробник",
|
||||
"general_title": "Загальне",
|
||||
"plugins_title": "Плагіни"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "Зробити внесок",
|
||||
"desc": "Якщо ви бажаєте додати щось у Decky Plugin Store, завітайте у репозиторій SteamDeckHomebrew/decky-plugin-template на GitHub. Інформація про розробку та поширення доступна у README."
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "Фільтр",
|
||||
"label_def": "Усе"
|
||||
},
|
||||
"store_search": {
|
||||
"label": "Пошук"
|
||||
},
|
||||
"store_sort": {
|
||||
"label": "Сортування",
|
||||
"label_def": "Востаннє оновлені (Найновіші)"
|
||||
},
|
||||
"store_source": {
|
||||
"label": "Вихідний код",
|
||||
"desc": "Код усіх плагінів доступний у репозиторії SteamDeckHomebrew/decky-plugin-database на GitHub."
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "Інформація",
|
||||
"alph_asce": "За алфавітом (Z до A)",
|
||||
"alph_desc": "За алфавітом (A до Z)",
|
||||
"title": "Огляд"
|
||||
},
|
||||
"store_testing_cta": "Розгляньте можливість тестування нових плагінів, щоб допомогти команді Decky Loader!"
|
||||
},
|
||||
"StoreSelect": {
|
||||
"custom_store": {
|
||||
"label": "Власний магазин",
|
||||
"url_label": "URL"
|
||||
},
|
||||
"store_channel": {
|
||||
"custom": "Власний",
|
||||
"default": "За замовчуванням",
|
||||
"testing": "Тестування",
|
||||
"label": "Канал магазину"
|
||||
}
|
||||
},
|
||||
"Updater": {
|
||||
"decky_updates": "Оновлення Decky",
|
||||
"no_patch_notes_desc": "Немає нотаток до цієї версії",
|
||||
"patch_notes_desc": "Перелік змін",
|
||||
"updates": {
|
||||
"checking": "Перевірка",
|
||||
"cur_version": "Поточна версія: {{ver}}",
|
||||
"install_button": "Встановити оновлення",
|
||||
"label": "Оновлення",
|
||||
"reloading": "Перезавантаження",
|
||||
"updating": "Оновлення",
|
||||
"check_button": "Перевірити оновлення",
|
||||
"lat_version": "Оновлено: використовується {{ver}}"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_one": "{{count}} плагін приховано з цього списку",
|
||||
"hidden_few": "{{count}} плагінів приховано з цього списку",
|
||||
"hidden_many": "{{count}} плагінів приховано з цього списку"
|
||||
},
|
||||
"RemoteDebugging": {
|
||||
"remote_cef": {
|
||||
"desc": "Дозволити доступ до CEF-дебагера без аутентифікації для будь-кого у вашій мережі",
|
||||
"label": "Дозволити віддалений CEF-дебагінг"
|
||||
}
|
||||
}
|
||||
}
|
||||
+55
-16
@@ -14,14 +14,34 @@
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
"select": "使用这个文件夹"
|
||||
"select": "使用这个文件夹",
|
||||
"label": "文件夹",
|
||||
"show_more": "显示更多文件"
|
||||
},
|
||||
"filter": {
|
||||
"created_asce": "创建日期(最旧)",
|
||||
"created_desc": "创建日期(最新)",
|
||||
"modified_asce": "修改日期(最旧)",
|
||||
"modified_desc": "修改日期(最新)",
|
||||
"name_asce": "字母降序",
|
||||
"name_desc": "字母升序",
|
||||
"size_asce": "大小(最小)",
|
||||
"size_desc": "大小(最大)"
|
||||
},
|
||||
"files": {
|
||||
"all_files": "全部文件",
|
||||
"file_type": "文件类型",
|
||||
"show_hidden": "显示隐藏文件"
|
||||
},
|
||||
"file": {
|
||||
"select": "选择此文件"
|
||||
}
|
||||
},
|
||||
"PluginCard": {
|
||||
"plugin_install": "安装",
|
||||
"plugin_no_desc": "无描述提供。",
|
||||
"plugin_version_label": "插件版本",
|
||||
"plugin_full_access": "此插件可以完全访问你的 Steam Deck"
|
||||
"plugin_full_access": "此插件可以完全访问你的 Steam Deck。"
|
||||
},
|
||||
"PluginInstallModal": {
|
||||
"install": {
|
||||
@@ -42,7 +62,7 @@
|
||||
"desc": "你确定要更新 {{artifact}} {{version}} 吗?",
|
||||
"title": "更新 {{artifact}}"
|
||||
},
|
||||
"no_hash": "此插件没有哈希校验值,你需要自行承担安装风险"
|
||||
"no_hash": "此插件没有哈希校验值,你需要自行承担安装风险。"
|
||||
},
|
||||
"PluginListIndex": {
|
||||
"no_plugin": "没有安装插件!",
|
||||
@@ -51,7 +71,9 @@
|
||||
"reload": "重新加载",
|
||||
"uninstall": "卸载",
|
||||
"update_to": "更新 {{name}}",
|
||||
"update_all_other": "更新 {{count}} 个插件"
|
||||
"update_all_other": "更新 {{count}} 个插件",
|
||||
"show": "在快速访问菜单中显示",
|
||||
"hide": "在快速访问菜单中隐藏"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
@@ -79,7 +101,7 @@
|
||||
"react_devtools": {
|
||||
"ip_label": "IP",
|
||||
"label": "启用 React DevTools",
|
||||
"desc": "允许连接到运行着 React DevTools 的计算机,更改此设置将重新加载Steam,请在启用前设置IP地址"
|
||||
"desc": "允许连接到运行着 React DevTools 的计算机,更改此设置将重新加载Steam,请在启用前设置IP地址。"
|
||||
},
|
||||
"third_party_plugins": {
|
||||
"button_install": "安装",
|
||||
@@ -89,13 +111,9 @@
|
||||
"label_url": "从 URL 安装插件",
|
||||
"label_zip": "从 ZIP 压缩文件安装插件"
|
||||
},
|
||||
"toast_zip": {
|
||||
"title": "Decky",
|
||||
"body": "安装失败!只有 ZIP 格式的插件被支持"
|
||||
},
|
||||
"valve_internal": {
|
||||
"desc1": "启用 Valve 内部开发者菜单",
|
||||
"desc2": "除非你知道你在干什么,否则请不要修改此菜单中的任何内容",
|
||||
"desc1": "启用 Valve 内部开发者菜单。",
|
||||
"desc2": "除非你知道你在干什么,否则请不要修改此菜单中的任何内容。",
|
||||
"label": "启用 Valve 内部开发者"
|
||||
},
|
||||
"cef_console": {
|
||||
@@ -114,26 +132,29 @@
|
||||
"header": "参与测试"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "开发者模式",
|
||||
"desc": "启用 Decky 的开发者测试"
|
||||
"label": "开发者模式"
|
||||
},
|
||||
"other": {
|
||||
"header": "其他"
|
||||
},
|
||||
"updates": {
|
||||
"header": "更新"
|
||||
},
|
||||
"notifications": {
|
||||
"header": "通知",
|
||||
"decky_updates_label": "Decky 更新可用",
|
||||
"plugin_updates_label": "插件更新可用"
|
||||
}
|
||||
},
|
||||
"SettingsIndex": {
|
||||
"developer_title": "开发者",
|
||||
"general_title": "通用",
|
||||
"navbar_settings": "Decky 设置",
|
||||
"plugins_title": "插件"
|
||||
},
|
||||
"Store": {
|
||||
"store_contrib": {
|
||||
"label": "贡献",
|
||||
"desc": "如果你想要提交你的插件到 Decky 插件商店,请访问 GitHub 上的 SteamDeckHomebrew/decky-plugin-template 存储库,关于开发和分发的相关信息,请查看 README 文件"
|
||||
"desc": "如果你想要提交你的插件到 Decky 插件商店,请访问 GitHub 上的 SteamDeckHomebrew/decky-plugin-template 存储库,关于开发和分发的相关信息,请查看 README 文件。"
|
||||
},
|
||||
"store_filter": {
|
||||
"label": "过滤器",
|
||||
@@ -148,7 +169,7 @@
|
||||
},
|
||||
"store_source": {
|
||||
"label": "源代码",
|
||||
"desc": "所有插件的源代码都可以在 GitHub 上的 SteamDeckHomebrew/decky-plugin-database 存储库中获得"
|
||||
"desc": "所有插件的源代码都可以在 GitHub 上的 SteamDeckHomebrew/decky-plugin-database 存储库中获得。"
|
||||
},
|
||||
"store_tabs": {
|
||||
"about": "关于",
|
||||
@@ -202,5 +223,23 @@
|
||||
"update": "更新 {{name}} to {{version}}",
|
||||
"reinstall": "重装 {{name}} {{version}}"
|
||||
}
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "在快速访问菜单中已隐藏"
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_other": "此列表隐藏了 {{count}} 个插件"
|
||||
},
|
||||
"DropdownMultiselect": {
|
||||
"button": {
|
||||
"back": "返回"
|
||||
}
|
||||
},
|
||||
"FilePickerError": {
|
||||
"errors": {
|
||||
"file_not_found": "指定路径无效。请检查并输入正确的路径。",
|
||||
"unknown": "发生了一个为止错误。原始错误为:{{raw_error}}",
|
||||
"perm_denied": "你没有访问特定目录的权限。请检查你的用户(Steam Deck 中的 deck 账户)有着相对应的权限以访问特定的文件夹或文件。"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
},
|
||||
"Developer": {
|
||||
"5secreload": "5 秒後重新載入",
|
||||
"disabling": "正在停用",
|
||||
"enabling": "正在啟用"
|
||||
"disabling": "正在停用 React DevTools",
|
||||
"enabling": "正在啟用 React DevTools"
|
||||
},
|
||||
"FilePickerIndex": {
|
||||
"folder": {
|
||||
@@ -50,7 +50,10 @@
|
||||
"uninstall": "解除安裝",
|
||||
"update_to": "更新到 {{name}}",
|
||||
"reinstall": "重新安裝",
|
||||
"reload": "重新載入"
|
||||
"reload": "重新載入",
|
||||
"show": "快速存取:顯示",
|
||||
"hide": "快速存取:隱藏",
|
||||
"update_all_other": "更新 {{count}} 個外掛程式"
|
||||
},
|
||||
"PluginLoader": {
|
||||
"decky_title": "Decky",
|
||||
@@ -84,7 +87,6 @@
|
||||
"header": "第三方外掛程式"
|
||||
},
|
||||
"toast_zip": {
|
||||
"body": "安裝失敗!只支援 ZIP 檔案。",
|
||||
"title": "Decky"
|
||||
},
|
||||
"valve_internal": {
|
||||
@@ -97,7 +99,12 @@
|
||||
"ip_label": "IP",
|
||||
"label": "啟用 React DevTools"
|
||||
},
|
||||
"header": "其他"
|
||||
"header": "其他",
|
||||
"cef_console": {
|
||||
"button": "開啟控制台",
|
||||
"label": "CEF 控制台",
|
||||
"desc": "開啟 CEF 控制台。僅用於偵錯。這裡的東西有潛在的風險,只有當你是一個外掛程式開發者或者被外掛程式開發者引導到這裡時,才應該使用。"
|
||||
}
|
||||
},
|
||||
"SettingsGeneralIndex": {
|
||||
"about": {
|
||||
@@ -108,8 +115,7 @@
|
||||
"header": "參與測試"
|
||||
},
|
||||
"developer_mode": {
|
||||
"label": "開發人員模式",
|
||||
"desc": "啟用 Decky 的開發人員模式。"
|
||||
"label": "開發人員模式"
|
||||
},
|
||||
"other": {
|
||||
"header": "其他"
|
||||
@@ -121,7 +127,6 @@
|
||||
"SettingsIndex": {
|
||||
"developer_title": "開發人員",
|
||||
"general_title": "一般",
|
||||
"navbar_settings": "Decky 設定",
|
||||
"plugins_title": "外掛程式"
|
||||
},
|
||||
"Store": {
|
||||
@@ -178,5 +183,29 @@
|
||||
"cur_version": "目前版本:{{ver}}",
|
||||
"updating": "正在更新"
|
||||
}
|
||||
},
|
||||
"PluginView": {
|
||||
"hidden_other": "{{count}} 個外掛程式已隱藏"
|
||||
},
|
||||
"PluginListLabel": {
|
||||
"hidden": "已從快速存取選單中移除"
|
||||
},
|
||||
"MultiplePluginsInstallModal": {
|
||||
"title": {
|
||||
"mixed_other": "修改 {{count}} 個外掛程式",
|
||||
"update_other": "更新 {{count}} 個外掛程式",
|
||||
"reinstall_other": "重新安裝 {{count}} 個外掛程式",
|
||||
"install_other": "安裝 {{count}} 個外掛程式"
|
||||
},
|
||||
"ok_button": {
|
||||
"idle": "確定",
|
||||
"loading": "執行中"
|
||||
},
|
||||
"confirm": "您確定要進行以下的修改嗎?",
|
||||
"description": {
|
||||
"install": "安裝 {{name}} {{version}}",
|
||||
"update": "更新 {{name}} 到 {{version}}",
|
||||
"reinstall": "重新安裝 {{name}} {{version}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,10 +63,13 @@ class PluginWrapper:
|
||||
environ["DECKY_USER_HOME"] = helpers.get_home_path()
|
||||
environ["DECKY_HOME"] = helpers.get_homebrew_path()
|
||||
environ["DECKY_PLUGIN_SETTINGS_DIR"] = path.join(environ["DECKY_HOME"], "settings", self.plugin_directory)
|
||||
helpers.mkdir_as_user(path.join(environ["DECKY_HOME"], "settings"))
|
||||
helpers.mkdir_as_user(environ["DECKY_PLUGIN_SETTINGS_DIR"])
|
||||
environ["DECKY_PLUGIN_RUNTIME_DIR"] = path.join(environ["DECKY_HOME"], "data", self.plugin_directory)
|
||||
helpers.mkdir_as_user(path.join(environ["DECKY_HOME"], "data"))
|
||||
helpers.mkdir_as_user(environ["DECKY_PLUGIN_RUNTIME_DIR"])
|
||||
environ["DECKY_PLUGIN_LOG_DIR"] = path.join(environ["DECKY_HOME"], "logs", self.plugin_directory)
|
||||
helpers.mkdir_as_user(path.join(environ["DECKY_HOME"], "logs"))
|
||||
helpers.mkdir_as_user(environ["DECKY_PLUGIN_LOG_DIR"])
|
||||
environ["DECKY_PLUGIN_DIR"] = path.join(self.plugin_path, self.plugin_directory)
|
||||
environ["DECKY_PLUGIN_NAME"] = self.name
|
||||
|
||||
+85
-21
@@ -1,16 +1,21 @@
|
||||
import uuid
|
||||
import os
|
||||
from json.decoder import JSONDecodeError
|
||||
from os.path import splitext
|
||||
import re
|
||||
from traceback import format_exc
|
||||
from stat import FILE_ATTRIBUTE_HIDDEN
|
||||
|
||||
from asyncio import sleep, start_server, gather, open_connection
|
||||
from aiohttp import ClientSession, web
|
||||
|
||||
from logging import getLogger
|
||||
from injector import inject_to_tab, get_gamepadui_tab, close_old_tabs, get_tab
|
||||
from pathlib import Path
|
||||
from localplatform import ON_WINDOWS
|
||||
import helpers
|
||||
import subprocess
|
||||
from localplatform import service_stop, service_start
|
||||
from localplatform import service_stop, service_start, get_home_path, get_username
|
||||
|
||||
class Utilities:
|
||||
def __init__(self, context) -> None:
|
||||
@@ -33,7 +38,8 @@ class Utilities:
|
||||
"filepicker_ls": self.filepicker_ls,
|
||||
"disable_rdt": self.disable_rdt,
|
||||
"enable_rdt": self.enable_rdt,
|
||||
"get_tab_id": self.get_tab_id
|
||||
"get_tab_id": self.get_tab_id,
|
||||
"get_user_info": self.get_user_info,
|
||||
}
|
||||
|
||||
self.logger = getLogger("Utilities")
|
||||
@@ -189,31 +195,83 @@ class Utilities:
|
||||
await service_stop(helpers.REMOTE_DEBUGGER_UNIT)
|
||||
return True
|
||||
|
||||
async def filepicker_ls(self, path, include_files=True):
|
||||
# def sorter(file): # Modification time
|
||||
# if os.path.isdir(os.path.join(path, file)) or os.path.isfile(os.path.join(path, file)):
|
||||
# return os.path.getmtime(os.path.join(path, file))
|
||||
# return 0
|
||||
# file_names = sorted(os.listdir(path), key=sorter, reverse=True) # TODO provide more sort options
|
||||
file_names = sorted(os.listdir(path)) # Alphabetical
|
||||
async def filepicker_ls(self,
|
||||
path : str | None = None,
|
||||
include_files: bool = True,
|
||||
include_folders: bool = True,
|
||||
include_ext: list[str] = [],
|
||||
include_hidden: bool = False,
|
||||
order_by: str = "name_asc",
|
||||
filter_for: str | None = None,
|
||||
page: int = 1,
|
||||
max: int = 1000):
|
||||
|
||||
if path == None:
|
||||
path = get_home_path()
|
||||
|
||||
files = []
|
||||
path = Path(path).resolve()
|
||||
|
||||
for file in file_names:
|
||||
full_path = os.path.join(path, file)
|
||||
is_dir = os.path.isdir(full_path)
|
||||
files, folders = [], []
|
||||
|
||||
if is_dir or include_files:
|
||||
files.append({
|
||||
"isdir": is_dir,
|
||||
"name": file,
|
||||
"realpath": os.path.realpath(full_path)
|
||||
})
|
||||
#Resolving all files/folders in the requested directory
|
||||
for file in path.iterdir():
|
||||
if file.exists():
|
||||
filest = file.stat()
|
||||
is_hidden = file.name.startswith('.')
|
||||
if ON_WINDOWS and not is_hidden:
|
||||
is_hidden = bool(filest.st_file_attributes & FILE_ATTRIBUTE_HIDDEN)
|
||||
if include_folders and file.is_dir():
|
||||
if (is_hidden and include_hidden) or not is_hidden:
|
||||
folders.append({"file": file, "filest": filest, "is_dir": True})
|
||||
elif include_files:
|
||||
# Handle requested extensions if present
|
||||
if len(include_ext) == 0 or 'all_files' in include_ext \
|
||||
or splitext(file.name)[1].lstrip('.') in include_ext:
|
||||
if (is_hidden and include_hidden) or not is_hidden:
|
||||
files.append({"file": file, "filest": filest, "is_dir": False})
|
||||
# Filter logic
|
||||
if filter_for is not None:
|
||||
try:
|
||||
if re.compile(filter_for):
|
||||
files = filter(lambda file: re.search(filter_for, file.name) != None, files)
|
||||
except re.error:
|
||||
files = filter(lambda file: file.name.find(filter_for) != -1, files)
|
||||
|
||||
# Ordering logic
|
||||
ord_arg = order_by.split("_")
|
||||
ord = ord_arg[0]
|
||||
rev = True if ord_arg[1] == "asc" else False
|
||||
match ord:
|
||||
case 'name':
|
||||
files.sort(key=lambda x: x['file'].name.casefold(), reverse = rev)
|
||||
folders.sort(key=lambda x: x['file'].name.casefold(), reverse = rev)
|
||||
case 'modified':
|
||||
files.sort(key=lambda x: x['filest'].st_mtime, reverse = not rev)
|
||||
folders.sort(key=lambda x: x['filest'].st_mtime, reverse = not rev)
|
||||
case 'created':
|
||||
files.sort(key=lambda x: x['filest'].st_ctime, reverse = not rev)
|
||||
folders.sort(key=lambda x: x['filest'].st_ctime, reverse = not rev)
|
||||
case 'size':
|
||||
files.sort(key=lambda x: x['filest'].st_size, reverse = not rev)
|
||||
# Folders has no file size, order by name instead
|
||||
folders.sort(key=lambda x: x['file'].name.casefold())
|
||||
|
||||
#Constructing the final file list, folders first
|
||||
all = [{
|
||||
"isdir": x['is_dir'],
|
||||
"name": str(x['file'].name),
|
||||
"realpath": str(x['file']),
|
||||
"size": x['filest'].st_size,
|
||||
"modified": x['filest'].st_mtime,
|
||||
"created": x['filest'].st_ctime,
|
||||
} for x in folders + files ]
|
||||
|
||||
return {
|
||||
"realpath": os.path.realpath(path),
|
||||
"files": files
|
||||
"realpath": str(path),
|
||||
"files": all[(page-1)*max:(page)*max],
|
||||
"total": len(all),
|
||||
}
|
||||
|
||||
|
||||
# Based on https://stackoverflow.com/a/46422554/13174603
|
||||
def start_rdt_proxy(self, ip, port):
|
||||
@@ -289,5 +347,11 @@ class Utilities:
|
||||
await tab.evaluate_js("location.reload();", False, True, False)
|
||||
self.logger.info("React DevTools disabled")
|
||||
|
||||
async def get_user_info(self) -> dict:
|
||||
return {
|
||||
"username": get_username(),
|
||||
"path": get_home_path()
|
||||
}
|
||||
|
||||
async def get_tab_id(self, name):
|
||||
return (await get_tab(name)).id
|
||||
|
||||
@@ -36,7 +36,7 @@ export default {
|
||||
lineEnding: 'auto',
|
||||
// Control the line ending. See options at https://github.com/ryanve/eol
|
||||
|
||||
locales: ['en-US', 'it-IT'],
|
||||
locales: ['en-US'],
|
||||
// An array of the locales in your applications
|
||||
|
||||
namespaceSeparator: false,
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"@types/react-router": "5.1.18",
|
||||
"@types/webpack": "^5.28.1",
|
||||
"husky": "^8.0.3",
|
||||
"i18next-parser": "^7.9.0",
|
||||
"i18next-parser": "^8.0.0",
|
||||
"import-sort-style-module": "^6.0.0",
|
||||
"inquirer": "^8.2.5",
|
||||
"prettier": "^2.8.8",
|
||||
@@ -33,8 +33,8 @@
|
||||
"rollup-plugin-delete": "^2.0.0",
|
||||
"rollup-plugin-external-globals": "^0.6.1",
|
||||
"rollup-plugin-polyfill-node": "^0.10.2",
|
||||
"rollup-plugin-visualizer": "^5.9.0",
|
||||
"tslib": "^2.5.2",
|
||||
"rollup-plugin-visualizer": "^5.9.2",
|
||||
"tslib": "^2.5.3",
|
||||
"typescript": "^4.9.5"
|
||||
},
|
||||
"importSort": {
|
||||
@@ -45,11 +45,12 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"decky-frontend-lib": "3.21.1",
|
||||
"i18next": "^22.5.0",
|
||||
"filesize": "^10.0.7",
|
||||
"i18next": "^23.2.1",
|
||||
"i18next-http-backend": "^2.2.1",
|
||||
"react-file-icon": "^1.3.0",
|
||||
"react-i18next": "^12.3.1",
|
||||
"react-icons": "^4.8.0",
|
||||
"react-icons": "^4.9.0",
|
||||
"react-markdown": "^8.0.7",
|
||||
"remark-gfm": "^3.0.1"
|
||||
}
|
||||
|
||||
Generated
+359
-341
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
import { FC, createContext, useContext, useEffect, useState } from 'react';
|
||||
|
||||
import { DEFAULT_NOTIFICATION_SETTINGS, NotificationSettings } from '../notification-service';
|
||||
import { Plugin } from '../plugin';
|
||||
import { PluginUpdateMapping } from '../store';
|
||||
import { VerInfo } from '../updater';
|
||||
@@ -13,6 +14,13 @@ interface PublicDeckyState {
|
||||
hasLoaderUpdate?: boolean;
|
||||
isLoaderUpdating: boolean;
|
||||
versionInfo: VerInfo | null;
|
||||
notificationSettings: NotificationSettings;
|
||||
userInfo: UserInfo | null;
|
||||
}
|
||||
|
||||
export interface UserInfo {
|
||||
username: string;
|
||||
path: string;
|
||||
}
|
||||
|
||||
export class DeckyState {
|
||||
@@ -24,6 +32,8 @@ export class DeckyState {
|
||||
private _hasLoaderUpdate: boolean = false;
|
||||
private _isLoaderUpdating: boolean = false;
|
||||
private _versionInfo: VerInfo | null = null;
|
||||
private _notificationSettings = DEFAULT_NOTIFICATION_SETTINGS;
|
||||
private _userInfo: UserInfo | null = null;
|
||||
|
||||
public eventBus = new EventTarget();
|
||||
|
||||
@@ -37,6 +47,8 @@ export class DeckyState {
|
||||
hasLoaderUpdate: this._hasLoaderUpdate,
|
||||
isLoaderUpdating: this._isLoaderUpdating,
|
||||
versionInfo: this._versionInfo,
|
||||
notificationSettings: this._notificationSettings,
|
||||
userInfo: this._userInfo,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,6 +97,16 @@ export class DeckyState {
|
||||
this.notifyUpdate();
|
||||
}
|
||||
|
||||
setNotificationSettings(notificationSettings: NotificationSettings) {
|
||||
this._notificationSettings = notificationSettings;
|
||||
this.notifyUpdate();
|
||||
}
|
||||
|
||||
setUserInfo(userInfo: UserInfo) {
|
||||
this._userInfo = userInfo;
|
||||
this.notifyUpdate();
|
||||
}
|
||||
|
||||
private notifyUpdate() {
|
||||
this.eventBus.dispatchEvent(new Event('update'));
|
||||
}
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
import { FC, createContext, useContext, useState } from 'react';
|
||||
|
||||
const QuickAccessVisibleState = createContext<boolean>(true);
|
||||
const QuickAccessVisibleState = createContext<boolean>(false);
|
||||
|
||||
export const useQuickAccessVisible = () => useContext(QuickAccessVisibleState);
|
||||
|
||||
export const QuickAccessVisibleStateProvider: FC<{ initial: boolean; tab: any }> = ({ children, initial, tab }) => {
|
||||
export const QuickAccessVisibleStateProvider: FC<{ tab: any }> = ({ children, tab }) => {
|
||||
const initial = tab.initialVisibility;
|
||||
const [visible, setVisible] = useState<boolean>(initial);
|
||||
const [prev, setPrev] = useState<boolean>(initial);
|
||||
// HACK but i can't think of a better way to do this
|
||||
tab.qAMVisibilitySetter = setVisible;
|
||||
if (initial != prev) {
|
||||
setPrev(initial);
|
||||
setVisible(initial);
|
||||
}
|
||||
tab.qAMVisibilitySetter = (val: boolean) => {
|
||||
if (val != visible) setVisible(val);
|
||||
};
|
||||
|
||||
return <QuickAccessVisibleState.Provider value={visible}>{children}</QuickAccessVisibleState.Provider>;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
import {
|
||||
DialogButton,
|
||||
DialogCheckbox,
|
||||
DialogCheckboxProps,
|
||||
Marquee,
|
||||
Menu,
|
||||
MenuItem,
|
||||
findModuleChild,
|
||||
showContextMenu,
|
||||
} from 'decky-frontend-lib';
|
||||
import { FC, useCallback, useEffect, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { FaChevronDown } from 'react-icons/fa';
|
||||
|
||||
const dropDownControlButtonClass = findModuleChild((m) => {
|
||||
if (typeof m !== 'object') return undefined;
|
||||
for (const prop in m) {
|
||||
if (m[prop]?.toString()?.includes('gamepaddropdown_DropDownControlButton')) {
|
||||
return m[prop];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const DropdownMultiselectItem: FC<
|
||||
{
|
||||
value: any;
|
||||
onSelect: (checked: boolean, value: any) => void;
|
||||
checked: boolean;
|
||||
} & DialogCheckboxProps
|
||||
> = ({ value, onSelect, checked: defaultChecked, ...rest }) => {
|
||||
const [checked, setChecked] = useState(defaultChecked);
|
||||
|
||||
useEffect(() => {
|
||||
onSelect?.(checked, value);
|
||||
}, [checked, onSelect, value]);
|
||||
|
||||
return (
|
||||
<MenuItem bInteractableItem onClick={() => setChecked((x) => !x)}>
|
||||
<DialogCheckbox
|
||||
style={{ marginBottom: 0, padding: 0 }}
|
||||
className="decky_DropdownMultiselectItem_DialogCheckbox"
|
||||
bottomSeparator="none"
|
||||
{...rest}
|
||||
onClick={() => setChecked((x) => !x)}
|
||||
onChange={(checked) => setChecked(checked)}
|
||||
controlled
|
||||
checked={checked}
|
||||
/>
|
||||
</MenuItem>
|
||||
);
|
||||
};
|
||||
|
||||
const DropdownMultiselect: FC<{
|
||||
items: {
|
||||
label: string;
|
||||
value: string;
|
||||
}[];
|
||||
selected: string[];
|
||||
onSelect: (selected: any[]) => void;
|
||||
label: string;
|
||||
}> = ({ label, items, selected, onSelect }) => {
|
||||
const [itemsSelected, setItemsSelected] = useState<any>(selected);
|
||||
const { t } = useTranslation();
|
||||
|
||||
const handleItemSelect = useCallback((checked, value) => {
|
||||
setItemsSelected((x: any) =>
|
||||
checked ? [...x.filter((y: any) => y !== value), value] : x.filter((y: any) => y !== value),
|
||||
);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
onSelect(itemsSelected);
|
||||
}, [itemsSelected, onSelect]);
|
||||
|
||||
return (
|
||||
<DialogButton
|
||||
style={{
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
maxWidth: '100%',
|
||||
}}
|
||||
className={dropDownControlButtonClass}
|
||||
onClick={(evt) => {
|
||||
evt.preventDefault();
|
||||
showContextMenu(
|
||||
<Menu label={label} cancelText={t('DropdownMultiselect.button.back') as string}>
|
||||
<style>
|
||||
{`
|
||||
/* Inherit color from ".basiccontextmenu" */
|
||||
.decky_DropdownMultiselectItem_DialogCheckbox > .DialogToggle_Label {
|
||||
color: inherit;
|
||||
}
|
||||
`}
|
||||
</style>
|
||||
<div style={{ marginTop: '10px' }}>{/*FIXME: Hack for missing padding under label menu*/}</div>
|
||||
{items.map((x) => (
|
||||
<DropdownMultiselectItem
|
||||
key={x.value}
|
||||
label={x.label}
|
||||
value={x.value}
|
||||
checked={itemsSelected.includes(x.value)}
|
||||
onSelect={handleItemSelect}
|
||||
/>
|
||||
))}
|
||||
</Menu>,
|
||||
evt.currentTarget ?? window,
|
||||
);
|
||||
}}
|
||||
>
|
||||
<Marquee>
|
||||
{selected.length > 0
|
||||
? selected.map((x: any) => items[items.findIndex((v) => v.value === x)].label).join(', ')
|
||||
: '…'}
|
||||
</Marquee>
|
||||
<div style={{ flexGrow: 1, minWidth: '1ch' }} />
|
||||
<FaChevronDown style={{ height: '1em', flex: '0 0 1em' }} />
|
||||
</DialogButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default DropdownMultiselect;
|
||||
@@ -0,0 +1,56 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { IconContext } from 'react-icons';
|
||||
import { FaExclamationTriangle, FaQuestionCircle, FaUserSlash } from 'react-icons/fa';
|
||||
|
||||
export enum FileErrorTypes {
|
||||
FileNotFound,
|
||||
PermissionDenied,
|
||||
Unknown,
|
||||
None,
|
||||
}
|
||||
|
||||
interface FilePickerErrorProps {
|
||||
error: FileErrorTypes;
|
||||
rawError?: string;
|
||||
}
|
||||
|
||||
const FilePickerError: FC<FilePickerErrorProps> = ({ error, rawError = null }) => {
|
||||
const [icon, setIcon] = useState<JSX.Element>(<FaQuestionCircle />);
|
||||
const [text, setText] = useState<string | null>(null);
|
||||
const { t } = useTranslation();
|
||||
|
||||
useEffect(() => {
|
||||
switch (error) {
|
||||
case FileErrorTypes.FileNotFound:
|
||||
setText(t('FilePickerError.errors.file_not_found'));
|
||||
setIcon(<FaExclamationTriangle />);
|
||||
break;
|
||||
case FileErrorTypes.PermissionDenied:
|
||||
setText(t('FilePickerError.errors.perm_denied'));
|
||||
setIcon(<FaUserSlash />);
|
||||
break;
|
||||
case FileErrorTypes.Unknown:
|
||||
setText(t('FilePickerError.errors.unknown', { raw_error: rawError }));
|
||||
setIcon(<FaQuestionCircle />);
|
||||
break;
|
||||
case FileErrorTypes.None:
|
||||
setText(null);
|
||||
setIcon(<div></div>);
|
||||
break;
|
||||
}
|
||||
}, [error]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div style={{ paddingTop: '50px', textAlign: 'center', height: '100%' }}>
|
||||
<IconContext.Provider value={{ className: 'fileError', size: '128px' }}>
|
||||
<div style={{ alignSelf: 'center', alignContent: 'center' }}>{icon}</div>
|
||||
</IconContext.Provider>
|
||||
<p style={{ height: '32px', paddingTop: '25px', alignSelf: 'flex-start', textAlign: 'center' }}>{text}</p>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default FilePickerError;
|
||||
@@ -0,0 +1,46 @@
|
||||
import { FC } from 'react';
|
||||
import { Translation } from 'react-i18next';
|
||||
|
||||
export enum SortOptions {
|
||||
name_desc = 'name_desc',
|
||||
name_asc = 'name_asc',
|
||||
modified_desc = 'modified_desc',
|
||||
modified_asc = 'modified_asc',
|
||||
created_desc = 'created_desc',
|
||||
created_asc = 'created_asc',
|
||||
size_desc = 'size_desc',
|
||||
size_asc = 'size_asc',
|
||||
}
|
||||
|
||||
interface TSortOptionsProps {
|
||||
trans_part: SortOptions;
|
||||
}
|
||||
|
||||
const TSortOptions: FC<TSortOptionsProps> = ({ trans_part }) => {
|
||||
return (
|
||||
<Translation>
|
||||
{(t, {}) => {
|
||||
switch (trans_part) {
|
||||
case SortOptions.name_desc:
|
||||
return t('FilePickerIndex.filter.name_desc');
|
||||
case SortOptions.name_asc:
|
||||
return t('FilePickerIndex.filter.name_asce');
|
||||
case SortOptions.modified_desc:
|
||||
return t('FilePickerIndex.filter.modified_desc');
|
||||
case SortOptions.modified_asc:
|
||||
return t('FilePickerIndex.filter.modified_asce');
|
||||
case SortOptions.created_desc:
|
||||
return t('FilePickerIndex.filter.created_desc');
|
||||
case SortOptions.created_asc:
|
||||
return t('FilePickerIndex.filter.created_asce');
|
||||
case SortOptions.size_desc:
|
||||
return t('FilePickerIndex.filter.size_desc');
|
||||
case SortOptions.size_asc:
|
||||
return t('FilePickerIndex.filter.size_asce');
|
||||
}
|
||||
}}
|
||||
</Translation>
|
||||
);
|
||||
};
|
||||
|
||||
export default TSortOptions;
|
||||
@@ -38,7 +38,7 @@ const imageStyle = {
|
||||
color: '#d18f00',
|
||||
};
|
||||
|
||||
const imageExtList = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff'];
|
||||
const imageExtList = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff', 'apng', 'tga'];
|
||||
|
||||
styleDef.push([imageStyle, imageExtList]);
|
||||
|
||||
|
||||
@@ -1,11 +1,26 @@
|
||||
import { DialogButton, Focusable, SteamSpinner, TextField } from 'decky-frontend-lib';
|
||||
import { useEffect } from 'react';
|
||||
import { FunctionComponent, useState } from 'react';
|
||||
import {
|
||||
ControlsList,
|
||||
DialogBody,
|
||||
DialogButton,
|
||||
DialogControlsSection,
|
||||
DialogFooter,
|
||||
Dropdown,
|
||||
Focusable,
|
||||
Marquee,
|
||||
SteamSpinner,
|
||||
TextField,
|
||||
ToggleField,
|
||||
} from 'decky-frontend-lib';
|
||||
import { filesize } from 'filesize';
|
||||
import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { FileIcon, defaultStyles } from 'react-file-icon';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { FaArrowUp, FaFolder } from 'react-icons/fa';
|
||||
|
||||
import Logger from '../../../logger';
|
||||
import DropdownMultiselect from '../DropdownMultiselect';
|
||||
import FilePickerError, { FileErrorTypes } from './FilePickerError';
|
||||
import TSortOption, { SortOptions } from './i18n/TSortOptions';
|
||||
import { styleDefObj } from './iconCustomizations';
|
||||
|
||||
const logger = new Logger('FilePicker');
|
||||
@@ -13,27 +28,95 @@ const logger = new Logger('FilePicker');
|
||||
export interface FilePickerProps {
|
||||
startPath: string;
|
||||
includeFiles?: boolean;
|
||||
regex?: RegExp;
|
||||
includeFolders?: boolean;
|
||||
filter?: RegExp | ((file: File) => boolean);
|
||||
validFileExtensions?: string[];
|
||||
allowAllFiles?: boolean;
|
||||
defaultHidden?: boolean;
|
||||
max?: number;
|
||||
fileSelType?: FileSelectionType;
|
||||
onSubmit: (val: { path: string; realpath: string }) => void;
|
||||
closeModal?: () => void;
|
||||
}
|
||||
|
||||
interface File {
|
||||
export interface File {
|
||||
isdir: boolean;
|
||||
ishidden: boolean;
|
||||
name: string;
|
||||
realpath: string;
|
||||
size: number;
|
||||
modified: number;
|
||||
created: number;
|
||||
}
|
||||
|
||||
export enum FileSelectionType {
|
||||
FILE,
|
||||
FOLDER,
|
||||
}
|
||||
|
||||
interface FileListing {
|
||||
realpath: string;
|
||||
files: File[];
|
||||
total: number;
|
||||
}
|
||||
|
||||
const sortOptions = [
|
||||
{
|
||||
data: SortOptions.name_desc,
|
||||
label: <TSortOption trans_part={SortOptions.name_desc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.name_asc,
|
||||
label: <TSortOption trans_part={SortOptions.name_asc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.modified_desc,
|
||||
label: <TSortOption trans_part={SortOptions.modified_desc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.modified_asc,
|
||||
label: <TSortOption trans_part={SortOptions.modified_asc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.created_desc,
|
||||
label: <TSortOption trans_part={SortOptions.created_desc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.created_asc,
|
||||
label: <TSortOption trans_part={SortOptions.created_asc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.size_desc,
|
||||
label: <TSortOption trans_part={SortOptions.size_desc} />,
|
||||
},
|
||||
{
|
||||
data: SortOptions.size_asc,
|
||||
label: <TSortOption trans_part={SortOptions.size_asc} />,
|
||||
},
|
||||
];
|
||||
|
||||
function getList(
|
||||
path: string,
|
||||
includeFiles: boolean = true,
|
||||
includeFiles: boolean,
|
||||
includeFolders: boolean = true,
|
||||
includeExt: string[] | null = null,
|
||||
includeHidden: boolean = false,
|
||||
orderBy: SortOptions = SortOptions.name_desc,
|
||||
filterFor: RegExp | ((file: File) => boolean) | null = null,
|
||||
pageNumber: number = 1,
|
||||
max: number = 1000,
|
||||
): Promise<{ result: FileListing | string; success: boolean }> {
|
||||
return window.DeckyPluginLoader.callServerMethod('filepicker_ls', { path, include_files: includeFiles });
|
||||
return window.DeckyPluginLoader.callServerMethod('filepicker_ls', {
|
||||
path,
|
||||
include_files: includeFiles,
|
||||
include_folders: includeFolders,
|
||||
include_ext: includeExt ? includeExt : [],
|
||||
include_hidden: includeHidden,
|
||||
order_by: orderBy,
|
||||
filter_for: filterFor,
|
||||
page: pageNumber,
|
||||
max: max,
|
||||
});
|
||||
}
|
||||
|
||||
const iconStyles = {
|
||||
@@ -43,127 +126,254 @@ const iconStyles = {
|
||||
|
||||
const FilePicker: FunctionComponent<FilePickerProps> = ({
|
||||
startPath,
|
||||
//What are we allowing to show in the file picker
|
||||
includeFiles = true,
|
||||
regex,
|
||||
includeFolders = true,
|
||||
//Parameter for specifying a specific filename match
|
||||
filter = undefined,
|
||||
//Filter for specific extensions as an array
|
||||
validFileExtensions = undefined,
|
||||
//Allow to override the fixed extension above
|
||||
allowAllFiles = true,
|
||||
//If we need to show hidden files and folders (both Win and Linux should work)
|
||||
defaultHidden = false, // false by default makes sense for most users
|
||||
//How much files per page to show, default 1000
|
||||
max = 1000,
|
||||
//Which picking option to select by default
|
||||
fileSelType = FileSelectionType.FOLDER,
|
||||
onSubmit,
|
||||
closeModal,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
if (startPath.endsWith('/')) startPath = startPath.substring(0, startPath.length - 1); // remove trailing path
|
||||
|
||||
if (startPath !== '/' && startPath.endsWith('/')) startPath = startPath.substring(0, startPath.length - 1); // remove trailing path
|
||||
const [path, setPath] = useState<string>(startPath);
|
||||
const [listing, setListing] = useState<FileListing>({ files: [], realpath: path });
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [listing, setListing] = useState<FileListing>({ files: [], realpath: path, total: 0 });
|
||||
const [files, setFiles] = useState<File[]>([]);
|
||||
const [error, setError] = useState<FileErrorTypes>(FileErrorTypes.None);
|
||||
const [rawError, setRawError] = useState<string | null>(null);
|
||||
const [page, setPage] = useState<number>(1);
|
||||
const [loading, setLoading] = useState<boolean>(true);
|
||||
const [showHidden, setShowHidden] = useState<boolean>(defaultHidden);
|
||||
const [sort, setSort] = useState<SortOptions>(SortOptions.name_desc);
|
||||
const [selectedExts, setSelectedExts] = useState<string[] | undefined>(validFileExtensions);
|
||||
|
||||
const validExtsOptions = useMemo(() => {
|
||||
let validExt: { label: string; value: string }[] = [];
|
||||
if (validFileExtensions) {
|
||||
if (allowAllFiles) {
|
||||
validExt.push({ label: t('FilePickerIndex.files.all_files'), value: 'all_files' });
|
||||
}
|
||||
validExt.push(...validFileExtensions.map((x) => ({ label: x, value: x })));
|
||||
}
|
||||
return validExt;
|
||||
}, [validFileExtensions, allowAllFiles]);
|
||||
|
||||
function isSelectionValid(validExts: string[], selection: string[]) {
|
||||
if (validExts.some((el) => selection.includes(el))) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
const handleExtsSelect = useCallback((val: any) => {
|
||||
// unselect other options if "All Files" is checked
|
||||
if (allowAllFiles && val.includes('all_files')) {
|
||||
setSelectedExts(['all_files']);
|
||||
} else if (validFileExtensions && isSelectionValid(validFileExtensions, val)) {
|
||||
// If at least one extension is still selected, then assign this selection to the selected values
|
||||
setSelectedExts(val);
|
||||
} else {
|
||||
// Else do nothing
|
||||
setSelectedExts(selectedExts);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
(async () => {
|
||||
if (error) setError(null);
|
||||
setLoading(true);
|
||||
const listing = await getList(path, includeFiles);
|
||||
const listing = await getList(
|
||||
path,
|
||||
includeFiles,
|
||||
includeFolders,
|
||||
selectedExts,
|
||||
showHidden,
|
||||
sort,
|
||||
filter,
|
||||
page,
|
||||
max,
|
||||
);
|
||||
if (!listing.success) {
|
||||
setListing({ files: [], realpath: path });
|
||||
setListing({ files: [], realpath: path, total: 0 });
|
||||
setLoading(false);
|
||||
setError(listing.result as string);
|
||||
logger.error(listing.result);
|
||||
const theError = listing.result as string;
|
||||
switch (theError) {
|
||||
case theError.match(/\[Errno\s2.*/i)?.input:
|
||||
case theError.match(/\[WinError\s3.*/i)?.input:
|
||||
setError(FileErrorTypes.FileNotFound);
|
||||
break;
|
||||
case theError.match(/\[Errno\s13.*/i)?.input:
|
||||
setError(FileErrorTypes.PermissionDenied);
|
||||
break;
|
||||
default:
|
||||
setRawError(theError);
|
||||
setError(FileErrorTypes.Unknown);
|
||||
break;
|
||||
}
|
||||
logger.debug(theError);
|
||||
return;
|
||||
} else {
|
||||
setRawError(null);
|
||||
setError(FileErrorTypes.None);
|
||||
setFiles((listing.result as FileListing).files);
|
||||
}
|
||||
setLoading(false);
|
||||
setListing(listing.result as FileListing);
|
||||
logger.log('reloaded', path, listing);
|
||||
})();
|
||||
}, [path]);
|
||||
}, [error, path, includeFiles, includeFolders, showHidden, sort, selectedExts, page]);
|
||||
|
||||
return (
|
||||
<div className="deckyFilePicker">
|
||||
<Focusable style={{ display: 'flex', flexDirection: 'row', paddingBottom: '10px' }}>
|
||||
<DialogButton
|
||||
style={{
|
||||
minWidth: 'unset',
|
||||
width: '40px',
|
||||
flexGrow: '0',
|
||||
borderRadius: 'unset',
|
||||
margin: '0',
|
||||
padding: '10px',
|
||||
}}
|
||||
onClick={() => {
|
||||
const newPathArr = path.split('/');
|
||||
newPathArr.pop();
|
||||
let newPath = newPathArr.join('/');
|
||||
if (newPath == '') newPath = '/';
|
||||
setPath(newPath);
|
||||
}}
|
||||
>
|
||||
<FaArrowUp />
|
||||
</DialogButton>
|
||||
<div style={{ flexGrow: '1', width: '100%' }}>
|
||||
<TextField
|
||||
value={path}
|
||||
onChange={(e) => {
|
||||
e.target.value && setPath(e.target.value);
|
||||
}}
|
||||
style={{ height: '100%' }}
|
||||
/>
|
||||
</div>
|
||||
</Focusable>
|
||||
<Focusable style={{ display: 'flex', flexDirection: 'column', height: '60vh', overflow: 'scroll' }}>
|
||||
{loading && <SteamSpinner style={{ height: '100%' }} />}
|
||||
{!loading &&
|
||||
listing.files
|
||||
.filter((file) => (includeFiles || file.isdir) && (!regex || regex.test(file.name)))
|
||||
.map((file) => {
|
||||
let extension = file.realpath.split('.').pop() as string;
|
||||
return (
|
||||
<DialogButton
|
||||
style={{ borderRadius: 'unset', margin: '0', padding: '10px' }}
|
||||
onClick={() => {
|
||||
const fullPath = `${path}${path.endsWith('/') ? '' : '/'}${file.name}`;
|
||||
if (file.isdir) setPath(fullPath);
|
||||
else {
|
||||
onSubmit({ path: fullPath, realpath: file.realpath });
|
||||
closeModal?.();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div style={{ display: 'flex', flexDirection: 'row', alignItems: 'flex-start' }}>
|
||||
{file.isdir ? (
|
||||
<FaFolder style={iconStyles} />
|
||||
) : (
|
||||
<div style={iconStyles}>
|
||||
{file.realpath.includes('.') ? (
|
||||
<FileIcon {...defaultStyles[extension]} {...styleDefObj[extension]} extension={''} />
|
||||
) : (
|
||||
<FileIcon />
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<span
|
||||
<>
|
||||
<DialogBody className="deckyFilePicker">
|
||||
<DialogControlsSection>
|
||||
<Focusable flow-children="right" style={{ display: 'flex', marginBottom: '1em' }}>
|
||||
<DialogButton
|
||||
style={{
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
minWidth: 'unset',
|
||||
width: '40px',
|
||||
borderRadius: 'unset',
|
||||
margin: '0',
|
||||
padding: '10px',
|
||||
}}
|
||||
onClick={() => {
|
||||
const newPathArr = path.split('/');
|
||||
const lastPath = newPathArr.pop();
|
||||
//If I have a single / with spaces, pop the array twice
|
||||
if (lastPath?.match(/^\/\s*$/) != null) newPathArr.pop();
|
||||
let newPath = newPathArr.join('/');
|
||||
if (newPath == '') newPath = '/';
|
||||
setPath(newPath);
|
||||
}}
|
||||
>
|
||||
<FaArrowUp />
|
||||
</DialogButton>
|
||||
<div style={{ width: '100%' }}>
|
||||
<TextField
|
||||
value={path}
|
||||
onChange={(e) => {
|
||||
e.target.value && setPath(e.target.value);
|
||||
}}
|
||||
style={{ height: '100%' }}
|
||||
/>
|
||||
</div>
|
||||
</Focusable>
|
||||
<ControlsList alignItems="center" spacing="standard">
|
||||
<ToggleField
|
||||
highlightOnFocus={false}
|
||||
label={t('FilePickerIndex.files.show_hidden')}
|
||||
bottomSeparator="none"
|
||||
checked={showHidden}
|
||||
onChange={() => setShowHidden((x) => !x)}
|
||||
/>
|
||||
<Dropdown rgOptions={sortOptions} selectedOption={sort} onChange={(x) => setSort(x.data)} />
|
||||
{validFileExtensions && (
|
||||
<DropdownMultiselect
|
||||
label={t('FilePickerIndex.files.file_type')}
|
||||
items={validExtsOptions}
|
||||
selected={selectedExts ? selectedExts : []}
|
||||
onSelect={handleExtsSelect}
|
||||
/>
|
||||
)}
|
||||
</ControlsList>
|
||||
</DialogControlsSection>
|
||||
<DialogControlsSection style={{ marginTop: '1em' }}>
|
||||
<Focusable
|
||||
style={{ display: 'flex', gap: '.25em', flexDirection: 'column', height: '60vh', overflow: 'scroll' }}
|
||||
>
|
||||
{loading && error === FileErrorTypes.None && <SteamSpinner style={{ height: '100%' }} />}
|
||||
{!loading &&
|
||||
error === FileErrorTypes.None &&
|
||||
files.map((file) => {
|
||||
const extension = file.realpath.split('.').pop() as string;
|
||||
return (
|
||||
<DialogButton
|
||||
key={`${file.realpath}${file.name}`}
|
||||
style={{ borderRadius: 'unset', margin: '0', padding: '10px' }}
|
||||
onClick={() => {
|
||||
const fullPath = `${path}${path.endsWith('/') ? '' : '/'}${file.name}`;
|
||||
if (file.isdir) setPath(fullPath);
|
||||
else {
|
||||
onSubmit({ path: fullPath, realpath: file.realpath });
|
||||
closeModal?.();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div style={{ display: 'flex', flexDirection: 'row', alignItems: 'flex-start' }}>
|
||||
{file.isdir ? (
|
||||
<FaFolder style={iconStyles} />
|
||||
) : (
|
||||
<div style={iconStyles}>
|
||||
{file.realpath.includes('.') ? (
|
||||
<FileIcon {...defaultStyles[extension]} {...styleDefObj[extension]} extension={''} />
|
||||
) : (
|
||||
<FileIcon />
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<Marquee>{file.name}</Marquee>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
textOverflow: 'ellipsis',
|
||||
overflow: 'hidden',
|
||||
display: 'flex',
|
||||
opacity: 0.5,
|
||||
fontSize: '.6em',
|
||||
textAlign: 'left',
|
||||
lineHeight: 1,
|
||||
marginTop: '.5em',
|
||||
}}
|
||||
>
|
||||
{file.name}
|
||||
</span>
|
||||
</div>
|
||||
</DialogButton>
|
||||
);
|
||||
})}
|
||||
{error}
|
||||
</Focusable>
|
||||
{!loading && !error && !includeFiles && (
|
||||
<DialogButton
|
||||
className="Primary"
|
||||
style={{ marginTop: '10px', alignSelf: 'flex-end' }}
|
||||
onClick={() => {
|
||||
onSubmit({ path, realpath: listing.realpath });
|
||||
closeModal?.();
|
||||
}}
|
||||
>
|
||||
{t('FilePickerIndex.folder.select')}
|
||||
</DialogButton>
|
||||
{file.isdir ? t('FilePickerIndex.folder.label') : filesize(file.size, { standard: 'iec' })}
|
||||
<span style={{ marginLeft: 'auto' }}>{new Date(file.modified * 1000).toLocaleString()}</span>
|
||||
</div>
|
||||
</DialogButton>
|
||||
);
|
||||
})}
|
||||
{error !== FileErrorTypes.None && <FilePickerError error={error} rawError={rawError ? rawError : ''} />}
|
||||
</Focusable>
|
||||
</DialogControlsSection>
|
||||
</DialogBody>
|
||||
{!loading && error === FileErrorTypes.None && (
|
||||
<DialogFooter>
|
||||
<DialogButton
|
||||
className="Primary"
|
||||
style={{ marginTop: '10px', alignSelf: 'flex-end' }}
|
||||
onClick={() => {
|
||||
onSubmit({ path, realpath: listing.realpath });
|
||||
closeModal?.();
|
||||
}}
|
||||
>
|
||||
{fileSelType === FileSelectionType.FILE
|
||||
? t('FilePickerIndex.file.select')
|
||||
: t('FilePickerIndex.folder.select')}
|
||||
</DialogButton>
|
||||
</DialogFooter>
|
||||
)}
|
||||
</div>
|
||||
{page * max < listing.total && (
|
||||
<DialogFooter>
|
||||
<DialogButton
|
||||
className="Primary"
|
||||
style={{ marginTop: '10px', alignSelf: 'flex-end' }}
|
||||
onClick={() => {
|
||||
setPage(page + 1);
|
||||
}}
|
||||
>
|
||||
{t('FilePickerIndex.folder.show_more')}
|
||||
</DialogButton>
|
||||
</DialogFooter>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -13,26 +13,34 @@ import { useTranslation } from 'react-i18next';
|
||||
import { FaFileArchive, FaLink, FaReact, FaSteamSymbol, FaTerminal } from 'react-icons/fa';
|
||||
|
||||
import { setShouldConnectToReactDevTools, setShowValveInternal } from '../../../../developer';
|
||||
import Logger from '../../../../logger';
|
||||
import { installFromURL } from '../../../../store';
|
||||
import { useSetting } from '../../../../utils/hooks/useSetting';
|
||||
import { getSetting } from '../../../../utils/settings';
|
||||
import { FileSelectionType } from '../../../modals/filepicker';
|
||||
import RemoteDebuggingSettings from '../general/RemoteDebugging';
|
||||
|
||||
const installFromZip = () => {
|
||||
window.DeckyPluginLoader.openFilePicker('/home/deck', true).then((val) => {
|
||||
const logger = new Logger('DeveloperIndex');
|
||||
|
||||
const installFromZip = async () => {
|
||||
const path = await getSetting<string>('user_info.user_home', '');
|
||||
if (path === '') {
|
||||
logger.error('The default path has not been found!');
|
||||
return;
|
||||
}
|
||||
window.DeckyPluginLoader.openFilePickerV2(
|
||||
FileSelectionType.FILE,
|
||||
path,
|
||||
true,
|
||||
true,
|
||||
undefined,
|
||||
['zip'],
|
||||
false,
|
||||
false,
|
||||
).then((val) => {
|
||||
const url = `file://${val.path}`;
|
||||
console.log(`Installing plugin locally from ${url}`);
|
||||
|
||||
if (url.endsWith('.zip')) {
|
||||
installFromURL(url);
|
||||
} else {
|
||||
window.DeckyPluginLoader.toaster.toast({
|
||||
//title: t('SettingsDeveloperIndex.toast_zip.title'),
|
||||
title: 'Decky',
|
||||
//body: t('SettingsDeveloperIndex.toast_zip.body'),
|
||||
body: 'Installation failed! Only ZIP files are supported.',
|
||||
onClick: installFromZip,
|
||||
});
|
||||
}
|
||||
installFromURL(url);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import { Field, Toggle } from 'decky-frontend-lib';
|
||||
import { FC } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { useDeckyState } from '../../../DeckyState';
|
||||
|
||||
const NotificationSettings: FC = () => {
|
||||
const { notificationSettings } = useDeckyState();
|
||||
const notificationService = window.DeckyPluginLoader.notificationService;
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Field label={t('SettingsGeneralIndex.notifications.decky_updates_label')}>
|
||||
<Toggle
|
||||
value={notificationSettings.deckyUpdates}
|
||||
onChange={(deckyUpdates) => {
|
||||
notificationService.update({ ...notificationSettings, deckyUpdates });
|
||||
}}
|
||||
/>
|
||||
</Field>
|
||||
<Field label={t('SettingsGeneralIndex.notifications.plugin_updates_label')}>
|
||||
<Toggle
|
||||
value={notificationSettings.pluginUpdates}
|
||||
onChange={(pluginUpdates) => {
|
||||
notificationService.update({ ...notificationSettings, pluginUpdates });
|
||||
}}
|
||||
/>
|
||||
</Field>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default NotificationSettings;
|
||||
@@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { useDeckyState } from '../../../DeckyState';
|
||||
import BranchSelect from './BranchSelect';
|
||||
import NotificationSettings from './NotificationSettings';
|
||||
import StoreSelect from './StoreSelect';
|
||||
import UpdaterSettings from './Updater';
|
||||
|
||||
@@ -27,6 +28,10 @@ export default function GeneralSettings({
|
||||
<BranchSelect />
|
||||
<StoreSelect />
|
||||
</DialogControlsSection>
|
||||
<DialogControlsSection>
|
||||
<DialogControlsSectionHeader>{t('SettingsGeneralIndex.notifications.header')}</DialogControlsSectionHeader>
|
||||
<NotificationSettings />
|
||||
</DialogControlsSection>
|
||||
<DialogControlsSection>
|
||||
<DialogControlsSectionHeader>{t('SettingsGeneralIndex.other.header')}</DialogControlsSectionHeader>
|
||||
<Field label={t('SettingsGeneralIndex.developer_mode.label')}>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { findModuleChild, sleep } from 'decky-frontend-lib';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { FaReact } from 'react-icons/fa';
|
||||
|
||||
import Logger from './logger';
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import { DeckyState } from './components/DeckyState';
|
||||
import { getSetting, setSetting } from './utils/settings';
|
||||
|
||||
export interface NotificationSettings {
|
||||
deckyUpdates: boolean;
|
||||
pluginUpdates: boolean;
|
||||
}
|
||||
|
||||
export const DEFAULT_NOTIFICATION_SETTINGS: NotificationSettings = {
|
||||
deckyUpdates: true,
|
||||
pluginUpdates: true,
|
||||
};
|
||||
|
||||
/**
|
||||
* A Service class for managing the notification settings
|
||||
*
|
||||
* It's mostly responsible for sending setting updates to the server and keeping the local state in sync.
|
||||
*/
|
||||
export class NotificationService {
|
||||
constructor(private deckyState: DeckyState) {}
|
||||
|
||||
async init() {
|
||||
const notificationSettings = await getSetting<Partial<NotificationSettings>>('notificationSettings', {});
|
||||
|
||||
// Adding a fallback to the default settings to be backwards compatible if we ever add new notification settings
|
||||
this.deckyState.setNotificationSettings({
|
||||
...DEFAULT_NOTIFICATION_SETTINGS,
|
||||
...notificationSettings,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the new notification settings to the server and persists it locally in the decky state
|
||||
*
|
||||
* @param notificationSettings The new notification settings
|
||||
*/
|
||||
async update(notificationSettings: NotificationSettings) {
|
||||
await setSetting('notificationSettings', notificationSettings);
|
||||
this.deckyState.setNotificationSettings(notificationSettings);
|
||||
}
|
||||
|
||||
/**
|
||||
* For a specific event, returns true if a notification should be shown
|
||||
*
|
||||
* @param event The notification event that should be checked
|
||||
* @returns true if the notification should be shown
|
||||
*/
|
||||
shouldNotify(event: keyof NotificationSettings) {
|
||||
return this.deckyState.publicState().notificationSettings[event];
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,9 @@ import {
|
||||
import { FC, lazy } from 'react';
|
||||
import { FaExclamationCircle, FaPlug } from 'react-icons/fa';
|
||||
|
||||
import { DeckyState, DeckyStateContextProvider, useDeckyState } from './components/DeckyState';
|
||||
import { DeckyState, DeckyStateContextProvider, UserInfo, useDeckyState } from './components/DeckyState';
|
||||
import LegacyPlugin from './components/LegacyPlugin';
|
||||
import { File, FileSelectionType } from './components/modals/filepicker';
|
||||
import { deinitFilepickerPatches, initFilepickerPatches } from './components/modals/filepicker/patches';
|
||||
import MultiplePluginsInstallModal from './components/modals/MultiplePluginsInstallModal';
|
||||
import PluginInstallModal from './components/modals/PluginInstallModal';
|
||||
@@ -23,6 +24,7 @@ import PluginView from './components/PluginView';
|
||||
import WithSuspense from './components/WithSuspense';
|
||||
import { HiddenPluginsService } from './hidden-plugins-service';
|
||||
import Logger from './logger';
|
||||
import { NotificationService } from './notification-service';
|
||||
import { InstallType, Plugin } from './plugin';
|
||||
import RouterHook from './router-hook';
|
||||
import { deinitSteamFixes, initSteamFixes } from './steamfixes';
|
||||
@@ -31,7 +33,7 @@ import TabsHook from './tabs-hook';
|
||||
import OldTabsHook from './tabs-hook.old';
|
||||
import Toaster from './toaster';
|
||||
import { VerInfo, callUpdaterMethod } from './updater';
|
||||
import { getSetting } from './utils/settings';
|
||||
import { getSetting, setSetting } from './utils/settings';
|
||||
import TranslationHelper, { TranslationClass } from './utils/TranslationHelper';
|
||||
|
||||
const StorePage = lazy(() => import('./components/store/Store'));
|
||||
@@ -46,7 +48,9 @@ class PluginLoader extends Logger {
|
||||
private routerHook: RouterHook = new RouterHook();
|
||||
public toaster: Toaster = new Toaster();
|
||||
private deckyState: DeckyState = new DeckyState();
|
||||
|
||||
public hiddenPluginsService = new HiddenPluginsService(this.deckyState);
|
||||
public notificationService = new NotificationService(this.deckyState);
|
||||
|
||||
private reloadLock: boolean = false;
|
||||
// stores a list of plugin names which requested to be reloaded
|
||||
@@ -99,9 +103,17 @@ class PluginLoader extends Logger {
|
||||
|
||||
initFilepickerPatches();
|
||||
|
||||
this.getUserInfo();
|
||||
|
||||
this.updateVersion();
|
||||
}
|
||||
|
||||
public async getUserInfo() {
|
||||
const userInfo = (await this.callServerMethod('get_user_info')).result as UserInfo;
|
||||
setSetting('user_info.user_name', userInfo.username);
|
||||
setSetting('user_info.user_home', userInfo.path);
|
||||
}
|
||||
|
||||
public async updateVersion() {
|
||||
const versionInfo = (await callUpdaterMethod('get_version')).result as VerInfo;
|
||||
this.deckyState.setVersionInfo(versionInfo);
|
||||
@@ -112,18 +124,20 @@ class PluginLoader extends Logger {
|
||||
public async notifyUpdates() {
|
||||
const versionInfo = await this.updateVersion();
|
||||
if (versionInfo?.remote && versionInfo?.remote?.tag_name != versionInfo?.current) {
|
||||
this.toaster.toast({
|
||||
title: <TranslationHelper trans_class={TranslationClass.PLUGIN_LOADER} trans_text="decky_title" />,
|
||||
body: (
|
||||
<TranslationHelper
|
||||
trans_class={TranslationClass.PLUGIN_LOADER}
|
||||
trans_text="decky_update_available"
|
||||
i18n_args={{ tag_name: versionInfo?.remote?.tag_name }}
|
||||
/>
|
||||
),
|
||||
onClick: () => Router.Navigate('/decky/settings'),
|
||||
});
|
||||
this.deckyState.setHasLoaderUpdate(true);
|
||||
if (this.notificationService.shouldNotify('deckyUpdates')) {
|
||||
this.toaster.toast({
|
||||
title: <TranslationHelper trans_class={TranslationClass.PLUGIN_LOADER} trans_text="decky_title" />,
|
||||
body: (
|
||||
<TranslationHelper
|
||||
trans_class={TranslationClass.PLUGIN_LOADER}
|
||||
trans_text="decky_update_available"
|
||||
i18n_args={{ tag_name: versionInfo?.remote?.tag_name }}
|
||||
/>
|
||||
),
|
||||
onClick: () => Router.Navigate('/decky/settings'),
|
||||
});
|
||||
}
|
||||
}
|
||||
await sleep(7000);
|
||||
await this.notifyPluginUpdates();
|
||||
@@ -137,7 +151,7 @@ class PluginLoader extends Logger {
|
||||
|
||||
public async notifyPluginUpdates() {
|
||||
const updates = await this.checkPluginUpdates();
|
||||
if (updates?.size > 0) {
|
||||
if (updates?.size > 0 && this.notificationService.shouldNotify('pluginUpdates')) {
|
||||
this.toaster.toast({
|
||||
title: <TranslationHelper trans_class={TranslationClass.PLUGIN_LOADER} trans_text="decky_title" />,
|
||||
body: (
|
||||
@@ -211,6 +225,7 @@ class PluginLoader extends Logger {
|
||||
});
|
||||
|
||||
this.hiddenPluginsService.init();
|
||||
this.notificationService.init();
|
||||
}
|
||||
|
||||
public deinit() {
|
||||
@@ -268,6 +283,7 @@ class PluginLoader extends Logger {
|
||||
Authentication: window.deckyAuthToken,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.ok) {
|
||||
try {
|
||||
let plugin_export = await eval(await res.text());
|
||||
@@ -351,8 +367,26 @@ class PluginLoader extends Logger {
|
||||
|
||||
openFilePicker(
|
||||
startPath: string,
|
||||
includeFiles?: boolean,
|
||||
selectFiles?: boolean,
|
||||
regex?: RegExp,
|
||||
): Promise<{ path: string; realpath: string }> {
|
||||
if (selectFiles) {
|
||||
return this.openFilePickerV2(FileSelectionType.FILE, startPath, true, true, regex);
|
||||
} else {
|
||||
return this.openFilePickerV2(FileSelectionType.FOLDER, startPath, false, true, regex);
|
||||
}
|
||||
}
|
||||
|
||||
openFilePickerV2(
|
||||
select: FileSelectionType,
|
||||
startPath: string,
|
||||
includeFiles?: boolean,
|
||||
includeFolders?: boolean,
|
||||
filter?: RegExp | ((file: File) => boolean),
|
||||
extensions?: string[],
|
||||
showHiddenFiles?: boolean,
|
||||
allowAllFiles?: boolean,
|
||||
max?: number,
|
||||
): Promise<{ path: string; realpath: string }> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const Content = ({ closeModal }: { closeModal?: () => void }) => (
|
||||
@@ -367,9 +401,15 @@ class PluginLoader extends Logger {
|
||||
<FilePicker
|
||||
startPath={startPath}
|
||||
includeFiles={includeFiles}
|
||||
regex={regex}
|
||||
includeFolders={includeFolders}
|
||||
filter={filter}
|
||||
validFileExtensions={extensions}
|
||||
allowAllFiles={allowAllFiles}
|
||||
defaultHidden={showHiddenFiles}
|
||||
onSubmit={resolve}
|
||||
closeModal={closeModal}
|
||||
fileSelType={select}
|
||||
max={max}
|
||||
/>
|
||||
</WithSuspense>
|
||||
</ModalRoot>
|
||||
@@ -384,6 +424,7 @@ class PluginLoader extends Logger {
|
||||
toaster: this.toaster,
|
||||
callServerMethod: this.callServerMethod,
|
||||
openFilePicker: this.openFilePicker,
|
||||
openFilePickerV2: this.openFilePickerV2,
|
||||
async callPluginMethod(methodName: string, args = {}) {
|
||||
const response = await fetch(`http://127.0.0.1:1337/plugins/${pluginName}/methods/${methodName}`, {
|
||||
method: 'POST',
|
||||
|
||||
@@ -128,7 +128,13 @@ class TabsHook extends Logger {
|
||||
let deckyTabAmount = existingTabs.reduce((prev: any, cur: any) => (cur.decky ? prev + 1 : prev), 0);
|
||||
if (deckyTabAmount == this.tabs.length) {
|
||||
for (let tab of existingTabs) {
|
||||
if (tab?.decky && tab?.qAMVisibilitySetter) tab?.qAMVisibilitySetter(visible);
|
||||
if (tab?.decky) {
|
||||
if (tab?.qAMVisibilitySetter) {
|
||||
tab?.qAMVisibilitySetter(visible);
|
||||
} else {
|
||||
tab.initialVisibility = visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -138,12 +144,9 @@ class TabsHook extends Logger {
|
||||
title,
|
||||
tab: icon,
|
||||
decky: true,
|
||||
initialVisibility: visible,
|
||||
};
|
||||
tab.panel = (
|
||||
<QuickAccessVisibleStateProvider initial={visible} tab={tab}>
|
||||
{content}
|
||||
</QuickAccessVisibleStateProvider>
|
||||
);
|
||||
tab.panel = <QuickAccessVisibleStateProvider tab={tab}>{content}</QuickAccessVisibleStateProvider>;
|
||||
existingTabs.push(tab);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user