diff --git a/data/hu.kramo.Cartridges.desktop.in b/data/hu.kramo.Cartridges.desktop.in
index 643d02f..7341def 100644
--- a/data/hu.kramo.Cartridges.desktop.in
+++ b/data/hu.kramo.Cartridges.desktop.in
@@ -7,5 +7,5 @@ Icon=@APP_ID@
Terminal=false
Type=Application
Categories=GNOME;GTK;Game;
-Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;
+Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;
StartupNotify=true
diff --git a/data/hu.kramo.Cartridges.metainfo.xml.in b/data/hu.kramo.Cartridges.metainfo.xml.in
index ec619a3..f908ea3 100644
--- a/data/hu.kramo.Cartridges.metainfo.xml.in
+++ b/data/hu.kramo.Cartridges.metainfo.xml.in
@@ -44,11 +44,11 @@
-
+
- - Fixes the ability to import multiple times at once
- - Fixes an issue with non-Flatpak Steam on Linux
+ - Fixes an issue with adding new games manually
+ - Translations since 2.0
diff --git a/docs/game_id.json.md b/docs/game_id.json.md
index c7e879b..a886bf0 100644
--- a/docs/game_id.json.md
+++ b/docs/game_id.json.md
@@ -49,9 +49,9 @@ Stored as a string.
### source
-A unique ID for the source of the game in lowercase, without spaces.
+A unique ID for the source of the game in lowercase, without spaces or underscores.
-If a source provides multiple internal sources, these should be separately labeled, but share a common prefix. eg. `heoic_gog`, `heroic_epic`.
+If a source provides multiple internal sources, these should be separately labeled, but share a common prefix. eg. `heoic_gog`, `heroic_epic`. This is the only place you should use an underscore.
Stored as a string.
diff --git a/meson.build b/meson.build
index 7ff4c00..e8c4d37 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('cartridges',
- version: '2.0.1',
+ version: '2.0.4',
meson_version: '>= 0.59.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)
diff --git a/po/ar.po b/po/ar.po
index 3673eac..73185ab 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-04 17:29+0000\n"
+"PO-Revision-Date: 2023-07-09 07:59+0000\n"
"Last-Translator: Ali Aljishi \n"
"Language-Team: Arabic \n"
@@ -529,17 +529,13 @@ msgstr "حدِّد مجلَّد ذاكرة {} المؤقتة."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "حدِّد مجلَّد تثبيت {}."
+msgstr "حدِّد مجلَّد ضبط {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "حدِّد مجلَّد ذاكرة {} المؤقتة."
+msgstr "حدِّد مجلَّد بيانات {}."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/po/es.po b/po/es.po
index ef2a89e..462e8e0 100644
--- a/po/es.po
+++ b/po/es.po
@@ -9,8 +9,9 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-04 17:29+0000\n"
-"Last-Translator: gallegonovato \n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
+"Last-Translator: Óscar Fernández Díaz \n"
"Language-Team: Spanish \n"
"Language: es\n"
@@ -46,9 +47,9 @@ msgid ""
"necessary. You can sort and hide games or download cover art from "
"SteamGridDB."
msgstr ""
-"Cartridges es un lanzador simple para todos tus juegos. Admite la "
-"importación de tus juegos de Steam, Lutris, Heroic y más sin necesidad de "
-"una cuenta. Puedes ordenar y ocultar juegos, o descargar carátulas de "
+"Cartuchos es un sencillo lanzador de juegos para todos sus juegos. Tiene "
+"soporte para importar juegos de Steam, Lutris, Heroic y más sin necesidad de "
+"iniciar sesión. Puede ordenar y ocultar juegos o descargar portadas de "
"SteamGridDB."
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
@@ -74,11 +75,11 @@ msgstr "Cancelar"
#: data/gtk/details-window.blp:57
msgid "New Cover"
-msgstr "Nueva caratula"
+msgstr "Portada nueva"
#: data/gtk/details-window.blp:75
msgid "Delete Cover"
-msgstr "Borrar la caratula"
+msgstr "Borrar portada"
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
#: data/gtk/game.blp:80
@@ -124,7 +125,7 @@ msgstr "Eliminar"
#: data/gtk/game.blp:126 src/window.py:173
msgid "Unhide"
-msgstr "Mostrar"
+msgstr "Desocultar"
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
msgid "General"
@@ -177,7 +178,7 @@ msgstr "Eliminar juego"
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
msgid "Behavior"
-msgstr "Conducta"
+msgstr "Comportamiento"
#: data/gtk/preferences.blp:16
msgid "Exit After Launching Games"
@@ -206,11 +207,11 @@ msgstr "Guarda las partidas sin pérdidas a costa del almacenamiento"
#: data/gtk/preferences.blp:50
msgid "Danger Zone"
-msgstr "Zona peligrosa"
+msgstr "Zona de peligro"
#: data/gtk/preferences.blp:53
msgid "Remove All Games"
-msgstr "Quitar todos los juegos"
+msgstr "Eliminar todos los juegos"
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
msgid "Import"
@@ -229,7 +230,7 @@ msgstr "Steam"
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
#: data/gtk/preferences.blp:234
msgid "Install Location"
-msgstr "Lugar de la instalación"
+msgstr "Ruta de instalación"
#: data/gtk/preferences.blp:106
msgid "Lutris"
@@ -237,7 +238,7 @@ msgstr "Lutris"
#: data/gtk/preferences.blp:119
msgid "Cache Location"
-msgstr "Localización de la caché"
+msgstr "Ruta de la caché"
#: data/gtk/preferences.blp:128
msgid "Import Steam Games"
@@ -245,7 +246,7 @@ msgstr "Importar juegos de Steam"
#: data/gtk/preferences.blp:137
msgid "Import Flatpak Games"
-msgstr "Importar los juegos Flatpak"
+msgstr "Importar juegos Flatpak"
#: data/gtk/preferences.blp:147
msgid "Heroic"
@@ -289,15 +290,15 @@ msgstr "SteamGridDB"
#: data/gtk/preferences.blp:260
msgid "Authentication"
-msgstr "Autentificación"
+msgstr "Autenticación"
#: data/gtk/preferences.blp:263
msgid "API Key"
-msgstr "Código API"
+msgstr "Clave API"
#: data/gtk/preferences.blp:271
msgid "Use SteamGridDB"
-msgstr "Utiliza SteamGridDB"
+msgstr "Usar SteamGridDB"
#: data/gtk/preferences.blp:272
msgid "Download images when adding or importing games"
@@ -532,17 +533,13 @@ msgstr "Seleccione el directorio de la caché {}."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Selecciona el directorio de la instalación {}."
+msgstr "Seleccione el directorio de configuración {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Seleccione el directorio de la caché {}."
+msgstr "Seleccione el directorio de datos {}."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/po/it.po b/po/it.po
index 8368a72..09e83ae 100644
--- a/po/it.po
+++ b/po/it.po
@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-01 15:10+0000\n"
-"Last-Translator: albanobattistella \n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
+"Last-Translator: Alessandro Iepure \n"
"Language-Team: Italian \n"
"Language: it\n"
@@ -87,7 +87,7 @@ msgstr "Titolo"
#: data/gtk/details-window.blp:102
msgid "The title of the game"
-msgstr "Titolo del gioco"
+msgstr "Il titolo del gioco"
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
msgid "Developer"
@@ -273,7 +273,7 @@ msgstr "itch"
#: data/gtk/preferences.blp:216
msgid "Legendary"
-msgstr "Leggendari"
+msgstr "Leggendario"
#: data/gtk/preferences.blp:230
msgid "Flatpak"
@@ -281,7 +281,7 @@ msgstr "Flatpak"
#: data/gtk/preferences.blp:243
msgid "Import Game Launchers"
-msgstr "Importa lanciatori di giochi"
+msgstr "Importa launcher di giochi"
#: data/gtk/preferences.blp:256
msgid "SteamGridDB"
@@ -528,21 +528,17 @@ msgstr "Directory non valida"
#. The variable is the name of the source
#: src/preferences.py:352
msgid "Select the {} cache directory."
-msgstr "Seleziona la directory della cache {}."
+msgstr "Seleziona la directory della cache per {}."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Selezionare la directory di installazione {}."
+msgstr "Selezionare la directory di configurazione per {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Seleziona la directory della cache {}."
+msgstr "Seleziona la directory dati per {}."
#: src/preferences.py:364
msgid "Set Location"
@@ -554,7 +550,7 @@ msgstr "Chiudi"
#: src/store/managers/sgdb_manager.py:47
msgid "Couldn't Authenticate SteamGridDB"
-msgstr "Impossibile eseguire l'autenticazione su SteamGridDB"
+msgstr "Impossibile autenticare SteamGridDB"
#: src/store/managers/sgdb_manager.py:48
msgid "Verify your API key in preferences"
diff --git a/po/nl.po b/po/nl.po
index 1a57d79..b85ed43 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-04 17:29+0000\n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
"Last-Translator: Philip Goto \n"
"Language-Team: Dutch \n"
@@ -134,7 +134,7 @@ msgstr "Algemeen"
#: data/gtk/help-overlay.blp:14
msgid "Quit"
-msgstr "Sluiten"
+msgstr "Afsluiten"
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
#: data/gtk/window.blp:323
@@ -319,7 +319,7 @@ msgstr "Geen games gevonden"
#: data/gtk/window.blp:7 data/gtk/window.blp:15
msgid "Try a different search."
-msgstr "Probeer een andere zoekopdracht"
+msgstr "Probeer een andere zoekopdracht."
#: data/gtk/window.blp:21
msgid "No Games"
@@ -327,7 +327,7 @@ msgstr "Geen games"
#: data/gtk/window.blp:22
msgid "Use the + button to add games."
-msgstr "Gebruik de plusknop om games toe te voegen"
+msgstr "Gebruik de plusknop om games toe te voegen."
#: data/gtk/window.blp:40
msgid "No Hidden Games"
@@ -335,7 +335,7 @@ msgstr "Geen verborgen games"
#: data/gtk/window.blp:41
msgid "Games you hide will appear here."
-msgstr "Games die u verbergt zullen hier verschijnen"
+msgstr "Games die u verbergt zullen hier verschijnen."
#: data/gtk/window.blp:64 data/gtk/window.blp:304
msgid "Back"
@@ -478,11 +478,11 @@ msgstr "Kon game niet toevoegen"
#: src/details_window.py:147 src/details_window.py:181
msgid "Game title cannot be empty."
-msgstr "Game-titel mag niet leeg zijn"
+msgstr "Game-titel mag niet leeg zijn."
#: src/details_window.py:153 src/details_window.py:189
msgid "Executable cannot be empty."
-msgstr "Programmabestand mag niet leeg zijn"
+msgstr "Programmabestand mag niet leeg zijn."
#: src/details_window.py:180 src/details_window.py:188
msgid "Couldn't Apply Preferences"
@@ -523,7 +523,7 @@ msgstr "Installatie niet gevonden"
#: src/preferences.py:286
msgid "Select a valid directory."
-msgstr "Selecteer een geldige map"
+msgstr "Selecteer een geldige map."
#: src/preferences.py:348
msgid "Invalid Directory"
@@ -532,21 +532,17 @@ msgstr "Ongeldige map"
#. The variable is the name of the source
#: src/preferences.py:352
msgid "Select the {} cache directory."
-msgstr "Selecteer de cache-map van {}"
+msgstr "Selecteer de cache-map van {}."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Selecteer de installatiemap van {}"
+msgstr "Selecteer de configuratiemap van {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Selecteer de cache-map van {}"
+msgstr "Selecteer de gegevensmap van {}."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/po/ru.po b/po/ru.po
index 4ea2748..21dde88 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-01 15:10+0000\n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
"Last-Translator: Сергей \n"
"Language-Team: Russian \n"
@@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.0-dev\n"
#: data/hu.kramo.Cartridges.desktop.in:3
@@ -531,17 +531,13 @@ msgstr "Выберите каталог кэша {}."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Выберите каталог установки {}."
+msgstr "Выберите каталог конфигурации {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Выберите каталог кэша {}."
+msgstr "Выберите каталог данных {}."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/po/sv.po b/po/sv.po
index 3fb3b99..d6f1122 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-01 22:51+0000\n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
"Last-Translator: Luna Jernberg \n"
"Language-Team: Swedish \n"
@@ -531,17 +531,13 @@ msgstr "Välj {} cachekatalog."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Välj {} installationskatalog."
+msgstr "Välj {} konfigurationskatalog."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Välj {} cachekatalog."
+msgstr "Välj {} datakatalog."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/po/ta.po b/po/ta.po
index d062757..f609724 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-06-28 20:19+0000\n"
+"PO-Revision-Date: 2023-07-09 07:59+0000\n"
"Last-Translator: \"K.B.Dharun Krishna\" \n"
"Language-Team: Tamil \n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.18.1\n"
+"X-Generator: Weblate 5.0-dev\n"
#: data/hu.kramo.Cartridges.desktop.in:3
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
@@ -46,10 +46,10 @@ msgid ""
"necessary. You can sort and hide games or download cover art from "
"SteamGridDB."
msgstr ""
-"உங்கள் எல்லா விளையாட்டுகளுக்கும் கேட்ரிட்ஜ்கள் ஒரு எளிய விளையாட்டு துவக்கி ஆகும். ஸ்டீம் "
-"(Steam), லுட்ரிஸ் (Lutris), வீரம் (Heroic) மற்றும் பலவற்றிலிருந்து விளையாட்டுகளை "
-"இறக்குமதி செய்வதற்கான ஆதரவை இது கொண்டுள்ளது. நீங்கள் விளையாட்டுகளை வரிசைப்படுத்தலாம் "
-"மற்றும் மறைக்கலாம் அல்லது ஸ்டீம்கிரிட் டிபி (SteamGridDB) இலிருந்து அட்டைப்பட கலையைப் "
+"உங்கள் எல்லா விளையாட்டுகளுக்கும் கேட்ரிட்ஜ்கள் ஒரு எளிய விளையாட்டு துவக்கி "
+"ஆகும். Steam, Lutris, Heroic மற்றும் பலவற்றிலிருந்து விளையாட்டுகளை இறக்குமதி "
+"செய்வதற்கான ஆதரவை இது கொண்டுள்ளது. நீங்கள் விளையாட்டுகளை வரிசைப்படுத்தலாம் "
+"மற்றும் மறைக்கலாம் அல்லது SteamGridDB இலிருந்து அட்டைப்பட கலையைப் "
"பதிவிறக்கலாம்."
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
@@ -222,7 +222,7 @@ msgstr "மூலங்கள்"
#: data/gtk/preferences.blp:92
msgid "Steam"
-msgstr "Steam (ஸ்டீம்)"
+msgstr "Steam"
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
@@ -233,7 +233,7 @@ msgstr "நிறுவல் இடம்"
#: data/gtk/preferences.blp:106
msgid "Lutris"
-msgstr "லூட்ரிஸ்"
+msgstr "Lutris"
#: data/gtk/preferences.blp:119
msgid "Cache Location"
@@ -241,17 +241,15 @@ msgstr "தற்காலிக சேமிப்பு இடம்"
#: data/gtk/preferences.blp:128
msgid "Import Steam Games"
-msgstr "ஸ்டீம் (Steam) விளையாட்டுகளை இறக்குமதி செய்யவும்"
+msgstr "Steam விளையாட்டுகளை இறக்குமதி செய்யவும்"
#: data/gtk/preferences.blp:137
-#, fuzzy
-#| msgid "Import Steam Games"
msgid "Import Flatpak Games"
-msgstr "ஸ்டீம் (Steam) விளையாட்டுகளை இறக்குமதி செய்யவும்"
+msgstr "Flatpak கேம்களை இறக்குமதி செய்யவும்"
#: data/gtk/preferences.blp:147
msgid "Heroic"
-msgstr "Heroic (ஹீரோயிக்)"
+msgstr "Heroic"
#: data/gtk/preferences.blp:160
msgid "Import Epic Games"
@@ -267,29 +265,27 @@ msgstr "பக்க ஏற்றப்பட்ட விளையாட்ட
#: data/gtk/preferences.blp:188
msgid "Bottles"
-msgstr "Bottles (பாட்டில்கள்)"
+msgstr "பாட்டில்கள்"
#: data/gtk/preferences.blp:202
msgid "itch"
-msgstr "அரிப்பு (itch)"
+msgstr "itch"
#: data/gtk/preferences.blp:216
msgid "Legendary"
-msgstr "பழம்பெரும்"
+msgstr "Legendary"
#: data/gtk/preferences.blp:230
msgid "Flatpak"
-msgstr ""
+msgstr "Flatpak"
#: data/gtk/preferences.blp:243
-#, fuzzy
-#| msgid "Game Launcher"
msgid "Import Game Launchers"
-msgstr "விளையாட்டு துவக்கி"
+msgstr "விளையாட்டு துவக்கிகளை இறக்குமதி செய்"
#: data/gtk/preferences.blp:256
msgid "SteamGridDB"
-msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB)"
+msgstr "SteamGridDB"
#: data/gtk/preferences.blp:260
msgid "Authentication"
@@ -301,7 +297,7 @@ msgstr "API விசை"
#: data/gtk/preferences.blp:271
msgid "Use SteamGridDB"
-msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB) ஐப் பயன்படுத்தவும்"
+msgstr "SteamGridDB ஐப் பயன்படுத்தவும்"
#: data/gtk/preferences.blp:272
msgid "Download images when adding or importing games"
@@ -515,43 +511,33 @@ msgstr "அனைத்து விளையாட்டுகளும் அ
msgid ""
"An API key is required to use SteamGridDB. You can generate one {}here{}."
msgstr ""
-"ஸ்டீம்கிரிட் டிபி (SteamGridDB) ஐப் பயன்படுத்த API விசை தேவை. நீங்கள் ஒன்றை {}இங்கே{} "
+"SteamGridDB ஐப் பயன்படுத்த API விசை தேவை. நீங்கள் ஒன்றை {}இங்கே{} "
"உருவாக்கலாம்."
#: src/preferences.py:284
-#, fuzzy
-#| msgid "Installation Not Found"
msgid "Installation Not Found"
msgstr "நிறுவல் கிடைக்கவில்லை"
#: src/preferences.py:286
-#, fuzzy
-#| msgid "Select the {} data directory."
msgid "Select a valid directory."
-msgstr "{} தரவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
+msgstr "சரியான கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
#: src/preferences.py:348
msgid "Invalid Directory"
-msgstr ""
+msgstr "தவறான கோப்பகம்"
#. The variable is the name of the source
#: src/preferences.py:352
-#, fuzzy
-#| msgid "Select the {} data directory."
msgid "Select the {} cache directory."
-msgstr "{} தரவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
+msgstr "{} கேச் கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} configuration directory."
msgid "Select the {} configuration directory."
-msgstr "{} உள்ளமைவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
+msgstr "{} கட்டமைப்பு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} data directory."
msgid "Select the {} data directory."
msgstr "{} தரவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
@@ -565,7 +551,7 @@ msgstr "நிராகரி"
#: src/store/managers/sgdb_manager.py:47
msgid "Couldn't Authenticate SteamGridDB"
-msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB) ஐ அங்கீகரிக்க முடியவில்லை"
+msgstr "SteamGridDB ஐ அங்கீகரிக்க முடியவில்லை"
#: src/store/managers/sgdb_manager.py:48
msgid "Verify your API key in preferences"
diff --git a/po/uk.po b/po/uk.po
index 87d8aa5..2ac3ec9 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: cartridges\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
-"PO-Revision-Date: 2023-07-01 22:51+0000\n"
+"PO-Revision-Date: 2023-07-08 14:52+0000\n"
"Last-Translator: Dan \n"
"Language-Team: Ukrainian \n"
@@ -18,8 +18,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.0-dev\n"
#: data/hu.kramo.Cartridges.desktop.in:3
@@ -534,17 +534,13 @@ msgstr "Виберіть каталог кешу {}."
#. The variable is the name of the source
#: src/preferences.py:355
-#, fuzzy
-#| msgid "Select the {} installation directory."
msgid "Select the {} configuration directory."
-msgstr "Виберіть каталог встановлення {}."
+msgstr "Виберіть каталог конфігурації {}."
#. The variable is the name of the source
#: src/preferences.py:358
-#, fuzzy
-#| msgid "Select the {} cache directory."
msgid "Select the {} data directory."
-msgstr "Виберіть каталог кешу {}."
+msgstr "Виберіть каталог даних {}."
#: src/preferences.py:364
msgid "Set Location"
diff --git a/src/importer/sources/heroic_source.py b/src/importer/sources/heroic_source.py
index aba4310..716c222 100644
--- a/src/importer/sources/heroic_source.py
+++ b/src/importer/sources/heroic_source.py
@@ -81,7 +81,7 @@ class HeroicSourceIterator(SourceIterator):
runner = entry["runner"]
service = self.sub_sources[runner]["service"]
values = {
- "source": self.source.id,
+ "source": f"{self.source.id}_{service}",
"added": added_time,
"name": entry["title"],
"developer": entry.get("developer", None),
@@ -159,4 +159,4 @@ class HeroicSource(URLExecutableSource):
@property
def game_id_format(self) -> str:
"""The string format used to construct game IDs"""
- return self.name.lower() + "_{service}_{game_id}"
+ return self.id + "_{service}_{game_id}"
diff --git a/src/importer/sources/legendary_source.py b/src/importer/sources/legendary_source.py
index 2c215ca..5b8a2a3 100644
--- a/src/importer/sources/legendary_source.py
+++ b/src/importer/sources/legendary_source.py
@@ -92,7 +92,7 @@ class LegendarySourceIterator(SourceIterator):
class LegendarySource(Source):
name = "Legendary"
executable_format = "legendary launch {app_name}"
- available_on = {"linux", "win32"}
+ available_on = {"linux"}
iterator_class = LegendarySourceIterator
config_location: Location = Location(
diff --git a/src/main.py b/src/main.py
index feb4b13..c6c9136 100644
--- a/src/main.py
+++ b/src/main.py
@@ -19,6 +19,7 @@
import json
import lzma
+import os
import sys
import gi
@@ -49,6 +50,7 @@ from src.store.managers.online_cover_manager import OnlineCoverManager
from src.store.managers.sgdb_manager import SGDBManager
from src.store.managers.steam_api_manager import SteamAPIManager
from src.store.store import Store
+from src.utils.migrate_files_v1_to_v2 import migrate_files_v1_to_v2
from src.window import CartridgesWindow
@@ -65,6 +67,12 @@ class CartridgesApplication(Adw.Application):
def do_activate(self): # pylint: disable=arguments-differ
"""Called on app creation"""
+ setup_logging()
+ log_system_info()
+
+ if os.name == "nt":
+ migrate_files_v1_to_v2()
+
# Set fallback icon-name
Gtk.Window.set_default_icon_name(shared.APP_ID)
@@ -292,7 +300,5 @@ class CartridgesApplication(Adw.Application):
def main(_version):
"""App entry point"""
- setup_logging()
- log_system_info()
app = CartridgesApplication()
return app.run(sys.argv)
diff --git a/src/utils/migrate_files_v1_to_v2.py b/src/utils/migrate_files_v1_to_v2.py
new file mode 100644
index 0000000..ae68741
--- /dev/null
+++ b/src/utils/migrate_files_v1_to_v2.py
@@ -0,0 +1,128 @@
+# migrate_files_v1_to_v2.py
+#
+# Copyright 2023 Geoffrey Coulaud
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+import json
+import logging
+from pathlib import Path
+
+from src import shared
+
+old_data_dir = Path.home() / ".local" / "share"
+old_cartridges_data_dir = old_data_dir / "cartridges"
+migrated_file_path = old_cartridges_data_dir / ".migrated"
+old_games_dir = old_cartridges_data_dir / "games"
+old_covers_dir = old_cartridges_data_dir / "covers"
+
+
+def migrate_game_covers(game_path: Path):
+ """Migrate a game covers from a source game path to the current dir"""
+ for suffix in (".tiff", ".gif"):
+ cover_path = old_covers_dir / game_path.with_suffix(suffix).name
+ if not cover_path.is_file():
+ continue
+ destination_cover_path = shared.covers_dir / cover_path.name
+ logging.info("Moving %s -> %s", str(cover_path), str(destination_cover_path))
+ cover_path.rename(destination_cover_path)
+
+
+def migrate_files_v1_to_v2():
+ """
+ Migrate user data from the v1.X locations to the latest location.
+
+ Fix for commit 4a204442b5d8ba2e918f8c2605d72e483bf35efd
+ where the windows directories for data, config and cache changed.
+ """
+
+ # Skip if there is no old dir
+ # Skip if old == current
+ # Skip if already migrated
+ if (
+ not old_data_dir.is_dir()
+ or str(old_data_dir) == str(shared.data_dir)
+ or migrated_file_path.is_file()
+ ):
+ return
+
+ logging.info("Migrating data dir %s", str(old_data_dir))
+
+ # Create the current data dir if needed
+ if not shared.data_dir.is_dir():
+ shared.data_dir.mkdir(parents=True)
+
+ old_game_paths = set(old_games_dir.glob("*.json"))
+ old_imported_game_paths = set(
+ filter(lambda path: path.name.startswith("imported_"), old_game_paths)
+ )
+ old_other_game_paths = old_game_paths - old_imported_game_paths
+
+ # Discover current imported games
+ imported_game_number = 0
+ imported_execs = set()
+ for game_path in shared.games_dir.glob("imported_*.json"):
+ try:
+ game_data = json.load(game_path.open("r"))
+ except (OSError, json.JSONDecodeError):
+ continue
+ number = int(game_data["game_id"].replace("imported_", ""))
+ imported_game_number = max(number, imported_game_number)
+ imported_execs.add(game_data["executable"])
+
+ # Migrate imported game files
+ for game_path in old_imported_game_paths:
+ try:
+ game_data = json.load(game_path.open("r"))
+ except (OSError, json.JSONDecodeError):
+ continue
+
+ # Don't migrate if there's a game with the same exec
+ if game_data["executable"] in imported_execs:
+ continue
+
+ # Migrate with updated index
+ imported_game_number += 1
+ game_id = f"imported_{imported_game_number}"
+ game_data["game_id"] = game_id
+ destination_game_path = shared.games_dir / f"{game_id}.json"
+ logging.info(
+ "Moving (updated id) %s -> %s", str(game_path), str(destination_game_path)
+ )
+ json.dump(
+ game_data,
+ destination_game_path.open("w"),
+ indent=4,
+ sort_keys=True,
+ )
+ game_path.unlink()
+ migrate_game_covers(game_path)
+
+ # Migrate all other games
+ for game_path in old_other_game_paths:
+ # Do nothing if already in games dir
+ destination_game_path = shared.games_dir / game_path.name
+ if destination_game_path.exists():
+ continue
+
+ # Else, migrate the game
+ logging.info("Moving %s -> %s", str(game_path), str(destination_game_path))
+ game_path.rename(destination_game_path)
+ migrate_game_covers(game_path)
+
+ # Signal that this dir is migrated
+ migrated_file_path.touch()
+ logging.info("Migration done")