Compare commits

..

6 Commits

Author SHA1 Message Date
TrainDoctor 543ee3d19e Fixed up remote binary logging, download process and old incorrect error 2025-02-08 17:30:09 -08:00
WerWolvTranslationBot 654957cb0c Translations update from Weblate (#737)
* Added translation using Weblate (Georgian)

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/

* Translated using Weblate (Polish)

Currently translated at 100.0% (175 of 175 strings)

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/pl/

* Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (175 of 175 strings)

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/pt_PT/

* Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (175 of 175 strings)

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/pt_PT/

* Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (175 of 175 strings)

Translation: Decky/Decky
Translate-URL: https://weblate.werwolv.net/projects/decky/decky/pt_PT/

---------

Co-authored-by: NorwayFun <temuri.doghonadze@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Gadzio742 <daniel.123737@gmail.com>
Co-authored-by: hyperscrawl <design.pedrofirmino@gmail.com>
Co-authored-by: Fábio Oliveira <fabio.an.oliveira@gmail.com>
Co-authored-by: hyperscrawl <hyperscrawl@users.noreply.weblate.werwolv.net>
2025-02-08 14:41:19 -08:00
TrainDoctor 11e5236fa3 Removed unused import and improved log 2025-02-08 14:33:20 -08:00
TrainDoctor c1dd1c7296 White-space formatting is one of the most incomprehensible decisions... 2025-02-08 14:23:07 -08:00
xXJSONDeruloXx 310dd700ac fix: adtl remote binary error handling
(cherry picked from commit 860b1ac835)
2025-02-08 12:32:27 -08:00
Adrian Covaci 0c727d64d2 chore(flake): Add setuptools in order to build on a minimal Nix system (#741) 2025-01-17 21:52:50 +00:00
7 changed files with 177 additions and 122 deletions
+12 -7
View File
@@ -75,6 +75,8 @@ class PluginBrowser:
packageJsonPath = path.join(pluginBasePath, 'package.json')
pluginBinPath = path.join(pluginBasePath, 'bin')
logger.debug(f"Checking package.json at {packageJsonPath}")
if access(packageJsonPath, R_OK):
with open(packageJsonPath, "r", encoding="utf-8") as f:
packageJson = json.load(f)
@@ -83,6 +85,7 @@ class PluginBrowser:
chmod(pluginBasePath, 777)
if access(pluginBasePath, W_OK):
if not path.exists(pluginBinPath):
logger.debug(f"Creating bin directory at {pluginBinPath}")
mkdir(pluginBinPath)
if not access(pluginBinPath, W_OK):
chmod(pluginBinPath, 777)
@@ -93,6 +96,7 @@ class PluginBrowser:
binName = remoteBinary["name"]
binURL = remoteBinary["url"]
binHash = remoteBinary["sha256hash"]
logger.info(f"Attempting to download {binName} from {binURL}")
if not await download_remote_binary_to_path(binURL, binHash, path.join(pluginBinPath, binName)):
rv = False
raise Exception(f"Error Downloading Remote Binary {binName}@{binURL} with hash {binHash} to {path.join(pluginBinPath, binName)}")
@@ -101,7 +105,7 @@ class PluginBrowser:
chmod(pluginBasePath, 555)
else:
rv = True
logger.debug(f"No Remote Binaries to Download")
logger.info(f"No Remote Binaries to Download")
except Exception as e:
rv = False
@@ -196,7 +200,7 @@ class PluginBrowser:
else:
logger.fatal(f"Could not fetch from URL. {await res.text()}")
await self.loader.ws.emit("loader/plugin_download_info", 80, "Store.download_progress_info.increment_count")
await self.loader.ws.emit("loader/plugin_download_info", 70, "Store.download_progress_info.increment_count")
storeUrl = ""
match self.settings.getSetting("store", 0):
case 0: storeUrl = "https://plugins.deckbrew.xyz/plugins" # default
@@ -209,7 +213,7 @@ class PluginBrowser:
if res.status != 200:
logger.error(f"Server did not accept install count increment request. code: {res.status}")
await self.loader.ws.emit("loader/plugin_download_info", 85, "Store.download_progress_info.parse_zip")
await self.loader.ws.emit("loader/plugin_download_info", 75, "Store.download_progress_info.parse_zip")
if res_zip and version == "dev":
with ZipFile(res_zip) as plugin_zip:
plugin_json_list = [file for file in plugin_zip.namelist() if file.endswith("/plugin.json") and file.count("/") == 1]
@@ -244,7 +248,7 @@ class PluginBrowser:
# If plugin is installed, uninstall it
if isInstalled:
await self.loader.ws.emit("loader/plugin_download_info", 90, "Store.download_progress_info.uninstalling_previous")
await self.loader.ws.emit("loader/plugin_download_info", 80, "Store.download_progress_info.uninstalling_previous")
try:
logger.debug("Uninstalling existing plugin...")
await self.uninstall_plugin(name)
@@ -252,7 +256,7 @@ class PluginBrowser:
logger.error(f"Plugin {name} could not be uninstalled.")
await self.loader.ws.emit("loader/plugin_download_info", 95, "Store.download_progress_info.installing_plugin")
await self.loader.ws.emit("loader/plugin_download_info", 90, "Store.download_progress_info.installing_plugin")
# Install the plugin
logger.debug("Unzipping...")
ret = self._unzip_to_plugin_dir(res_zip, name, hash)
@@ -260,7 +264,7 @@ class PluginBrowser:
plugin_folder = self.find_plugin_folder(name)
assert plugin_folder is not None
plugin_dir = path.join(self.plugin_path, plugin_folder)
#TODO count again from 0% to 100% quickly for this one if it does anything
await self.loader.ws.emit("loader/plugin_download_info", 95, "Store.download_progress_info.download_remote")
ret = await self._download_remote_binaries_for_plugin_with_name(plugin_dir)
if ret:
logger.info(f"Installed {name} (Version: {version})")
@@ -275,7 +279,8 @@ class PluginBrowser:
logger.debug("Plugin %s was added to the pluginOrder setting", name)
await self.loader.import_plugin(path.join(plugin_dir, "main.py"), plugin_folder)
else:
logger.fatal(f"Failed Downloading Remote Binaries")
logger.error("Could not download remote binaries")
return
else:
logger.fatal(f"SHA-256 Mismatch!!!! {name} (Version: {version})")
if self.loader.watcher:
+13 -13
View File
@@ -4,7 +4,6 @@ import uuid
import os
import subprocess
from hashlib import sha256
from io import BytesIO
import importlib.metadata
import certifi
@@ -112,19 +111,20 @@ async def download_remote_binary_to_path(url: str, binHash: str, path: str) -> b
if os.access(os.path.dirname(path), os.W_OK):
async with ClientSession() as client:
res = await client.get(url, ssl=get_ssl_context())
if res.status == 200:
data = BytesIO(await res.read())
remoteHash = sha256(data.getbuffer()).hexdigest()
if binHash == remoteHash:
data.seek(0)
with open(path, 'wb') as f:
f.write(data.getbuffer())
rv = True
if res.status == 200:
logger.debug("Download attempt of URL: " + url)
data = await res.read()
remoteHash = sha256(data).hexdigest()
if binHash == remoteHash:
with open(path, 'wb') as f:
f.write(data)
rv = True
else:
raise Exception(f"Fatal Error: Hash Mismatch for remote binary {path}@{url}")
else:
raise Exception(f"Fatal Error: Hash Mismatch for remote binary {path}@{url}")
else:
rv = False
except:
rv = False
except Exception as e:
logger.error("Error during download " + str(e))
rv = False
return rv
+1
View File
@@ -223,6 +223,7 @@
"Store": {
"download_progress_info": {
"download_zip": "Downloading plugin",
"download_remote": "Downloading any external binaries",
"increment_count": "Incrementing download count",
"installing_plugin": "Installing plugin",
"open_zip": "Opening zip file",
+1
View File
@@ -0,0 +1 @@
{}
+20 -7
View File
@@ -26,7 +26,7 @@
},
"FilePickerIndex": {
"file": {
"select": "Wybierz ten plik"
"select": "Zaznacz ten plik"
},
"files": {
"all_files": "Wszystkie pliki",
@@ -96,9 +96,9 @@
"title": "Reinstaluj {{artifact}}"
},
"update": {
"button_idle": "Aktualizacja",
"button_idle": "Aktualizuj",
"button_processing": "Aktualizowanie",
"desc": "Czy na pewno chcesz zaktualizować {{artifact}} {{version}}?",
"desc": "Czy na pewno chcesz zaktualizować {{artifact}} do wersji {{version}}?",
"title": "Zaktualizuj {{artifact}}"
}
},
@@ -122,11 +122,11 @@
},
"PluginLoader": {
"decky_title": "Decky",
"decky_update_available": "Dostępna aktualizacja do {{tag_name}}!",
"decky_update_available": "Aktualizacja do {{tag_name}} jest dostępna!",
"error": "Błąd",
"plugin_error_uninstall": "Ładowanie {{name}} spowodowało wyjątek, jak pokazano powyżej. Zwykle oznacza to, że plugin wymaga aktualizacji do nowej wersji SteamUI. Sprawdź, czy aktualizacja jest obecna lub rozważ usunięcie go w ustawieniach Decky, w sekcji Pluginy.",
"plugin_load_error": {
"message": "Błąd ładowania plugin {{name}}",
"message": "Błąd ładowania pluginu {{name}}",
"toast": "Błąd ładowania {{name}}"
},
"plugin_uninstall": {
@@ -205,6 +205,15 @@
"testing_title": "Testowanie"
},
"Store": {
"download_progress_info": {
"download_zip": "Pobieranie pluginu",
"increment_count": "Zwiększanie liczby pobrań",
"installing_plugin": "Instalowanie pluginu",
"open_zip": "Otwieranie pliku zip",
"parse_zip": "Analizowanie pliku zip",
"start": "Inicjalizacja",
"uninstalling_previous": "Odinstalowywanie poprzednich kopii"
},
"store_contrib": {
"desc": "Jeśli chcesz przyczynić się do rozwoju Decky Plugin Store, sprawdź repozytorium SteamDeckHomebrew/decky-plugin-template na GitHub. Informacje na temat rozwoju i dystrybucji są dostępne w pliku README.",
"label": "Współtworzenie"
@@ -236,7 +245,7 @@
},
"store_testing_cta": "Rozważ przetestowanie nowych pluginów, aby pomóc zespołowi Decky Loader!",
"store_testing_warning": {
"desc": "Możesz użyć tego kanału sklepu do testowania najnowszych wersji pluginów. Pamiętaj, aby zostawić opinię na GitHub, aby plugin moa zostać zaktualizowana dla wszystkich użytkowników.",
"desc": "Możesz użyć tego kanału sklepu do testowania najnowszych wersji pluginów. Pamiętaj, aby zostawić opinię na GitHub, aby plugin mógł zostać zaktualizowany dla wszystkich użytkowników.",
"label": "Witamy w Testowym Kanale Sklepu"
}
},
@@ -253,7 +262,11 @@
}
},
"Testing": {
"download": "Pobierz"
"download": "Pobierz",
"error": "Błąd instalowania PR",
"header": "Następujące wersje Decky Loader są zrobione z open third-party Pull Requests. Zespół Decky Loader nie zweryfikował ich działania czy bezpieczeństwa, mogą też być nie aktualne.",
"loading": "Ładowanie open Pull Requests...",
"start_download_toast": "Pobieranie PR #{{id}}"
},
"TitleView": {
"decky_store_desc": "Otwórz sklep Decky",
+80 -57
View File
@@ -1,16 +1,16 @@
{
"BranchSelect": {
"update_channel": {
"label": "Canal de actualização",
"label": "Canal de atualização",
"prerelease": "Pré-lançamento",
"stable": "Estável",
"testing": "Em teste"
"testing": "Em testes"
}
},
"Developer": {
"5secreload": "Vai recarregar em 5 segundos",
"disabling": "Desactivando React DevTools",
"enabling": "Activando React DevTools"
"5secreload": "A recarregar em 5 segundos",
"disabling": "Desativar React DevTools",
"enabling": "Ativar React DevTools"
},
"DropdownMultiselect": {
"button": {
@@ -19,9 +19,9 @@
},
"FilePickerError": {
"errors": {
"file_not_found": "O caminho especificado não é válido. Por favor, verifique e insira-o corretamente.",
"perm_denied": "Não tem acesso ao diretório especificado. Por favor, verifique se o seu utilizador (deck na Steam Deck) possui as permissões correspondentes para aceder à pasta/ficheiro especificado.",
"unknown": "Ocorreu um erro desconhecido. O erro é: {{raw_error}}"
"file_not_found": "O caminho especificado não é válido. Por favor, verifica e insere o caminho correto.",
"perm_denied": "Não tens acesso ao diretório especificado. Por favor, verifica se o seu utilizador (deck na Steam Deck) tem a permissão correspondente para aceder à pasta/ficheiro especificada(o).",
"unknown": "Ocorreu um erro desconhecido. O erro bruto é: {{raw_error}}"
}
},
"FilePickerIndex": {
@@ -50,11 +50,11 @@
}
},
"MultiplePluginsInstallModal": {
"confirm": "De certeza que queres fazer as seguintes alterações?",
"confirm": "Tens a certeza de que pretendes fazer as seguintes alterações?",
"description": {
"install": "Instalar {{name}} {{version}}",
"reinstall": "Reinstalar {{name}} {{version}}",
"update": "Actualizar {{name}} para {{version}}"
"update": "Atualizar {{name}} para {{version}}"
},
"ok_button": {
"idle": "Confirmar",
@@ -70,15 +70,15 @@
"reinstall_many": "Reinstalar {{count}} plugins",
"reinstall_one": "Reinstalar 1 plugin",
"reinstall_other": "Reinstalar {{count}} plugins",
"update_many": "Actualizar {{count}} plugins",
"update_one": "Actualizar 1 plugin",
"update_other": "Actualizar {{count}} plugins"
"update_many": "Atualizar {{count}} plugins",
"update_one": "Atualizar 1 plugin",
"update_other": "Atualizar {{count}} plugins"
}
},
"PluginCard": {
"plugin_full_access": "Este plugin tem acesso total à tua Steam Deck.",
"plugin_full_access": "Este plugin tem acesso total ao teu Steam Deck.",
"plugin_install": "Instalar",
"plugin_no_desc": "Não tem descrição.",
"plugin_no_desc": "Sem descrição fornecida.",
"plugin_version_label": "Versão do plugin"
},
"PluginInstallModal": {
@@ -88,7 +88,7 @@
"desc": "De certeza que queres instalar {{artifact}} {{version}}?",
"title": "Instalar {{artifact}}"
},
"no_hash": "Este plugin não tem um hash, estás a instalá-lo por tua conta e risco.",
"no_hash": "Este plugin não tem uma hash, estás a instalá-lo por tua conta e risco.",
"reinstall": {
"button_idle": "Reinstalar",
"button_processing": "Reinstalação em curso",
@@ -96,24 +96,26 @@
"title": "Reinstalar {{artifact}}"
},
"update": {
"button_idle": "Actualizar",
"button_processing": "Actualização em curso",
"desc": "De certeza que queres actualizar {{artifact}} {{version}}?",
"title": "Actualizar {{artifact}}"
"button_idle": "Atualizar",
"button_processing": "Atualização em curso",
"desc": "De certeza que queres atualizar {{artifact}} {{version}}?",
"title": "Atualizar {{artifact}}"
}
},
"PluginListIndex": {
"freeze": "Congelar atualizações",
"hide": "Acesso rápido: Ocultar",
"no_plugin": "Nenhum plugin instalado!",
"plugin_actions": "Operações de plugin",
"reinstall": "Reinstalar",
"reload": "Recarregar",
"show": "Acesso rápido: Mostrar",
"unfreeze": "Permitir atualizações",
"uninstall": "Desinstalar",
"update_all_many": "Actualizar {{count}} plugins",
"update_all_one": "Actualizar 1 plugin",
"update_all_other": "Actualizar {{count}} plugins",
"update_to": "Actualizar para {{name}}"
"update_all_many": "Atualizar {{count}} plugins",
"update_all_one": "Atualizar 1 plugin",
"update_all_other": "Atualizar {{count}} plugins",
"update_to": "Atualizar para {{name}}"
},
"PluginListLabel": {
"hidden": "Oculto do menu de acesso rápido"
@@ -122,7 +124,7 @@
"decky_title": "Decky",
"decky_update_available": "Está disponível uma nova versão de {{tag_name}} !",
"error": "Erro",
"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.",
"plugin_error_uninstall": "Ao carregar {{name}}, ocorreu uma exceção, como pode ser verificado acima. Pode ter sido porque o plugin requer a última versão do SteamUI. Verifica se há uma atualização disponível ou desinstala o plugin nas definições do Decky.",
"plugin_load_error": {
"message": "Erro ao carregar o plugin {{name}}",
"toast": "Erro ao carregar {{name}}"
@@ -133,7 +135,7 @@
"title": "Desinstalar {{name}}"
},
"plugin_update_many": "{{count}} plugins têm actualizações disponíveis!",
"plugin_update_one": "1 plugin tem actualizações disponíveis!",
"plugin_update_one": "1 plugin tem atualizações disponíveis!",
"plugin_update_other": "{{count}} plugins têm actualizações disponíveis!"
},
"PluginView": {
@@ -143,34 +145,34 @@
},
"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"
"desc": "Permitir acesso não autenticado ao depurador do CEF a qualquer pessoa na tua rede",
"label": "Permitir Depuração Remota do CEF"
}
},
"SettingsDeveloperIndex": {
"cef_console": {
"button": "Abrir consola",
"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.",
"desc": "Abre a Consola CEF. Apenas útil para fins de depuração. O conteúdo aqui presente pode ser perigoso e só devem ser usadas se fores um desenvolvedor de plugins ou se fores direcionado para aqui por um.",
"label": "Consola CEF"
},
"header": "Outros",
"react_devtools": {
"desc": "Permite a coneã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.",
"desc": "Permite a conexão a um computador a correr o React DevTools. Alterar esta definição irá recarregar o Steam. Define o endereço IP antes de ativar.",
"ip_label": "IP",
"label": "Activar React DevTools"
"label": "Ativar 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"
"label_desc": "URL",
"label_url": "Instalar plugin a partir de um URL",
"label_zip": "Instalar plugin a partir de um ficheiro ZIP"
},
"valve_internal": {
"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.",
"label": "Activar menu interno da Valve"
"desc1": "Ativa o menu interno de programador da Valve.",
"desc2": "Não toques em nada neste menu, a menos que saibas o que faz.",
"label": "Cativar menu interno da Valve"
}
},
"SettingsGeneralIndex": {
@@ -193,17 +195,27 @@
"header": "Outros"
},
"updates": {
"header": "Actualizações"
"header": "Atualizações"
}
},
"SettingsIndex": {
"developer_title": "Programador",
"general_title": "Geral",
"plugins_title": "Plugins"
"plugins_title": "Plugins",
"testing_title": "Testes"
},
"Store": {
"download_progress_info": {
"download_zip": "A transferir o plugin",
"increment_count": "A incrementar a contagem de transferências",
"installing_plugin": "A instalar o plugin",
"open_zip": "A abrir o ficheiro zip",
"parse_zip": "A processar o ficheiro zip",
"start": "A inicializar",
"uninstalling_previous": "A desinstalar a cópia anterior"
},
"store_contrib": {
"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.",
"desc": "Se quiseres contribuir para a Loja de Plugins do Decky, consulta o repositório SteamDeckHomebrew/decky-plugin-template no GitHub. Encontras informações sobre desenvolvimento e distribuição no README.",
"label": "Contribuir"
},
"store_filter": {
@@ -215,21 +227,25 @@
},
"store_sort": {
"label": "Ordenar",
"label_def": "Última actualização (mais recente)"
"label_def": "Última atualização (mais recente)"
},
"store_source": {
"desc": "O código fonte de cada plugin está disponível no repositório SteamDeckHomebrew/decky-plugin-database no GitHub.",
"desc": "Todo o código-fonte dos plugins está disponível no repositório SteamDeckHomebrew/decky-plugin-database no GitHub.",
"label": "Código fonte"
},
"store_tabs": {
"about": "Sobre",
"alph_asce": "Alfabeticamente (Z-A)",
"alph_desc": "Alfabeticamente (A-Z)",
"date_asce": "Mais Antigos Primeiro",
"date_desc": "Mais Recentes Primeiro",
"downloads_asce": "Menos Transferidos Primeiro",
"downloads_desc": "Mais Transferidos Primeiro",
"title": "Navegar"
},
"store_testing_cta": "Testa novos plugins e ajuda a equipa do Decky Loader!",
"store_testing_warning": {
"desc": "Pode usar esta versão da loja para testar versões experimentais de plugins. Certifique-se de deixar feedback no GitHub para que o plugin possa ser atualizado para todos os utilizadores.",
"desc": "Podes utilizar este canal da loja para testar versões de plugins de última geração. Não te esqueças de deixar o teufeedback no GitHub para que o plugin possa ser atualizado para todos os utilizadores.",
"label": "Bem-vindo ao Canal de Testes da Loja"
}
},
@@ -240,28 +256,35 @@
},
"store_channel": {
"custom": "Personalizada",
"default": "Standard",
"label": "Canal de loja",
"testing": "Em teste"
"default": "Padrão",
"label": "Canal da loja",
"testing": "Em testes"
}
},
"Testing": {
"download": "Transferir",
"error": "Erro ao instalar PR",
"header": "As seguintes versões do Decky Loader estão construidas a partir de Pull Requests de terceiros. A equipa do Decky Loader não verificou as sua funcionalidade ou segurança e as mesmas podem estar desatualizados.",
"loading": "A carregar Pull Requests abertos...",
"start_download_toast": "A descarregar PR #{{id}}"
},
"TitleView": {
"decky_store_desc": "Abrir a Loja Decky",
"settings_desc": "Abrir as Definições Decky"
},
"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",
"decky_updates": "Atualizações do Decky",
"no_patch_notes_desc": "sem notas de atualizações para esta versão",
"patch_notes_desc": "Notas de atualizações",
"updates": {
"check_button": "Procurar actualizações",
"checking": "Busca de actualizações em curso",
"cur_version": "Versão actual: {{ver}}",
"install_button": "Instalar actualização",
"label": "Actualizações",
"lat_version": "Actualizado: a correr {{ver}}",
"reloading": "Recarregar",
"updating": "Actualização em curso"
"check_button": "Procurar atualizações",
"checking": "A verificar atualizações",
"cur_version": "Versão atual: {{ver}}",
"install_button": "Instalar Atualização",
"label": "Atualizações",
"lat_version": "Atualizado: a executar {{ver}}",
"reloading": "Recarregando",
"updating": "Atualização em curso"
}
}
}
+50 -38
View File
@@ -11,45 +11,57 @@
};
};
outputs = { self, nixpkgs, flake-utils, poetry2nix }:
flake-utils.lib.eachDefaultSystem (system:
outputs =
{
self,
nixpkgs,
flake-utils,
poetry2nix,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs { inherit system; };
p2n = (poetry2nix.lib.mkPoetry2Nix { inherit pkgs; });
in {
devShells.default = (p2n.mkPoetryEnv {
projectDir = self + "/backend";
# pyinstaller fails to compile so precompiled it is
overrides = p2n.overrides.withDefaults (final: prev: {
pyinstaller = prev.pyinstaller.override { preferWheel = true; };
pyright = null;
});
}).env.overrideAttrs (oldAttrs: {
shellHook = ''
PYTHONPATH=`which python`
FILE=.vscode/settings.json
if [ -f "$FILE" ]; then
jq --arg pythonpath "$PYTHONPATH" '.["python.defaultInterpreterPath"] = $pythonpath' $FILE > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
else
echo "{\"python.defaultInterpreterPath\": \"$PYTHONPATH\"}" > "$FILE"
fi
'';
UV_USE_IO_URING = 0; # work around node#48444
buildInputs = with pkgs; [
nodejs_22
nodePackages.pnpm
poetry
jq
# fixes local pyright not being able to see the pythonpath properly.
(pkgs.writeShellScriptBin "pyright" ''
${pkgs.pyright}/bin/pyright --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-langserver" ''
${pkgs.pyright}/bin/pyright-langserver --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-python" ''
${pkgs.pyright}/bin/pyright-python --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-python-langserver" ''
${pkgs.pyright}/bin/pyright-python-langserver --pythonpath `which python3` "$@" '')
];
});
});
in
{
devShells.default =
(p2n.mkPoetryEnv {
projectDir = self + "/backend";
# pyinstaller fails to compile so precompiled it is
overrides = p2n.overrides.withDefaults (
final: prev: {
pyinstaller = prev.pyinstaller.override { preferWheel = true; };
pyright = null;
}
);
}).env.overrideAttrs
(oldAttrs: {
shellHook = ''
PYTHONPATH=`which python`
FILE=.vscode/settings.json
if [ -f "$FILE" ]; then
jq --arg pythonpath "$PYTHONPATH" '.["python.defaultInterpreterPath"] = $pythonpath' $FILE > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
else
echo "{\"python.defaultInterpreterPath\": \"$PYTHONPATH\"}" > "$FILE"
fi
'';
UV_USE_IO_URING = 0; # work around node#48444
nativeBuildInputs = with pkgs; [
python311Packages.setuptools
];
buildInputs = with pkgs; [
nodejs_22
nodePackages.pnpm
poetry
jq
# fixes local pyright not being able to see the pythonpath properly.
(pkgs.writeShellScriptBin "pyright" ''${pkgs.pyright}/bin/pyright --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-langserver" ''${pkgs.pyright}/bin/pyright-langserver --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-python" ''${pkgs.pyright}/bin/pyright-python --pythonpath `which python3` "$@" '')
(pkgs.writeShellScriptBin "pyright-python-langserver" ''${pkgs.pyright}/bin/pyright-python-langserver --pythonpath `which python3` "$@" '')
];
});
}
);
}