diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b55b280e..85a7fe1f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,10 @@ jobs: - name: Build Linux if: matrix.os == 'ubuntu-latest' - run: yarn build:linux + run: | + sudo apt-get update + sudo apt-get install -y libarchive-tools + yarn build:linux env: MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -65,3 +68,4 @@ jobs: dist/*.tar.gz dist/*.yml dist/*.blockmap + dist/*.pacman diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d1bc8993..e21acfcb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,10 @@ jobs: - name: Build Linux if: matrix.os == 'ubuntu-latest' - run: yarn build:linux + run: | + sudo apt-get update + sudo apt-get install -y libarchive-tools + yarn build:linux env: MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -68,5 +71,6 @@ jobs: dist/*.tar.gz dist/*.yml dist/*.blockmap + dist/*.pacman env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.be.md b/README.be.md index 806e45cc..5dfadf5d 100644 --- a/README.be.md +++ b/README.be.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent і самастойным scraper`ам для рэпакаў.

@@ -20,6 +20,8 @@ [![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,11 +29,12 @@ ## Змест +- [Змест](#змест) - [Апісанне](#апісанне) - [Асаблівасці](#асаблівасці) - [Усталёўка](#усталёўка) -- [Уклад](#contributing) - - [Далучайцеся да нашага Telegram](#join-our-telegram) +- [Уклад](#-уклад) + - [Далучайцеся да нашага Telegram](#-далучайцеся-да-нашага-telegram) - [Форк і кланаванне рэпазітара](#форк-і-кланаванне-рэпазітара) - [Спосабы ўнесці свой уклад](#спосабы-ўнесці-свой-уклад) - [Структура праекту](#структура-праекту) @@ -47,6 +50,7 @@ - [Зборка кліента BitTorrent](#зборка-кліента-bittorrent) - [Зборка прыкладання Electron](#зборка-прыкладання-electron) - [Удзельнікі](#удзельнікі) +- [Ліцэнзія](#ліцэнзія) ## Апісанне diff --git a/README.de.md b/README.de.md new file mode 100644 index 00000000..bd8c1b71 --- /dev/null +++ b/README.de.md @@ -0,0 +1,182 @@ +
+ +
+ +[](https://hydralauncher.site) + +

Hydra Launcher

+ +

+ Hydra ist ein Launcher für Spiele mit einem eigenen eingebetteten BitTorrent-Client. +

+ +[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) +[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) + +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) +[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) +[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) +[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![es](https://img.shields.io/badge/lang-es-red)](README.es.md) +[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) + +![Hydra Katalog](./docs/screenshot.png) + +
+ +## Inhaltsverzeichnis + +- [Über Hydra](#über-hydra) +- [Eigenschaften](#eigenschaften) +- [Installation](#installation) +- [Mitwirken](#mitwirken) + - [Tritt uns auf Telegram bei](#tritt-uns-auf-telegram-bei) + - [Forke und klone dein Repo](#forke-und-klone-dein-repo) + - [Wie du mitwirken kannst](#wie-du-mitwirken-kannst) + - [Projektstruktur](#projektstruktur) +- [Den Quellcode kompilieren](#den-quellcode-kompilieren) + - [Installiere Node.js](#installiere-nodejs) + - [Installiere Yarn](#installiere-yarn) + - [Installiere Node-Abhängigkeiten](#installiere-node-abhängigkeiten) + - [Installiere Python 3.9](#installiere-python-39) + - [Installiere Python-Abhängigkeiten](#installiere-python-abhängigkeiten) +- [Umgebungsvariablen](#umgebungsvariablen) +- [Ausführung](#ausführung) +- [Kompilation](#kompilation) + - [Kompiliere den BitTorrent-Client](#kompiliere-den-bittorrent-client) + - [Kompiliere die Electron-Applikation](#kompiliere-die-electron-applikation) +- [Mitwirkende](#mitwirkende) + +## Über Hydra + +**Hydra** ist ein **Launcher für Spiele** mit einem eigenen eingebetteten **BitTorrent-Client**. +
+Der Launcher ist in TypeScript (Electron) und Python, womit das Torrentingsystem durch Einsatz von libtorrent geregelt ist, geschrieben. + +## Eigenschaften + +- Eigener eingebetteter BitTorrent-Client +- How Long to Beat (HLTB) Integration auf der Spielseite +- Anpassbarkeit des Downloadverzeichnisses +- Unterstützung von Windows und Linux +- Regelmäßig aktualisiert +- Und mehr ... + +## Installation + +Die folgenden Schritte beschreiben den Installationsprozess: + +1. Lade die neueste Version von Hydra von der [Releases](https://github.com/hydralauncher/hydra/releases/latest) Seite herunter. + - Für die Installation von Hydra auf Windows, wähle die .exe Datei. + - Für die Installation von Hydra auf Linux, wähle die .deb, .rpm oder .zip Datei. (Abhängig von deiner Linux-Distribution) +2. Führe die heruntergeladene Datei aus. +3. Genieße Hydra! + +## Mitwirken + +### Tritt uns auf Telegram bei + +Wir konzentrieren unsere Diskussionen in unserem [Telegram](https://t.me/hydralauncher) Kanal. + +### Forke und klone dein Repo + +1. Forke das Repo [(Klicke hier, um direkt zu forken)](https://github.com/hydralauncher/hydra/fork) +2. Klone deinen geforketen Code `git clone https://github.com/dein_nutzername/hydra` +3. Erstelle einen neuen Branch +4. Pushe deine Commits +5. Stelle eine neue Pull-Anfrage + +### Wie du mitwirken kannst + +- Übersetzung: Wir wollen Hydra so vielen Menschen wie möglich zugänglich machen. Gerne kannst du uns helfen neue Sprachen zu übersetzen oder für Hydra bereits verfügbare Sprachen zu aktualisieren und verbessern. +- Code: Hydra ist mit TypeScript, Electron und etwas Python gebaut. Wenn du mitwirken möchtest, tritt unserem [Telegram](https://t.me/hydralauncher) bei! + +### Projektstruktur + +- torrent-client: Wir verwenden die Python-Bibliothek libtorrent zur Verwaltung von Torrent-Downloads. +- src/renderer: die UI der Applikation. +- src/main: sämtliche Logik liegt hier. + +## Den Quellcode kompilieren + +### Installiere Node.js + +Stelle sicher, dass du Node.js auf deinem System installiert hast. Falls nicht, installiere es von [nodejs.org](https://nodejs.org/). + +### Installiere Yarn + +Yarn ist ein Packetmanager für Node.js. Sollte er dir fehlen, installiere ihn mithilfe der Anleitung auf [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/). + +### Installiere Node-Abhängigkeiten + +Navigiere zum Projektverzeichnis und installiere die Node-Abhängigkeiten mit Yarn: + +```bash +cd hydra +yarn +``` + +### Installiere Python 3.9 + +Stelle sicher, dass du Python 3.9 auf deinem System installiert hast. Ansonsten kannst du es von [python.org](https://www.python.org/downloads/release/python-3913/) herunterladen und installieren. + +### Installiere Python-Abhängigkeiten + +Installiere die benötigten Python-Abhängigkeiten mit pip: + +```bash +pip install -r requirements.txt +``` + +## Umgebungsvariablen + +Du wirst einen SteamGridDB API Schlüssel benötigen, um die Spielicons bei Installation abzurufen. + +Sobald du einen hast, kannst du die .env.example Datei zu .env kopieren oder umbenennen und den Schlüssel bei STEAMGRIDDB_API_KEY einfügen. + +## Ausführung + +Sobald du alles eingerichtet hast, kannst du den folgenden Befehl nutzen, um sowohl den Electron-Prozess als auch den BitTorrent-Client zu starten: + +```bash +yarn dev +``` + +## Kompilation + +### Kompiliere den BitTorrent-Client + +Kompiliere den BitTorrent-Client mit folgendem Befehl: + +```bash +python torrent-client/setup.py build +``` + +### Kompiliere die Electron-Applikation + +Kompiliere die Electron-Applikation mit folgendem Befehl: + +Auf Windows: + +```bash +yarn build:win +``` + +Auf Linux: + +```bash +yarn build:linux +``` + +## Mitwirkende + + + + + +## Lizenz + +Hydra ist unter der [MIT Lizenz](LICENSE) lizensiert. diff --git a/README.es.md b/README.es.md index 3c080da9..50fecb2b 100644 --- a/README.es.md +++ b/README.es.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra es un launcher de juegos con su propio cliente de bittorrent y gestor propio de repacks.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) +[![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,11 +29,12 @@ ## Tabla de Contenidos +- [Tabla de Contenidos](#tabla-de-contenidos) - [Acerca de](#acerca-de) -- [Características](#caracteristicas) -- [Instalación](#Instalacion) -- [Contribuir](#contribuir) - - [Únete a nuestro Telegram](#unete-a-nuestro-telegram) +- [Caracteristicas](#caracteristicas) +- [Instalacion](#instalacion) +- [Contribuir](#-contribuir) + - [Unete a nuestro Telegram](#-unete-a-nuestro-telegram) - [Haz un fork y clona tu repositorio](#haz-un-fork-y-clona-tu-repositorio) - [Maneras en las que puedes contribuir](#maneras-en-las-que-puedes-contribuir) - [Estructura del proyecto](#estructura-del-proyecto) @@ -40,13 +43,14 @@ - [Instalar Yarn](#instalar-yarn) - [Instalar Dependencias de Node](#instalar-dependencias-de-node) - [Instalar Python 3.9](#instalar-python-39) - - [Instalar Dependencias de Python](#Instalar-dependencias-de-python) + - [Instalar Dependencias de Python](#instalar-dependencias-de-python) - [Variables del Entorno](#variables-del-entorno) -- [Ejecución](#ejecucion) -- [Compilación](#compilacion) +- [Ejecucion](#ejecucion) +- [Compilacion](#compilacion) - [Compilar el cliente de bittorrent](#compilar-el-cliente-de-bittorrent) - - [Compilar la aplicación Electron](#compilar-la-aplicacion-electron) + - [Compilar la aplicacion Electron](#compilar-la-aplicacion-electron) - [Colaboradores](#colaboradores) +- [Licencia](#licencia) ## Acerca de diff --git a/README.fr.md b/README.fr.md index 0e99fb05..0b91962f 100644 --- a/README.fr.md +++ b/README.fr.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra est un lanceur de jeux avec son propre client bittorrent intégré et un scraper de repack auto-géré.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) +[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Catalogue Hydra](./docs/screenshot.png) @@ -27,6 +29,7 @@ ## Table des Matières +- [Table des Matières](#table-des-matières) - [À propos](#à-propos) - [Fonctionnalités](#fonctionnalités) - [Installation](#installation) @@ -47,6 +50,7 @@ - [Compiler le client bittorrent](#compiler-le-client-bittorrent) - [Compiler l'application Electron](#compiler-lapplication-electron) - [Contributeurs](#contributeurs) +- [License](#license) ## À propos diff --git a/README.it.md b/README.it.md new file mode 100644 index 00000000..678febac --- /dev/null +++ b/README.it.md @@ -0,0 +1,187 @@ +
+ +
+ +[](https://hydralauncher.site) + +

Hydra Launcher

+ +

+ Hydra è un game launcher con il proprio client bittorrent e autogestore di repacks. +

+ +[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) +[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) + +[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) +[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) +[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) +[![es](https://img.shields.io/badge/lang-es-red)](README.es.md) +[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) + +![Hydra Catalogue](./docs/screenshot.png) + +
+ +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [A proposito](#a-proposito) +- [Caratteristiche](#caratteristiche) +- [Installazione](#installazione) +- [Contribuire](#-contribuire) + - [Unisciti su Telegram](#-unisciti-su-telegram) + - [Forka e Clona la repository](#forka-e-clona-la-repository) + - [Modi in cui contribuire](#modi-in-cui-contribuire) + - [Struttura del Progetto](#struttura-del-progetto) +- [Compilazione](#compilazione) + - [Installa Node.js](#installa-nodejs) + - [Installa Yarn](#installa-yarn) + - [Installa le dipendenze Node](#installa-le-dipendenze-node) + - [Installa Python 3.9](#installa-python-39) + - [Installa le Dipendenze Python](#installa-le-dipendenze-python) +- [Variabili d'ambiente](#variabili-dambiente) +- [Esecuzione](#esecuzione) +- [Compilazione](#compilazione-1) + - [Compila il bittorrent](#compila-il-bittorrent) + - [Compila l'applicazione Electron](#compila-lapplicazione-electron) +- [Collaboratori](#collaboratori) +- [Licenza](#licenza) + +## A proposito + +**Hydra** è un **Game Launcher** con il proprio **Client BitTorrent** e **autogestore di repack**. +
+Il launcher è scritto in TypeScript (Electron) and Python, che gestisce il sistema di torrenting appoggiandosi a libtorrent. + +## Caratteristiche + +- Motore di ricerca automatizzato sulle fonti di repack dal [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/") +- Client Bittorrent integrato +- Integrazione How Long To Beat (HLTB) nella pagina del gioco +- Percorso del download Personalizzato +- Notifiche di aggiornamenti sulla list dei repacks +- Supporto Windows e Linux +- Costantemente Aggiornato +- E molto altro ... + +## Installazione + +Segui i seguenti passi: + +1. Scarica l'ultima versione di Hydra dalla pagina [Releases](https://github.com/hydralauncher/hydra/releases/latest). + - Scarica solo il file .exe per installare Hydra su Windows. + - Scarica il file .deb o .rpm o .zip per Linux. (Dipende dalla tua distro Linux) +2. Esegui il file scaricato. +3. Goditi Hydra! + +## Contribuire + +### Unisciti su Telegram + +Puoi unirti alle nostre conversazioni sul canale [Telegram](https://t.me/hydralauncher). + +### Forka e Clona la repository + +1. Forka la repository [(clicca qui per forkare)](https://github.com/hydralauncher/hydra/fork) +2. Clona il tuo codice forkato `git clone https://github.com/your_username/hydra` +3. Crea un nuovo branch +4. Aggiungi le modifiche (push) +5. Invia la richiesta di pull + +### Modi in cui contribuire + +- Traduzione: Vogliamo rendere Hydra disponibile a più persone possibile. Sentiti libero di tradurre in altre lingue o aggiornare e migliorare quelle già disponibili su Hydra. +- Programmazione: Hydra è programmato in TypeScript, Electron e un po' di Python. Se intendi contribuire unisciti al nostro [Telegram](https://t.me/hydralauncher)! + +### Struttura del Progetto + +- client-torrent: Usiamo libtorrent, una libreria Python, per gestire i download dei torrent +- src/renderer: l'UI dell'applicazione +- src/main: tutta la logica qui. + +## Compilazione + +### Installa Node.js + +Assicurati di avere Node.js installato sulla tua macchina. Scaricalo e installalo da [nodejs.org](https://nodejs.org/). + +### Installa Yarn + +Yarn è un gestore di pacchetti per Node.js. Se non hai ancora installato Yarn segui le istruzioni su [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/). + +### Installa le dipendenze Node + +Naviga alla cartella del progetto e installa le dipendenze Node con Yarn: + +```bash +cd hydra +yarn +``` + +### Installa Python 3.9 + +Assicurati di avere Python 3.9 installato. Puoi scaricarlo da [python.org](https://www.python.org/downloads/release/python-3913/). + +### Installa le Dipendenze Python + +Installa le dipendenze con pip: + +```bash +pip install -r requirements.txt +``` + +## Variabili d'ambiente + +Avrai bisogno di una chiave API SteamGridDB per poter caricare le icone di gioco. +Se intendi avere onlinefix come repacker dovrai aggiungere le tue credenziali al file .env + +Una volta ottenuta, puoi copiare e rinominare il file `.env.example` a `.env` e metterlo in `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`. + +## Esecuzione + +Una volta impostato tutto, puoi eseguire il seguente comando per avviare il processo Electron e il client bittorrent: + +```bash +yarn dev +``` + +## Compilazione + +### Compila il bittorrent + +Usa il comando: + +```bash +python torrent-client/setup.py build +``` + +### Compila l'applicazione Electron + +Usa il comando: + +Per Windows: + +```bash +yarn build:win +``` + +Per Linux: + +```bash +yarn build:linux +``` + +## Collaboratori + + + + + +## Licenza + +Hydra è concesso in licenza secondo la [MIT License](LICENSE). diff --git a/README.md b/README.md index 6dc97aea..f76da369 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra is a game launcher with its own embedded bittorrent client.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,11 +29,12 @@ ## Table of Contents +- [Table of Contents](#table-of-contents) - [About](#about) - [Features](#features) - [Installation](#installation) -- [Contributing](#contributing) - - [Join our Telegram](#join-our-telegram) +- [Contributing](#-contributing) + - [Join our Telegram](#-join-our-telegram) - [Fork and clone your repository](#fork-and-clone-your-repository) - [Ways you can contribute](#ways-you-can-contribute) - [Project Structure](#project-structure) @@ -47,6 +50,7 @@ - [Build the bittorrent client](#build-the-bittorrent-client) - [Build the Electron application](#build-the-electron-application) - [Contributors](#contributors) +- [License](#license) ## About diff --git a/README.pl.md b/README.pl.md index 298f82a9..a4a65630 100644 --- a/README.pl.md +++ b/README.pl.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra - to program uruchamiający gry z własnym wbudowanym klientem bittorrent i samodzielnie zarządzanym repackagerem..

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,26 +29,28 @@ ## Zawartość. +- [Zawartość.](#zawartość) - [O nas](#o-nas) -- [Cechy.](#cechy) +- [Cechy](#cechy) - [Instalacja](#instalacja) -- [Dokonaj wpłaty](#dokonaj-wpłaty) - - [Dołącz do naszego kanału Telegram](#dołącz-do-naszego-kanału-telegram) +- [Dokonaj wpłaty](#-dokonaj-wpłaty) + - [Dołącz do naszego kanału Telegram](#-dołącz-do-naszego-kanału-telegram) - [Rozwidlenie i sklonowanie repozytorium](#rozwidlenie-i-sklonowanie-repozytorium) - - [Jak możesz wnieść swój wkład](#jak-możesz-pomóc) + - [Jak możesz pomóc](#jak-możesz-pomóc) - [Struktura projektu](#struktura-projektu) - [Utwórz kompilację z kodu źródłowego](#utwórz-kompilację-z-kodu-źródłowego) - - [Instalacja Node.js](#zainstaluj-nodejs) - - [Instalacja Yarn](#zainstaluj-yarn) - - [Instalacja Node zależności](#zainstaluj-zależności-node) - - [Instalacja Python 3.9](#zainstaluj-python-39) - - [Instalacja Python zależności](#zainstaluj-zależności-pythona) + - [Zainstaluj Node.js](#zainstaluj-nodejs) + - [Zainstaluj Yarn](#zainstaluj-yarn) + - [Zainstaluj zależności Node](#zainstaluj-zależności-node) + - [Zainstaluj Python 3.9](#zainstaluj-python-39) + - [Zainstaluj zależności Pythona](#zainstaluj-zależności-pythona) - [Zmienne środowiskowe](#zmienne-środowiskowe) -- [Uruchomienie](#utwórz-kompilację-z-kodu-źródłowego) +- [Run](#run) - [Tworzenie kompilacji](#tworzenie-kompilacji) - - [Tworzenie klienta bittorrent](#zbuduj-klienta-bittorrent) - - [Tworzenie kompilacji aplikacji Electron](#tworzenie-aplikacji-electron) + - [Zbuduj klienta bittorrent](#zbuduj-klienta-bittorrent) + - [Tworzenie aplikacji Electron](#tworzenie-aplikacji-electron) - [Współtwórcy](#współtwórcy) +- [License](#license) ## O nas diff --git a/README.pt-BR.md b/README.pt-BR.md index 0d76a9fa..3d828dc0 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra é um Launcher de Jogos com seu próprio cliente de bittorrent integrado e um wrapper autogerenciado para busca de repacks.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) +[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) [![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,26 +29,28 @@ ## Índice -- [Sobre](#about) -- [Recursos](#features) -- [Instalação](#installation) -- [Contribuindo](#contributing) - - [Junte-se ao nosso Telegram](#join-our-telegram) - - [Fork e clone seu repositorio](#fork-and-clone-your-repository) - - [Como contribuir](#ways-you-can-contribute) - - [Estrutura do projeto](#project-structure) -- [Compile a partir do código-fonte](#build-from-source) - - [Instale Node.js](#install-nodejs) - - [Instale Yarn](#install-yarn) - - [Instale Node Dependencies](#install-node-dependencies) - - [Instale Python 3.9](#install-python-39) - - [Instale Python Dependencies](#install-python-dependencies) -- [variaveis de ambiente](#environment-variables) -- [Rodando o programa](#running) -- [Compilando](#build) - - [Compile o client bittorrent](#build-the-bittorrent-client) - - [Compile a aplicação Electron](#build-the-electron-application) -- [Contribuidores](#contributors) +- [Índice](#índice) +- [Sobre](#-sobre) +- [Recursos](#-recursos) +- [Instalação](#-instalação) +- [Contribuindo](#-contribuindo) + - [Junte-se ao nosso Telegram](#-junte-se-ao-nosso-telegram) + - [Fork e clone o seu repositório](#-fork-e-clone-o-seu-repositório) + - [Formas de contribuir](#-formas-de-contribuir) + - [Estrutura do Projeto](#-estrutura-do-projeto) +- [Compile a partir do código-fonte](#-compile-a-partir-do-código-fonte) + - [Instale Node.js](#-instale-nodejs) + - [Instale Yarn](#-instale-yarn) + - [Instale Dependencias do Node](#-instale-dependencias-do-node) + - [Instale Python 3.9](#-instale-python-39) + - [Instale Python Dependencies](#-instale-python-dependencies) +- [Environment variables](#-environment-variables) +- [Running](#-running) +- [Build](#-build) + - [Build the bittorrent client](#-build-the-bittorrent-client) + - [Build the Electron application](#-build-the-electron-application) +- [Contributors](#-contributors) +- [Licença](#-licença) ## Sobre diff --git a/README.ru.md b/README.ru.md index a1aaf806..409681a0 100644 --- a/README.ru.md +++ b/README.ru.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent и самостоятельным scraper`ом для репаков.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) +[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) [![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,11 +29,12 @@ ## Содержание +- [Содержание](#содержание) - [Описание](#описание) - [Особенности](#особенности) - [Установка](#установка) -- [Вклад](#contributing) - - [Присоединяйтесь к нашему Telegram](#join-our-telegram) +- [Вклад](#-вклад) + - [Присоединяйтесь к нашему Telegram](#-присоединяйтесь-к-нашему-telegram) - [Форк и клонирование репозитория](#форк-и-клонирование-репозитория) - [Способы внести свой вклад](#способы-внести-свой-вклад) - [Структура проекта](#структура-проекта) @@ -47,6 +50,7 @@ - [Сборка клиента BitTorrent](#сборка-клиента-bittorrent) - [Сборка приложения Electron](#сборка-приложения-electron) - [Участники](#участники) +- [License](#license) ## Описание diff --git a/README.uk-UA.md b/README.uk-UA.md index 2f921499..251f9e11 100644 --- a/README.uk-UA.md +++ b/README.uk-UA.md @@ -5,7 +5,7 @@ [](https://hydralauncher.site)

Hydra Launcher

- +

Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом і самокерованим збирачем репаків.

@@ -13,13 +13,15 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) -[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md) [![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) +[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) [![es](https://img.shields.io/badge/lang-es-red)](README.es.md) [![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) ![Hydra Catalogue](./docs/screenshot.png) @@ -27,11 +29,12 @@ ## Зміст +- [Зміст](#зміст) - [Про нас](#про-нас) - [Функції](#функції) - [Встановлення](#встановлення) -- [Зробити свій внесок](#contributing) - - [Приєднуйтесь до нашого Telegram](#join-our-telegram) +- [Зробити свій внесок](#-зробити-свій-внесок) + - [Приєднуйтесь до нашого Telegram](#-приєднуйтесь-до-нашого-telegram) - [Форк і клонування вашого репозиторію](#форк-і-клонування-вашого-репозиторію) - [Як ви можете зробити свій внесок](#як-ви-можете-зробити-свій-внесок) - [Структура проекту](#структура-проекту) @@ -47,6 +50,7 @@ - [Зробіть білд bittorrent client](#зробіть-білд-bittorrent-client) - [Зробіть білд Electron застосунку](#зробіть-білд-electron-застосунку) - [Контриб'ютори](#контрибютори) +- [License](#license) ## Про нас diff --git a/electron-builder.yml b/electron-builder.yml index cfdafe7d..8d94d3ed 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -44,6 +44,7 @@ linux: - AppImage - snap - deb + - pacman - rpm maintainer: electronjs.org category: Game diff --git a/package.json b/package.json index ff05b2ed..1727e383 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@vanilla-extract/dynamic": "^2.1.1", "@vanilla-extract/recipes": "^0.5.2", "auto-launch": "^5.0.6", - "axios": "^1.6.8", + "axios": "^1.7.7", "better-sqlite3": "^11.2.1", "check-disk-space": "^3.4.0", "classnames": "^2.5.1", @@ -58,7 +58,6 @@ "i18next": "^23.11.2", "i18next-browser-languagedetector": "^7.2.1", "icojs": "^0.19.3", - "iso-639-1": "3.1.2", "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", "knex": "^3.1.0", diff --git a/src/locales/ar/translation.json b/src/locales/ar/translation.json index e95db2f1..26f0654d 100644 --- a/src/locales/ar/translation.json +++ b/src/locales/ar/translation.json @@ -1,4 +1,5 @@ { + "language_name": "اَلْعَرَبِيَّةُ", "home": { "featured": "مميّز", "trending": "شائع", diff --git a/src/locales/be/translation.json b/src/locales/be/translation.json index 9e945f8d..b89946e8 100644 --- a/src/locales/be/translation.json +++ b/src/locales/be/translation.json @@ -1,4 +1,5 @@ { + "language_name": "беларуская мова", "home": { "featured": "Рэкамэндаванае", "trending": "Актуальнае", diff --git a/src/locales/ca/translation.json b/src/locales/ca/translation.json index 9124af79..393ea587 100644 --- a/src/locales/ca/translation.json +++ b/src/locales/ca/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Català", "app": { "successfully_signed_in": "Has entrat correctament" }, diff --git a/src/locales/da/translation.json b/src/locales/da/translation.json index d5cac8db..20b2df34 100644 --- a/src/locales/da/translation.json +++ b/src/locales/da/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Dansk", "home": { "featured": "Anbefalet", "trending": "Trender", diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json new file mode 100644 index 00000000..e8361961 --- /dev/null +++ b/src/locales/de/translation.json @@ -0,0 +1,277 @@ +{ + "language_name": "Deutsch", + "app": { + "successfully_signed_in": "Erfolgreich angemeldet" + }, + "home": { + "featured": "Empfohlen", + "trending": "Beliebt", + "surprise_me": "Überrasche mich", + "no_results": "Keine Ergebnisse gefunden" + }, + "sidebar": { + "catalogue": "Katalog", + "downloads": "Downloads", + "settings": "Einstellungen", + "my_library": "Meine Bibliothek", + "downloading_metadata": "{{title}} (Metadaten werden heruntergeladen…)", + "paused": "{{title}} (Pausiert)", + "downloading": "{{title}} ({{percentage}} - Wird heruntergeladen…)", + "filter": "Bibliothek filtern", + "home": "Home", + "queued": "{{title}} (In Warteschlange)", + "game_has_no_executable": "Spiel hat keine ausführbare Datei gewählt", + "sign_in": "Anmelden" + }, + "header": { + "search": "Spiele suchen", + "home": "Home", + "catalogue": "Katalog", + "downloads": "Downloads", + "search_results": "Suchergebnisse", + "settings": "Einstellungen", + "version_available_install": "Version {{version}} verfügbar. Klicke hier, um neuzustarten und sie zu installieren.", + "version_available_download": "Version {{version}} verfügbar. Klicke hier, um sie herunterzuladen." + }, + "bottom_panel": { + "no_downloads_in_progress": "Keine aktive Downloads", + "downloading_metadata": "Metadaten von {{title}} werden heruntergeladen…", + "downloading": "{{title}} wird heruntergeladen… ({{percentage}} abgeschlossen) - Abschluss {{eta}} - {{speed}}", + "calculating_eta": "{{title}} wird heruntergeladen… ({{percentage}} abgeschlossen) - Verbleibende Zeit wird berechnet…", + "checking_files": "Prüfe Dateien von {{title}}… ({{percentage}} abgeschlossen)" + }, + "catalogue": { + "next_page": "Nächste Seite", + "previous_page": "Vorherige Seite" + }, + "game_details": { + "open_download_options": "Download-Optionen öffnen", + "download_options_zero": "Keine Download-Optionen", + "download_options_one": "{{count}} Download-Option", + "download_options_other": "{{count}} Download-Optionen", + "updated_at": "Aktualisiert {{updated_at}}", + "install": "Installieren", + "resume": "Fortfahren", + "pause": "Pausieren", + "cancel": "Abbrechen", + "remove": "Entfernen", + "space_left_on_disk": "{{space}} auf Festplatte verfügbar", + "eta": "Abschluss {{eta}}", + "calculating_eta": "Verbleibende Zeit wird berechnet…", + "downloading_metadata": "Metadaten werden heruntergeladen…", + "filter": "Repacks filtern", + "requirements": "Systemanforderungen", + "minimum": "Minimum", + "recommended": "Empfohlen", + "paused": "Pausiert", + "release_date": "Veröffentlicht am {{date}}", + "publisher": "Veröffentlicht von {{publisher}}", + "hours": "Stunden", + "minutes": "Minuten", + "amount_hours": "{{amount}} Stunden", + "amount_minutes": "{{amount}} Minuten", + "accuracy": "{{accuracy}}% Genauigkeit", + "add_to_library": "Zu Bibliothek hinzufügen", + "remove_from_library": "Von Bibliothek entfernen", + "no_downloads": "Keine Downloads verfügbar", + "play_time": "{{amount}} lang gespielt", + "last_time_played": "Zuletzt gespielt {{period}}", + "not_played_yet": "{{title}} wurde noch nicht gespielt", + "next_suggestion": "Nächste Empfehlung", + "play": "Spielen", + "deleting": "Installer wird gelöscht…", + "close": "Schließen", + "playing_now": "Spielt jetzt", + "change": "Ändern", + "repacks_modal_description": "Wähle das Repack, das du herunterladen möchtest", + "select_folder_hint": "Um das Standardverzeichnis zu ändern, gehe zu den <0>Einstellungen", + "download_now": "Jetzt herunterladen", + "no_shop_details": "Shop-Details konnten nicht abgerufen werden.", + "download_options": "Download-Optionen", + "download_path": "Download-Verzeichnis", + "previous_screenshot": "Vorheriger Screenshot", + "next_screenshot": "Nächster Screenshot", + "screenshot": "Screenshot {{number}}", + "open_screenshot": "Screenshot {{number}} öffnen", + "download_settings": "Download-Einstellungen", + "downloader": "Downloader", + "select_executable": "Auswählen", + "no_executable_selected": "Keine ausführbare Datei gewählt", + "open_folder": "Verzeichnis öffnen", + "open_download_location": "Heruntergeladene Dateien anzeigen", + "create_shortcut": "Desktop-Verknüpfung erstellen", + "remove_files": "Dateien entfernen", + "remove_from_library_title": "Bist du dir sicher?", + "remove_from_library_description": "Dies wird {{game}} aus deiner Bibliothek entfernen", + "options": "Optionen", + "executable_section_title": "Ausführbare Datei", + "executable_section_description": "Pfad der Datei, die bei Klick auf \"Play\" ausgeführt wird", + "downloads_secion_title": "Downloads", + "downloads_section_description": "Sieh dir Updates oder andere Versionen dieses Spiels an", + "danger_zone_section_title": "Gefahrenzone", + "danger_zone_section_description": "Entferne dieses Spiel aus deiner Bibliothek oder die von Hydra heruntergeladenen Dateien", + "download_in_progress": "Download erfolgt", + "download_paused": "Download ist pausiert", + "last_downloaded_option": "Letzte Download-Option", + "create_shortcut_success": "Verknüpfung erfolgreich erstellt", + "create_shortcut_error": "Fehler bei Erstellung von Verknüpfung" + }, + "activation": { + "title": "Hydra aktivieren", + "installation_id": "Installations ID:", + "enter_activation_code": "Aktivierungscode eingeben", + "message": "Wenn du nicht weißt wo du fragen musst, solltest du dies nicht haben.", + "activate": "Aktivieren", + "loading": "Lädt…" + }, + "downloads": { + "resume": "Fortfahren", + "pause": "Pause", + "eta": "Abschluss {{eta}}", + "paused": "Pausiert", + "verifying": "Verifiziere…", + "completed": "Abgeschlossen", + "removed": "Nicht heruntergeladen", + "cancel": "Abbrechen", + "filter": "Heruntergeladene Spiele filtern", + "remove": "Entfernen", + "downloading_metadata": "Metadaten werden heruntergeladen…", + "deleting": "Installer wird entfernt…", + "delete": "Installer entfernen", + "delete_modal_title": "Bist du dir sicher?", + "delete_modal_description": "Dies wird alle Installationsdateien von deinem Computer entfernen", + "install": "Installieren", + "download_in_progress": "Läuft", + "queued_downloads": "Downloads in Warteschlange", + "downloads_completed": "Abgeschlossen", + "queued": "In Warteschlange", + "no_downloads_title": "Welch Leere", + "no_downloads_description": "Du hast mit Hydra noch nichts heruntergeladen, aber es ist nie zu spät anzufangen.", + "checking_files": "Dateien werden überprüft…" + }, + "settings": { + "downloads_path": "Download-Pfad", + "change": "Aktualisieren", + "notifications": "Benachrichtigungen", + "enable_download_notifications": "Wenn ein Download abgeschlossen wird", + "enable_repack_list_notifications": "Wenn ein neues Repack hinzugefügt wird", + "real_debrid_api_token_label": "Real-Debrid API Token", + "quit_app_instead_hiding": "Hydra verlassen statt minimieren beim Schließen", + "launch_with_system": "Hydra bei Systemstart starten", + "general": "Allgemein", + "behavior": "Verhalten", + "download_sources": "Download-Quellen", + "language": "Sprache", + "real_debrid_api_token": "API Token", + "enable_real_debrid": "Real-Debrid aktivieren", + "real_debrid_description": "Real-Debrid ist ein unrestriktiver Downloader, der es dir ermöglicht Dateien sofort und mit deiner maximalen Internetgeschwindigkeit herunterzuladen.", + "real_debrid_invalid_token": "API token nicht gültig", + "real_debrid_api_token_hint": "<0>Hier kannst du dir deinen API Token holen", + "real_debrid_free_account_error": "Das Konto \"{{username}}\" ist ein gratis account. Bitte abonniere Real-Debrid", + "real_debrid_linked_message": "Konto \"{{username}}\" verknüpft", + "save_changes": "Änderungen speichern", + "changes_saved": "Änderungen erfolgreich gespeichert", + "download_sources_description": "Hydra wird die Download-Links von diesen Quellen abrufen. Die Quell-URL muss ein direkter Link zu einer .json Datei, welche die Download-Links enthält, sein.", + "validate_download_source": "Validieren", + "remove_download_source": "Entfernen", + "add_download_source": "Quelle hinzufügen", + "download_count_zero": "Keine Download-Option", + "download_count_one": "{{countFormatted}} Download-Option", + "download_count_other": "{{countFormatted}} Download-Optionen", + "download_source_url": "Download Quell-URL", + "add_download_source_description": "Füge die URL, welche die .json Datei enthält, ein", + "download_source_up_to_date": "Auf aktuellem Stand", + "download_source_errored": "Fehlgeschlagen", + "sync_download_sources": "Quellen synchronisieren", + "removed_download_source": "Download-Quelle entfernt", + "added_download_source": "Download-Quelle hinzugefügt", + "download_sources_synced": "Alle Download-Quellen sind synchronisiert", + "insert_valid_json_url": "Füge eine gültige JSON URL ein", + "found_download_option_zero": "Keine Download-Option gefunden", + "found_download_option_one": "{{countFormatted}} Download-Option gefunden", + "found_download_option_other": "{{countFormatted}} Download-Optionen gefunden", + "import": "Importieren" + }, + "notifications": { + "download_complete": "Download abgeschlossen", + "game_ready_to_install": "{{title}} ist bereit zur Installation", + "repack_list_updated": "Repack-Liste aktualisiert", + "repack_count_one": "{{count}} Repack hinzugefügt", + "repack_count_other": "{{count}} Repacks hinzugefügt", + "new_update_available": "Version {{version}} verfügbar", + "restart_to_install_update": "Um das Update zu installieren, starte Hydra neu" + }, + "system_tray": { + "open": "Hydra öffnen", + "quit": "Schließen" + }, + "game_card": { + "no_downloads": "Keine Downloads verfügbar" + }, + "binary_not_found_modal": { + "title": "Programme nicht installiert", + "description": "Ausführbare Dateien für Wine oder Lutris wurden auf deinem System nicht gefunden", + "instructions": "Überprüfe die korrekte Installation dieser für deine Linux-Distro, damit das Spiel normal laufen kann" + }, + "modal": { + "close": "Knopf schließen" + }, + "forms": { + "toggle_password_visibility": "Sichtbarkeit des Passworts umschalten" + }, + "user_profile": { + "amount_hours": "{{amount}} Stunden", + "amount_minutes": "{{amount}} Minuten", + "last_time_played": "Zuletzt gespielt {{period}}", + "activity": "Letzte Aktivität", + "library": "Bibliothek", + "total_play_time": "Gesamtspielzeit: {{amount}}", + "no_recent_activity_title": "Hmmm… hier ist nichts", + "no_recent_activity_description": "Du hast in letzter Zeit keine Spiele gespielt. Es wird Zeit das zu ändern!", + "display_name": "Anzeigename", + "saving": "Speichert", + "save": "Speichern", + "edit_profile": "Profil Bearbeiten", + "saved_successfully": "Erfolgreich gespeichert", + "try_again": "Bitte versuche es erneut", + "sign_out_modal_title": "Bist du dir sicher?", + "cancel": "Abbrechen", + "successfully_signed_out": "Erfolgreich abgemeldet", + "sign_out": "Abmelden", + "playing_for": "Spielt {{amount}} lang", + "sign_out_modal_text": "Deine Bibliothek ist mit deinem aktuellen Konto verknüpft. Wenn du dich abmeldest, wird deine Bibliothek nicht mehr sichtbar sein und jeglicher Fortschritt wird nicht gespeichert. Abmelden fortführen?", + "add_friends": "Freunde hinzufügen", + "add": "Hinzufügen", + "friend_code": "Freundescode", + "see_profile": "Profil anzeigen", + "sending": "Sendet", + "friend_request_sent": "Freundschaftsanfrage versendet", + "friends": "Freunde", + "friends_list": "Freundesliste", + "user_not_found": "Nutzer nicht gefunden", + "block_user": "Nutzer blockieren", + "add_friend": "Freund hinzufügen", + "request_sent": "Anfrage versendet", + "request_received": "Anfrage erhalten", + "accept_request": "Anfrage annehmen", + "ignore_request": "Anfrage ignorieren", + "cancel_request": "Anfrage zurückziehen", + "undo_friendship": "Freundschaft kündigen", + "request_accepted": "Anfrage akzeptiert", + "user_blocked_successfully": "Nutzer erfolgreich blockiert", + "user_block_modal_text": "{{displayName}} wird dadurch blockiert", + "settings": "Einstellungen", + "public": "Öffentlich", + "private": "Privat", + "friends_only": "Nur Freunde", + "privacy": "Privatsphäre", + "blocked_users": "Blockierte Nutzer", + "unblock": "Freigeben", + "no_friends_added": "Du hast noch keine Freunde hinzugefügt", + "pending": "Ausstehend", + "no_pending_invites": "Du hast keine ausstehenden Einladungen", + "no_blocked_users": "Du hast keine blockierten Nutzer", + "friend_code_copied": "Freundescode kopiert", + "undo_friendship_modal_text": "Freundschaft mit {{displayName}} wird dadurch gekündigt" + } +} diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 08c9fda2..ed3ab8db 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -1,4 +1,5 @@ { + "language_name": "English", "app": { "successfully_signed_in": "Successfully signed in" }, @@ -20,7 +21,8 @@ "home": "Home", "queued": "{{title}} (Queued)", "game_has_no_executable": "Game has no executable selected", - "sign_in": "Sign in" + "sign_in": "Sign in", + "friends": "Friends" }, "header": { "search": "Search games", diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 9cc7af9d..d215ff71 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Español", "app": { "successfully_signed_in": "Sesión iniciada correctamente" }, @@ -270,6 +271,7 @@ "pending": "Pendiente", "no_pending_invites": "No tienes invitaciones pendientes", "no_blocked_users": "No has bloqueado a ningún usuario", - "friend_code_copied": "Código de amigo copiado" + "friend_code_copied": "Código de amigo copiado", + "undo_friendship_modal_text": "Esto deshará tu amistad con {{displayName}}" } } diff --git a/src/locales/fa/translation.json b/src/locales/fa/translation.json index 8629332f..2b8cd3fb 100644 --- a/src/locales/fa/translation.json +++ b/src/locales/fa/translation.json @@ -1,4 +1,5 @@ { + "language_name": "فارسی", "home": { "featured": "پیشنهادی", "trending": "پرطرفدار", diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index c732b22c..f635f1de 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Français", "home": { "featured": "En vedette", "trending": "Tendance", diff --git a/src/locales/hu/translation.json b/src/locales/hu/translation.json index 748ffe28..f68d71bd 100644 --- a/src/locales/hu/translation.json +++ b/src/locales/hu/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Magyar", "home": { "featured": "Featured", "trending": "Népszerű", diff --git a/src/locales/id/translation.json b/src/locales/id/translation.json index 198aa568..3d0f1edf 100644 --- a/src/locales/id/translation.json +++ b/src/locales/id/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Bahasa Indonesia", "app": { "successfully_signed_in": "Berhasil masuk" }, diff --git a/src/locales/index.ts b/src/locales/index.ts index 10f128ae..e8426f01 100644 --- a/src/locales/index.ts +++ b/src/locales/index.ts @@ -1,21 +1,49 @@ -export { default as en } from "./en/translation.json"; -export { default as pt } from "./pt/translation.json"; -export { default as es } from "./es/translation.json"; -export { default as nl } from "./nl/translation.json"; -export { default as fr } from "./fr/translation.json"; -export { default as hu } from "./hu/translation.json"; -export { default as it } from "./it/translation.json"; -export { default as pl } from "./pl/translation.json"; -export { default as ru } from "./ru/translation.json"; -export { default as tr } from "./tr/translation.json"; -export { default as be } from "./be/translation.json"; -export { default as uk } from "./uk/translation.json"; -export { default as zh } from "./zh/translation.json"; -export { default as id } from "./id/translation.json"; -export { default as ko } from "./ko/translation.json"; -export { default as da } from "./da/translation.json"; -export { default as ar } from "./ar/translation.json"; -export { default as fa } from "./fa/translation.json"; -export { default as ro } from "./ro/translation.json"; -export { default as ca } from "./ca/translation.json"; -export { default as kk } from "./kk/translation.json"; +import en from "./en/translation.json"; +import ptPT from "./pt-PT/translation.json"; +import ptBR from "./pt-BR/translation.json"; +import es from "./es/translation.json"; +import nl from "./nl/translation.json"; +import fr from "./fr/translation.json"; +import hu from "./hu/translation.json"; +import it from "./it/translation.json"; +import de from "./de/translation.json"; +import pl from "./pl/translation.json"; +import ru from "./ru/translation.json"; +import tr from "./tr/translation.json"; +import be from "./be/translation.json"; +import uk from "./uk/translation.json"; +import zh from "./zh/translation.json"; +import id from "./id/translation.json"; +import ko from "./ko/translation.json"; +import da from "./da/translation.json"; +import ar from "./ar/translation.json"; +import fa from "./fa/translation.json"; +import ro from "./ro/translation.json"; +import ca from "./ca/translation.json"; +import kk from "./kk/translation.json"; + +export default { + "pt-BR": ptBR, + "pt-PT": ptPT, + en, + de, + es, + nl, + fr, + hu, + it, + pl, + ru, + tr, + be, + uk, + zh, + id, + ko, + da, + ar, + fa, + ro, + ca, + kk, +}; diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index 55f21310..1d5145f9 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Italiano", "home": { "featured": "In primo piano", "trending": "Di tendenza", diff --git a/src/locales/kk/translation.json b/src/locales/kk/translation.json index d565e3b7..15683eb2 100644 --- a/src/locales/kk/translation.json +++ b/src/locales/kk/translation.json @@ -1,4 +1,5 @@ { + "language_name": "қазақ тілі", "app": { "successfully_signed_in": "Сәтті кіру" }, diff --git a/src/locales/ko/translation.json b/src/locales/ko/translation.json index 3d45bb88..933c7dde 100644 --- a/src/locales/ko/translation.json +++ b/src/locales/ko/translation.json @@ -1,4 +1,5 @@ { + "language_name": "한국어", "home": { "featured": "추천", "trending": "인기", diff --git a/src/locales/nl/translation.json b/src/locales/nl/translation.json index 59cf13e6..6f02c9a3 100644 --- a/src/locales/nl/translation.json +++ b/src/locales/nl/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Nederlands", "home": { "featured": "Uitgelicht", "trending": "Trending", diff --git a/src/locales/pl/translation.json b/src/locales/pl/translation.json index a8e9bdc7..5eb2c242 100644 --- a/src/locales/pl/translation.json +++ b/src/locales/pl/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Polski", "home": { "featured": "Wyróżnione", "trending": "Trendujące", diff --git a/src/locales/pt/translation.json b/src/locales/pt-BR/translation.json similarity index 97% rename from src/locales/pt/translation.json rename to src/locales/pt-BR/translation.json index a97a81cf..fb7a8dd0 100644 --- a/src/locales/pt/translation.json +++ b/src/locales/pt-BR/translation.json @@ -1,10 +1,13 @@ { + "language_name": "Português (Brasil)", "app": { "successfully_signed_in": "Autenticado com sucesso" }, "home": { "featured": "Destaques", "trending": "Populares", + "hot": "🔥 Populares agora", + "weekly": "📅 Mais baixados da semana", "surprise_me": "Surpreenda-me", "no_results": "Nenhum resultado encontrado" }, @@ -20,7 +23,8 @@ "home": "Início", "queued": "{{title}} (Na fila)", "game_has_no_executable": "Jogo não possui executável selecionado", - "sign_in": "Login" + "sign_in": "Login", + "friends": "Amigos" }, "header": { "search": "Buscar jogos", @@ -166,7 +170,7 @@ "real_debrid_linked_message": "Conta \"{{username}}\" vinculada", "save_changes": "Salvar mudanças", "changes_saved": "Ajustes salvos com sucesso", - "download_sources_description": "Hydra vai buscar links de download em todas as fonte habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.", + "download_sources_description": "Hydra vai buscar links de download em todas as fontes habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.", "validate_download_source": "Validar", "remove_download_source": "Remover", "add_download_source": "Adicionar fonte", @@ -239,7 +243,7 @@ "cancel": "Cancelar", "successfully_signed_out": "Deslogado com sucesso", "sign_out": "Sair da conta", - "sign_out_modal_title": "Tem certeza?", + "sign_out_modal_title": "Deseja mesmo sair?", "playing_for": "Jogando por {{amount}}", "sign_out_modal_text": "Sua biblioteca de jogos está associada com a sua conta atual. Ao sair, sua biblioteca não aparecerá mais no Hydra e qualquer progresso não será salvo. Deseja continuar?", "add_friends": "Adicionar Amigos", diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json new file mode 100644 index 00000000..67f99921 --- /dev/null +++ b/src/locales/pt-PT/translation.json @@ -0,0 +1,281 @@ +{ + "language_name": "Português (Portugal)", + "app": { + "successfully_signed_in": "Sessão iniciada com sucesso" + }, + "home": { + "featured": "Destaques", + "trending": "Populares", + "surprise_me": "Surpreende-me", + "no_results": "Nenhum resultado encontrado" + }, + "sidebar": { + "catalogue": "Catálogo", + "downloads": "Transferências", + "settings": "Definições", + "my_library": "Biblioteca", + "downloading_metadata": "{{title}} (A transferir metadados…)", + "paused": "{{title}} (Pausado)", + "downloading": "{{title}} ({{percentage}} - A transferir…)", + "filter": "Procurar", + "home": "Início", + "queued": "{{title}} (Na fila)", + "game_has_no_executable": "Jogo não tem executável selecionado", + "sign_in": "Iniciar sessão" + }, + "header": { + "search": "Procurar jogos", + "catalogue": "Catálogo", + "downloads": "Transferências", + "search_results": "Resultados da pesquisa", + "settings": "Definições", + "home": "Início", + "version_available_install": "Versão {{version}} disponível. Clique aqui para reiniciar e instalar.", + "version_available_download": "Versão {{version}} disponível. Clique aqui para fazer o download." + }, + "bottom_panel": { + "no_downloads_in_progress": "Sem transferências em andamento", + "downloading_metadata": "A transferir metadados de {{title}}…", + "downloading": "A transferir {{title}}… ({{percentage}} concluído) - Conclusão {{eta}} - {{speed}}", + "calculating_eta": "A transferir {{title}}… ({{percentage}} concluído) - A calcular tempo restante…", + "checking_files": "A verificar ficheiros de {{title}}…" + }, + "game_details": { + "open_download_options": "Ver opções de transferência", + "download_options_zero": "Sem opções de transferência", + "download_options_one": "{{count}} opção de transferência", + "download_options_other": "{{count}} opções de transferência", + "updated_at": "Atualizado a {{updated_at}}", + "resume": "Retomar", + "pause": "Pausar", + "cancel": "Cancelar", + "remove": "Remover", + "space_left_on_disk": "{{space}} livres no disco", + "eta": "Conclusão {{eta}}", + "calculating_eta": "A calcular tempo restante…", + "downloading_metadata": "A transferir metadados…", + "filter": "Filtrar repacks", + "requirements": "Requisitos do sistema", + "minimum": "Mínimos", + "recommended": "Recomendados", + "paused": "Pausado", + "release_date": "Lançado em {{date}}", + "publisher": "Publicado por {{publisher}}", + "hours": "horas", + "minutes": "minutos", + "amount_hours": "{{amount}} horas", + "amount_minutes": "{{amount}} minutos", + "accuracy": "{{accuracy}}% de precisão", + "add_to_library": "Adicionar à biblioteca", + "remove_from_library": "Remover da biblioteca", + "no_downloads": "Nenhuma transferência disponível", + "play_time": "Jogou por {{amount}}", + "next_suggestion": "Próxima sugestão", + "install": "Instalar", + "last_time_played": "Última sessão {{period}}", + "play": "Jogar", + "not_played_yet": "Ainda não jogou {{title}}", + "close": "Fechar", + "deleting": "A eliminar instalador…", + "playing_now": "A jogar agora", + "change": "Explorar", + "repacks_modal_description": "Escolha o repack do jogo que deseja transferir", + "select_folder_hint": "Para trocar o diretório padrão, aceda à <0>Tela de Definições", + "download_now": "Iniciar transferência", + "no_shop_details": "Não foi possível obter os detalhes da loja.", + "download_options": "Opções de transferência", + "download_path": "Diretório de transferência", + "previous_screenshot": "Captura de ecrã anterior", + "next_screenshot": "Próxima captura de ecrã", + "screenshot": "Captura de ecrã {{number}}", + "open_screenshot": "Ver captura de ecrã {{number}}", + "download_settings": "Definições de transferência", + "downloader": "Downloader", + "select_executable": "Explorar", + "no_executable_selected": "Nenhum executável selecionado", + "open_folder": "Abrir pasta", + "open_download_location": "Ver ficheiros transferidos", + "create_shortcut": "Criar atalho no ambiente de trabalho", + "remove_files": "Remover ficheiros", + "options": "Gerir", + "remove_from_library_description": "Isto irá remover {{game}} da sua biblioteca", + "remove_from_library_title": "Tem a certeza?", + "executable_section_title": "Executável", + "executable_section_description": "O caminho do ficheiro que será executado ao clicar em \"Jogar\"", + "downloads_secion_title": "Transferências", + "downloads_section_description": "Confira atualizações ou versões diferentes para este mesmo título", + "danger_zone_section_title": "Zona de perigo", + "danger_zone_section_description": "Remova o jogo da sua biblioteca ou os ficheiros que foram transferidos pelo Hydra", + "download_in_progress": "Transferência em andamento", + "download_paused": "Transferência pausada", + "last_downloaded_option": "Última opção transferida", + "create_shortcut_success": "Atalho criado com sucesso", + "create_shortcut_error": "Erro ao criar atalho" + }, + "activation": { + "title": "Ativação", + "installation_id": "ID da instalação:", + "enter_activation_code": "Insira o seu código de ativação", + "message": "Se não sabe onde conseguir o código, talvez não devesse estar aqui.", + "activate": "Ativar", + "loading": "A carregar…" + }, + "downloads": { + "resume": "Retomar", + "pause": "Pausar", + "eta": "Conclusão {{eta}}", + "paused": "Pausado", + "verifying": "A verificar…", + "completed": "Concluído", + "removed": "Cancelado", + "cancel": "Cancelar", + "filter": "Filtrar jogos transferidos", + "remove": "Remover", + "downloading_metadata": "A transferir metadados…", + "delete": "Remover instalador", + "delete_modal_description": "Isto removerá todos os ficheiros de instalação do seu computador", + "delete_modal_title": "Tem a certeza?", + "deleting": "A eliminar instalador…", + "install": "Instalar", + "download_in_progress": "A transferir agora", + "queued_downloads": "Na fila", + "downloads_completed": "Concluído", + "queued": "Na fila", + "no_downloads_title": "Nada por aqui…", + "no_downloads_description": "Ainda não transferiu nada pelo Hydra, mas nunca é tarde para começar.", + "checking_files": "A verificar ficheiros…" + }, + "settings": { + "downloads_path": "Diretório das transferências", + "change": "Explorar...", + "notifications": "Notificações", + "enable_download_notifications": "Quando uma transferência for concluída", + "enable_repack_list_notifications": "Quando a lista de repacks for atualizada", + "real_debrid_api_token_label": "Token de API do Real-Debrid", + "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.", + "launch_with_system": "Iniciar o Hydra com o sistema", + "general": "Geral", + "behavior": "Comportamento", + "download_sources": "Fontes de transferência", + "language": "Idioma", + "real_debrid_api_token": "Token de API", + "enable_real_debrid": "Ativar Real-Debrid", + "real_debrid_api_token_hint": "Pode obter o seu token de API <0>aqui", + "real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite transferir ficheiros instantaneamente e com a melhor velocidade da sua Internet.", + "real_debrid_invalid_token": "Token de API inválido", + "real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreva o Real-Debrid", + "real_debrid_linked_message": "Conta \"{{username}}\" vinculada", + "save_changes": "Guardar alterações", + "changes_saved": "Definições guardadas com sucesso", + "download_sources_description": "O Hydra vai procurar links de transferência em todas as fontes ativadas. A URL da página de detalhes da loja não é guardada no seu dispositivo. Utilizamos um sistema de metadados criado pela comunidade para fornecer suporte a mais fontes de transferência de jogos.", + "enable_source": "Ativar", + "disable_source": "Desativar", + "validate_download_source": "Validar", + "remove_download_source": "Remover", + "add_download_source": "Adicionar fonte", + "download_count_zero": "Sem transferências na lista", + "download_count_one": "{{countFormatted}} transferência na lista", + "download_count_other": "{{countFormatted}} transferências na lista", + "download_options_zero": "Sem transferências disponíveis", + "download_options_one": "{{countFormatted}} transferência disponível", + "download_options_other": "{{countFormatted}} transferências disponíveis", + "download_source_url": "URL da fonte", + "add_download_source_description": "Insira o URL contendo o arquivo .json", + "download_source_up_to_date": "Sincronizada", + "download_source_errored": "Falhou", + "sync_download_sources": "Sincronizar", + "removed_download_source": "Fonte removida", + "added_download_source": "Fonte adicionada", + "download_sources_synced": "As fontes foram sincronizadas", + "insert_valid_json_url": "Insira o URL de um JSON válido", + "found_download_option_zero": "Nenhuma opção de transferência encontrada", + "found_download_option_one": "{{countFormatted}} opção de transferência encontrada", + "found_download_option_other": "{{countFormatted}} opções de transferências encontradas", + "import": "Importar" + }, + "notifications": { + "download_complete": "Transferência concluída", + "game_ready_to_install": "{{title}} está pronto para ser descarregado", + "repack_list_updated": "Lista de repacks atualizada", + "repack_count_one": "{{count}} novo repack", + "repack_count_other": "{{count}} novos repacks", + "new_update_available": "Versão {{version}} disponível", + "restart_to_install_update": "Reinicie o Hydra para instalar a nova versão" + }, + "system_tray": { + "open": "Abrir Hydra", + "quit": "Fechar" + }, + "game_card": { + "no_downloads": "Sem transferências disponíveis" + }, + "binary_not_found_modal": { + "title": "Programas não instalados", + "description": "Os executáveis do Wine ou Lutris não foram encontrados em seu sistema.", + "instructions": "Verifique a forma correta de instalar algum deles na sua distro Linux, garantindo assim a execução normal do jogo." + }, + "catalogue": { + "next_page": "Próxima página", + "previous_page": "Página anterior" + }, + "modal": { + "close": "Botão de fechar" + }, + "forms": { + "toggle_password_visibility": "Alternar visibilidade da palavra-passe" + }, + "user_profile": { + "amount_hours": "{{amount}} horas", + "amount_minutes": "{{amount}} minutos", + "last_time_played": "Última sessão {{period}}", + "activity": "Atividades recentes", + "library": "Biblioteca", + "total_play_time": "Tempo total de jogo: {{amount}}", + "no_recent_activity_title": "Hmmm… nada por aqui", + "no_recent_activity_description": "Parece que não jogaste nada recentemente. Que tal começar agora?", + "display_name": "Nome de exibição", + "saving": "a guardar…", + "save": "Guardar", + "edit_profile": "Editar perfil", + "saved_successfully": "Guardado com sucesso", + "try_again": "Por favor, tenta novamente", + "cancel": "Cancelar", + "successfully_signed_out": "Terminado com sucesso", + "sign_out": "Terminar sessão", + "sign_out_modal_title": "Tens a certeza?", + "playing_for": "A jogar há {{amount}}", + "sign_out_modal_text": "A tua biblioteca de jogos está associada com a tua conta atual. Ao sair, a tua biblioteca não aparecerá mais no Hydra e qualquer progresso não será guardado. Desejas continuar?", + "add_friends": "Adicionar Amigos", + "friend_code": "Código de amigo", + "see_profile": "Ver perfil", + "friend_request_sent": "Pedido de amizade enviado", + "friends": "Amigos", + "add": "Adicionar", + "sending": "A enviar", + "friends_list": "Lista de amigos", + "user_not_found": "Utilizador não encontrado", + "block_user": "Bloquear", + "add_friend": "Adicionar amigo", + "request_sent": "Pedido enviado", + "request_received": "Pedido recebido", + "accept_request": "Aceitar pedido", + "ignore_request": "Ignorar pedido", + "cancel_request": "Cancelar pedido", + "undo_friendship": "Desfazer amizade", + "request_accepted": "Pedido de amizade aceito", + "user_blocked_successfully": "Utilizador bloqueado com sucesso", + "user_block_modal_text": "Bloquear {{displayName}}", + "settings": "Definições", + "privacy": "Privacidade", + "private": "Privado", + "friends_only": "Apenas amigos", + "public": "Público", + "blocked_users": "Utilizadores bloqueados", + "unblock": "Desbloquear", + "no_friends_added": "Ainda não adicionaste amigos", + "pending": "Pendentes", + "no_pending_invites": "Não tens convites de amizade pendentes", + "no_blocked_users": "Não tens nenhum utilizador bloqueado", + "friend_code_copied": "Código de amigo copiado" + } +} diff --git a/src/locales/ro/translation.json b/src/locales/ro/translation.json index 2aed7a7f..9fab3119 100644 --- a/src/locales/ro/translation.json +++ b/src/locales/ro/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Română", "home": { "featured": "Recomandate", "trending": "Populare", diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index 89d16b28..be3a000e 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Русский", "app": { "successfully_signed_in": "Успешный вход" }, diff --git a/src/locales/tr/translation.json b/src/locales/tr/translation.json index 150eda84..2da9c977 100644 --- a/src/locales/tr/translation.json +++ b/src/locales/tr/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Türkçe", "home": { "featured": "Öne çıkan", "trending": "Popüler", diff --git a/src/locales/uk/translation.json b/src/locales/uk/translation.json index 48dec3e4..bb840bc2 100644 --- a/src/locales/uk/translation.json +++ b/src/locales/uk/translation.json @@ -1,4 +1,5 @@ { + "language_name": "Українська", "app": { "successfully_signed_in": "Успішний вхід в систему" }, diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json index e0284b8d..0c793172 100644 --- a/src/locales/zh/translation.json +++ b/src/locales/zh/translation.json @@ -1,4 +1,5 @@ { + "language_name": "中文", "app": { "successfully_signed_in": "已成功登录" }, diff --git a/src/main/events/catalogue/get-catalogue.ts b/src/main/events/catalogue/get-catalogue.ts index a203167d..39fce7f5 100644 --- a/src/main/events/catalogue/get-catalogue.ts +++ b/src/main/events/catalogue/get-catalogue.ts @@ -1,35 +1,42 @@ -import type { CatalogueEntry, GameShop } from "@types"; +import type { GameShop } from "@types"; import { registerEvent } from "../register-event"; -import { RepacksManager, requestSteam250 } from "@main/services"; -import { formatName, steamUrlBuilder } from "@shared"; +import { HydraApi, RepacksManager } from "@main/services"; +import { CatalogueCategory, formatName, steamUrlBuilder } from "@shared"; +import { steamGamesWorker } from "@main/workers"; -const resultSize = 12; +const getCatalogue = async ( + _event: Electron.IpcMainInvokeEvent, + category: CatalogueCategory +) => { + const params = new URLSearchParams({ + take: "12", + skip: "0", + }); -const getCatalogue = async (_event: Electron.IpcMainInvokeEvent) => { - const trendingGames = await requestSteam250("/90day"); - const results: CatalogueEntry[] = []; + const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>( + `/games/${category}?${params.toString()}` + ); - for (let i = 0; i < resultSize; i++) { - if (!trendingGames[i]) { - i++; - continue; - } + return Promise.all( + response.map(async (game) => { + const steamGame = await steamGamesWorker.run(Number(game.objectId), { + name: "getById", + }); - const { title, objectID } = trendingGames[i]!; - const repacks = RepacksManager.search({ query: formatName(title) }); + const repacks = RepacksManager.search({ + query: formatName(steamGame.name), + }); - const catalogueEntry = { - objectID, - title, - shop: "steam" as GameShop, - cover: steamUrlBuilder.library(objectID), - }; - - results.push({ ...catalogueEntry, repacks }); - } - - return results; + return { + title: steamGame.name, + shop: game.shop, + repacks, + cover: steamUrlBuilder.library(game.objectId), + objectID: game.objectId, + }; + }) + ); }; registerEvent("getCatalogue", getCatalogue); diff --git a/src/main/events/catalogue/get-game-stats.ts b/src/main/events/catalogue/get-game-stats.ts new file mode 100644 index 00000000..87cba054 --- /dev/null +++ b/src/main/events/catalogue/get-game-stats.ts @@ -0,0 +1,23 @@ +import type { GameShop } from "@types"; + +import { registerEvent } from "../register-event"; +import { HydraApi } from "@main/services"; +import type { GameStats } from "@types"; + +const getGameStats = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop +) => { + const params = new URLSearchParams({ + objectId, + shop, + }); + + const response = await HydraApi.get( + `/games/stats?${params.toString()}` + ); + return response; +}; + +registerEvent("getGameStats", getGameStats); diff --git a/src/main/events/index.ts b/src/main/events/index.ts index 3963e4b0..e12ce19f 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -8,6 +8,7 @@ import "./catalogue/get-how-long-to-beat"; import "./catalogue/get-random-game"; import "./catalogue/search-games"; import "./catalogue/search-game-repacks"; +import "./catalogue/get-game-stats"; import "./hardware/get-disk-free-space"; import "./library/add-game-to-library"; import "./library/create-game-shortcut"; diff --git a/src/main/events/user/get-user.ts b/src/main/events/user/get-user.ts index dfc7d3e3..8ee34b59 100644 --- a/src/main/events/user/get-user.ts +++ b/src/main/events/user/get-user.ts @@ -1,10 +1,27 @@ import { registerEvent } from "../register-event"; -import { HydraApi } from "@main/services"; +import { HydraApi, logger } from "@main/services"; import { steamGamesWorker } from "@main/workers"; import type { UserProfile } from "@types"; import { getUserFriends } from "./get-user-friends"; import { steamUrlBuilder } from "@shared"; +const getSteamGame = async (objectId: string) => { + try { + const steamGame = await steamGamesWorker.run(Number(objectId), { + name: "getById", + }); + + return { + title: steamGame.name, + iconUrl: steamUrlBuilder.icon(objectId, steamGame.clientIcon), + }; + } catch (err) { + logger.error("Failed to get Steam game", err); + + return null; + } +}; + const getUser = async ( _event: Electron.IpcMainInvokeEvent, userId: string @@ -20,36 +37,51 @@ const getUser = async ( if (!profile) return null; const recentGames = await Promise.all( - profile.recentGames.map(async (game) => { - const steamGame = await steamGamesWorker.run(Number(game.objectId), { - name: "getById", - }); + profile.recentGames + .map(async (game) => { + const steamGame = await getSteamGame(game.objectId); - return { - ...game, - title: steamGame.name, - iconUrl: steamUrlBuilder.icon(game.objectId, steamGame.clientIcon), - }; - }) + return { + ...game, + ...steamGame, + }; + }) + .filter((game) => game) ); - // const libraryGames = await Promise.all( - // profile.libraryGames.map(async (game) => { - // return getSteamUserGame(game); - // }) - // ); + const libraryGames = await Promise.all( + profile.libraryGames + .map(async (game) => { + const steamGame = await getSteamGame(game.objectId); - // const currentGame = await getGameRunning(profile.currentGame); + return { + ...game, + ...steamGame, + }; + }) + .filter((game) => game) + ); + + if (profile.currentGame) { + const steamGame = await getSteamGame(profile.currentGame.objectId); + + if (steamGame) { + profile.currentGame = { + ...profile.currentGame, + ...steamGame, + }; + } + } return { ...profile, - // libraryGames, + libraryGames, recentGames, friends: friends.friends, totalFriends: friends.totalFriends, - // currentGame, }; } catch (err) { + console.log("err", err); return null; } }; diff --git a/src/main/hydra.dev.db b/src/main/hydra.dev.db deleted file mode 100644 index d8c65f28..00000000 Binary files a/src/main/hydra.dev.db and /dev/null differ diff --git a/src/main/index.ts b/src/main/index.ts index 24c367fd..3c5cc254 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -7,7 +7,7 @@ import url from "node:url"; import { electronApp, optimizer } from "@electron-toolkit/utils"; import { logger, PythonInstance, WindowManager } from "@main/services"; import { dataSource } from "@main/data-source"; -import * as resources from "@locales"; +import resources from "@locales"; import { userPreferencesRepository } from "@main/repository"; import { knexClient, migrationConfig } from "./knex-client"; diff --git a/src/main/services/library-sync/create-game.ts b/src/main/services/library-sync/create-game.ts index 6699788c..48524e00 100644 --- a/src/main/services/library-sync/create-game.ts +++ b/src/main/services/library-sync/create-game.ts @@ -3,6 +3,15 @@ import { HydraApi } from "../hydra-api"; import { gameRepository } from "@main/repository"; export const createGame = async (game: Game) => { + console.log({ objectId: game.objectID, shop: game.shop }); + + HydraApi.post("/games/download", { + objectId: game.objectID, + shop: game.shop, + }).catch((err) => { + console.log(err); + }); + HydraApi.post(`/profile/games`, { objectId: game.objectID, playTimeInMilliseconds: Math.trunc(game.playTimeInMilliseconds), diff --git a/src/preload/index.ts b/src/preload/index.ts index 7ebd63d4..3c71eff1 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -12,6 +12,7 @@ import type { FriendRequestAction, UpdateProfileRequest, } from "@types"; +import type { CatalogueCategory } from "@shared"; contextBridge.exposeInMainWorld("electron", { /* Torrenting */ @@ -34,7 +35,8 @@ contextBridge.exposeInMainWorld("electron", { /* Catalogue */ searchGames: (query: string) => ipcRenderer.invoke("searchGames", query), - getCatalogue: () => ipcRenderer.invoke("getCatalogue"), + getCatalogue: (category: CatalogueCategory) => + ipcRenderer.invoke("getCatalogue", category), getGameShopDetails: (objectID: string, shop: GameShop, language: string) => ipcRenderer.invoke("getGameShopDetails", objectID, shop, language), getRandomGame: () => ipcRenderer.invoke("getRandomGame"), @@ -44,6 +46,8 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.invoke("getGames", take, prevCursor), searchGameRepacks: (query: string) => ipcRenderer.invoke("searchGameRepacks", query), + getGameStats: (objectId: string, shop: GameShop) => + ipcRenderer.invoke("getGameStats", objectId, shop), /* User preferences */ getUserPreferences: () => ipcRenderer.invoke("getUserPreferences"), diff --git a/src/renderer/src/components/confirmation-modal/confirmation-modal.css.ts b/src/renderer/src/components/confirmation-modal/confirmation-modal.css.ts new file mode 100644 index 00000000..342a8350 --- /dev/null +++ b/src/renderer/src/components/confirmation-modal/confirmation-modal.css.ts @@ -0,0 +1,13 @@ +import { SPACING_UNIT, vars } from "../../theme.css"; +import { style } from "@vanilla-extract/css"; + +export const actions = style({ + display: "flex", + alignSelf: "flex-end", + gap: `${SPACING_UNIT * 2}px`, +}); + +export const descriptionText = style({ + fontSize: "16px", + lineHeight: "24px", +}); diff --git a/src/renderer/src/components/confirmation-modal/confirmation-modal.tsx b/src/renderer/src/components/confirmation-modal/confirmation-modal.tsx new file mode 100644 index 00000000..16abf1bd --- /dev/null +++ b/src/renderer/src/components/confirmation-modal/confirmation-modal.tsx @@ -0,0 +1,30 @@ +import { Button } from "../button/button"; +import { Modal, type ModalProps } from "../modal/modal"; + +import * as styles from "./confirmation-modal.css"; + +export interface ConfirmationModalProps extends ModalProps { + confirmButtonLabel: string; + cancelButtonLabel: string; + descriptionText: string; +} + +export function ConfirmationModal({ + confirmButtonLabel, + cancelButtonLabel, + descriptionText, + ...props +}: ConfirmationModalProps) { + return ( + +
+

{descriptionText}

+ +
+ + +
+
+
+ ); +} diff --git a/src/renderer/src/components/game-card/game-card.tsx b/src/renderer/src/components/game-card/game-card.tsx index 7df5aa13..aafa3a09 100644 --- a/src/renderer/src/components/game-card/game-card.tsx +++ b/src/renderer/src/components/game-card/game-card.tsx @@ -1,11 +1,16 @@ -import { DownloadIcon, FileDirectoryIcon } from "@primer/octicons-react"; -import type { CatalogueEntry } from "@types"; +import { + DownloadIcon, + FileDirectoryIcon, + PeopleIcon, +} from "@primer/octicons-react"; +import type { CatalogueEntry, GameStats } from "@types"; import SteamLogo from "@renderer/assets/steam-logo.svg?react"; import * as styles from "./game-card.css"; import { useTranslation } from "react-i18next"; import { Badge } from "../badge/badge"; +import { useCallback, useMemo, useState } from "react"; export interface GameCardProps extends React.DetailedHTMLProps< @@ -22,12 +27,35 @@ const shopIcon = { export function GameCard({ game, ...props }: GameCardProps) { const { t } = useTranslation("game_card"); + const [stats, setStats] = useState(null); + + const { i18n } = useTranslation(); + const uniqueRepackers = Array.from( new Set(game.repacks.map(({ repacker }) => repacker)) ); + const handleHover = useCallback(() => { + if (!stats) { + window.electron.getGameStats(game.objectID, game.shop).then((stats) => { + setStats(stats); + }); + } + }, [game, stats]); + + const numberFormatter = useMemo(() => { + return new Intl.NumberFormat(i18n.language, { + maximumFractionDigits: 0, + }); + }, [i18n.language]); + return ( - + ); + }, [userDetails, t, receivedRequests, showFriendsModal]); + return (
- + {friendsButton}
); } diff --git a/src/renderer/src/components/sidebar/sidebar.css.ts b/src/renderer/src/components/sidebar/sidebar.css.ts index ed6be83a..c0690d2d 100644 --- a/src/renderer/src/components/sidebar/sidebar.css.ts +++ b/src/renderer/src/components/sidebar/sidebar.css.ts @@ -21,6 +21,11 @@ export const sidebar = recipe({ pointerEvents: "none", }, }, + darwin: { + true: { + paddingTop: `${SPACING_UNIT * 6}px`, + }, + }, }, }); diff --git a/src/renderer/src/components/sidebar/sidebar.tsx b/src/renderer/src/components/sidebar/sidebar.tsx index dfacbe4d..fc2a4d14 100644 --- a/src/renderer/src/components/sidebar/sidebar.tsx +++ b/src/renderer/src/components/sidebar/sidebar.tsx @@ -153,12 +153,14 @@ export function Sidebar() { <>