Compare commits

...

37 Commits

Author SHA1 Message Date
Blakyrin
76cb913be7 Revert "Improve UX for COSMIC"
This reverts commit 239420148a.

Please Stop Theming My App should be focused on distros or packagers theming the apps, shipping them broken, it's not user's fault as they don't know what is going on.
popOS is one of the most used distros, and most of their users are new users that saw them in YouTube, please don't break their experience.
2024-08-11 18:21:43 +00:00
dependabot[bot]
0a50072e2c Bump softprops/action-gh-release from 2.0.6 to 2.0.8 (#285)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.6 to 2.0.8.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2.0.6...v2.0.8)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-02 14:52:41 +02:00
kramo
e5287c9d3f Type hint GTK template imports 2024-07-30 09:32:37 +02:00
kramo
22a755c2e4 Type hint shared module 2024-07-30 09:00:49 +02:00
kramo
239420148a Improve UX for COSMIC 2024-07-18 15:34:22 +02:00
kramo
35acb56a62 v2.9.3 2024-07-18 11:39:58 +02:00
Hosted Weblate
adacdefdb9 Translated using Weblate (Persian)
Currently translated at 100.0% (140 of 140 strings)

Co-authored-by: آوید <avds+git@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/fa/
Translation: Cartridges/Cartridges
2024-07-18 09:30:35 +00:00
kramo
7367e40cb3 Fix #281 2024-07-18 11:30:28 +02:00
kramo
7efa17915f v2.9.2 2024-07-11 01:34:13 +02:00
kramo
bdcded93f3 v2.9.1 2024-07-11 01:22:08 +02:00
kramo
b3a65c3d23 Move ApplicationDelegate to separate module 2024-07-11 01:18:26 +02:00
kramo
06730248a9 Build without WebP TIFF compression in macOS CI 2024-07-10 22:34:42 +02:00
kramo
b46faa951f Improve macOS menu bar 2024-07-10 22:17:59 +02:00
kramo
43a04e7d44 Quote game names in search URLs 2024-07-10 22:00:40 +02:00
kramo
d74c8aba1a Use menu bar on macOS 2024-07-10 21:56:02 +02:00
kramo
eac6d63010 v2.9 2024-07-10 16:22:10 +02:00
kramo
beda52b575 Add macOS documentation 2024-07-10 16:10:06 +02:00
Weblate (bot)
13cefac34d Translated using Weblate (Czech) (#271)
Currently translated at 100.0% (140 of 140 strings)


Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/cs/
Translation: Cartridges/Cartridges

Co-authored-by: foo expert <deferred_water346@simplelogin.com>
2024-07-10 16:03:21 +02:00
kramo
d79686b9a1 Fix Windows CI 2024-07-10 15:31:52 +02:00
kramo
eff60d5990 Add macOS CI 2024-07-10 15:26:17 +02:00
kramo
823641d909 Make Heroic and itch sources available on macOS 2024-07-10 15:12:47 +02:00
kramo
6c2ab8099b macOS Improvements 2024-07-10 14:02:37 +02:00
Brage Fuglseth
d8137871c5 readme: Update Flathub badge (#277)
See https://fosstodon.org/@bragefuglseth/112753049810610017. This primarily serves as a way to let me sleep at night again.
2024-07-09 15:27:30 +02:00
kramo
f396a4679c Fix weird spacing in header bar 2024-07-08 16:19:00 +02:00
kramo
c1226197f8 Don't horizontally scroll sidebar 2024-07-08 15:49:31 +02:00
kramo
8504689426 Simplify Meson 2024-07-08 15:37:18 +02:00
dependabot[bot]
aafc64023c Bump softprops/action-gh-release from 2.0.5 to 2.0.6 (#273)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.5 to 2.0.6.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2.0.5...v2.0.6)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-01 20:06:05 +02:00
dependabot[bot]
eab96edfc7 Bump dawidd6/action-download-artifact from 3.1.4 to 6 (#274)
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.1.4 to 6.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](https://github.com/dawidd6/action-download-artifact/compare/v3.1.4...v6)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-01 20:05:54 +02:00
kramo
72f15ba7fd Add .DS_Store to .gitignore 2024-07-01 11:32:19 +02:00
kramo
63a797ce33 Add Steam darwin library location 2024-06-29 09:37:55 +02:00
kramo
8640e37252 Add Steam darwin logic 2024-06-29 03:14:07 +02:00
kramo
57db530af5 Better cross-platform logic in catrridges.in 2024-06-29 03:01:28 +02:00
kramo
bfff596c39 v2.8.5 2024-05-25 13:07:30 +02:00
Weblate (bot)
d09d27517e Translations update from Hosted Weblate (#253)
* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (140 of 140 strings)

Co-authored-by: Filipe Motta <luiz_filipe_motta@hotmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/pt_BR/
Translation: Cartridges/Cartridges

* Translated using Weblate (Hindi)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hindi)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hindi)

Currently translated at 100.0% (140 of 140 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/hi/
Translation: Cartridges/Cartridges

* Translated using Weblate (Polish)

Currently translated at 82.1% (115 of 140 strings)

Co-authored-by: Karol <k.derbotprogramista@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/pl/
Translation: Cartridges/Cartridges

---------

Co-authored-by: Filipe Motta <luiz_filipe_motta@hotmail.com>
Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
Co-authored-by: Karol <k.derbotprogramista@gmail.com>
2024-05-25 13:02:31 +02:00
kramo
33c83b65d9 Revert "Don't blacklist games on failed API calls"
This reverts commit 124d2c8ec7.

Probably did more harm than good. You can't win though.
2024-05-25 12:59:01 +02:00
kramo
942be92a9e Change incorrect version number
Fixes #266
2024-05-25 12:51:09 +02:00
K.B.Dharun Krishna
ed31a2f61e chore: bump actions, image to G46, add dependabot config
Signed-off-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com>
2024-05-09 19:30:08 +02:00
40 changed files with 735 additions and 331 deletions

6
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"

View File

@@ -1,8 +1,9 @@
name: CI
on: on:
push: push:
branches: [main] branches: [main]
pull_request: pull_request:
name: CI
concurrency: concurrency:
group: release-${{ github.sha }} group: release-${{ github.sha }}
jobs: jobs:
@@ -10,17 +11,17 @@ jobs:
name: Flatpak name: Flatpak
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: bilelmoussaoui/flatpak-github-actions:gnome-45 image: bilelmoussaoui/flatpak-github-actions:gnome-46
options: --privileged options: --privileged
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Flatpak Builder - name: Flatpak Builder
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3 uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3
with: with:
bundle: page.kramo.Cartridges.Devel.flatpak bundle: page.kramo.Cartridges.Devel.flatpak
manifest-path: flatpak/page.kramo.Cartridges.Devel.json manifest-path: build-aux/flatpak/page.kramo.Cartridges.Devel.json
windows: windows:
name: Windows name: Windows
@@ -50,10 +51,49 @@ jobs:
timeout 2 cartridges; [ "$?" -eq "124" ] timeout 2 cartridges; [ "$?" -eq "124" ]
- name: Inno Setup - name: Inno Setup
run: iscc ".\_build\windows\Cartridges.iss" run: iscc ".\_build\build-aux\windows\Cartridges.iss"
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: Windows Installer name: Windows Installer
path: _build/windows/Output/Cartridges Setup.exe path: _build/build-aux/windows/Output/Cartridges Windows.exe
macos:
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Homebrew
id: set-up-homebrew
uses: Homebrew/actions/setup-homebrew@master
- name: Install Dependencies
run: |
brew install meson pygobject3 libadwaita adwaita-icon-theme desktop-file-utils pyinstaller pillow
pip3 install --break-system-packages requests PyYAML pyobjc
- name: Meson Build
run: |
meson setup _build -Dtiff_compression=jpeg
ninja install -C _build
- name: PyInstaller
env:
PYTHONPATH: /opt/homebrew/opt/homebrew/lib/python3.12/site-packages
run: |
cd build-aux/macos
pyinstaller ./cartridges.spec
- name: Zip
run: |
cd build-aux/macos/dist
zip -yr Cartridges\ macOS.zip Cartridges.app
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
path: build-aux/macos/dist/Cartridges macOS.zip
name: macOS Application

View File

@@ -1,10 +1,11 @@
name: Publish Release
on: on:
push: push:
tags: tags: "*"
"*"
name: Publish Release
concurrency: concurrency:
group: release-${{ github.sha }} group: release-${{ github.sha }}
jobs: jobs:
publish-release: publish-release:
name: Publish Release name: Publish Release
@@ -14,7 +15,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Download workflow artifact - name: Download workflow artifact
uses: dawidd6/action-download-artifact@v3.0.0 uses: dawidd6/action-download-artifact@v6
with: with:
workflow: ci.yml workflow: ci.yml
commit: ${{ github.sha }} commit: ${{ github.sha }}
@@ -37,9 +38,11 @@ jobs:
run: echo tag_name=${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT run: echo tag_name=${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT
- name: Publish release - name: Publish release
uses: softprops/action-gh-release@v0.1.15 uses: softprops/action-gh-release@v2.0.8
with: with:
files: Windows Installer/Cartridges Setup.exe files: |
Windows Installer/Cartridges Windows.exe
macOS Application/Cartridges macOS.zip
fail_on_unmatched_files: true fail_on_unmatched_files: true
tag_name: ${{ steps.get_tag_name.outputs.tag_name }} tag_name: ${{ steps.get_tag_name.outputs.tag_name }}
body_path: release_notes body_path: release_notes

3
.gitignore vendored
View File

@@ -1,4 +1,7 @@
/subprojects/blueprint-compiler /subprojects/blueprint-compiler
/build-aux/macos/build
/build-aux/macos/dist
/.flatpak /.flatpak
/.flatpak-builder /.flatpak-builder
/.vscode /.vscode
.DS_Store

View File

@@ -33,6 +33,11 @@ The project can be translated on [Weblate](https://hosted.weblate.org/engage/car
2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml). 2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml).
3. Build it via Meson. 3. Build it via Meson.
## For macOS
1. Install [Homebrew](https://brew.sh/).
2. Using `brew` and `pip3`, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml).
3. Build it via Meson.
## Meson ## Meson
```bash ```bash
git clone https://github.com/kra-mo/cartridges.git git clone https://github.com/kra-mo/cartridges.git

View File

@@ -65,11 +65,9 @@ Thank you for your generosity! 💜
## Linux ## Linux
### Flathub
The app is available on Flathub. The app is available on Flathub.
<a href=https://flathub.org/apps/page.kramo.Cartridges><img width='240' alt='Download on Flathub' src='https://dl.flathub.org/assets/badges/flathub-badge-en.png'/></a> <a href=https://flathub.org/apps/page.kramo.Cartridges><img alt='Download on Flathub' src='https://flathub.org/api/badge?svg&locale=en'/></a>
## Windows ## Windows
@@ -84,6 +82,13 @@ Note: Windows might present you with a warning when trying to install the app. T
Install the latest release with the command: `winget install cartridges`. Install the latest release with the command: `winget install cartridges`.
## macOS
1. Download the latest release from [Releases](https://github.com/kra-mo/cartridges/releases).
2. Move the app into your Applications folder.
Note: macOS might tell you that the application could not be checked for malicious software or something similar. In this case, open System Settings > Privacy & Security, scroll down, find the warning about Cartridges and click "Open Anyway". More information can be found [here](https://support.apple.com/en-us/102445).
## Building manually ## Building manually
See [Building](https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md#building). See [Building](https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md#building).

View File

@@ -130,7 +130,7 @@
"sources" : [ "sources" : [
{ {
"type" : "dir", "type" : "dir",
"path" : ".." "path" : "../.."
} }
] ]
} }

View File

@@ -0,0 +1,59 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
["../../_build/cartridges/cartridges"],
pathex=[],
binaries=[],
datas=[("../../_build/data/cartridges.gresource", "Resources")],
hiddenimports=[],
hookspath=[],
hooksconfig={
"gi": {
"module-versions": {
"Gtk": "4.0",
},
},
},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name="Cartridges",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name="Cartridges",
)
app = BUNDLE(
coll,
name="Cartridges.app",
icon="./icon.icns",
bundle_identifier="page.kramo.Cartridges",
info_plist={
"LSApplicationCategoryType": "public.app-category.games",
},
)

BIN
build-aux/macos/icon.icns Normal file

Binary file not shown.

View File

@@ -15,10 +15,10 @@ AppSupportURL=https://github.com/kra-mo/cartridges/issues
AppUpdatesURL={#MyAppURL} AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf64}\{#MyAppName} DefaultDirName={autopf64}\{#MyAppName}
DisableProgramGroupPage=yes DisableProgramGroupPage=yes
LicenseFile=..\..\LICENSE LicenseFile=..\..\..\LICENSE
PrivilegesRequiredOverridesAllowed=dialog PrivilegesRequiredOverridesAllowed=dialog
OutputBaseFilename=Cartridges Setup OutputBaseFilename=Cartridges Windows
SetupIconFile=..\..\windows\icon.ico SetupIconFile=..\..\..\build-aux\windows\icon.ico
Compression=lzma Compression=lzma
SolidCompression=yes SolidCompression=yes
WizardStyle=modern WizardStyle=modern
@@ -49,7 +49,7 @@ Source: "D:\a\_temp\msys64\ucrt64\share\icons\*"; DestDir: "{app}\share\icons";
Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-2.0"; Flags: recursesubdirs ignoreversion Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-2.0"; Flags: recursesubdirs ignoreversion
Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion
Source: "..\..\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion Source: "..\..\..\build-aux\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
[Icons] [Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico" Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico"

View File

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -3,5 +3,5 @@ configure_file(
output: 'Cartridges.iss', output: 'Cartridges.iss',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: '.' install_dir: '.',
) )

View File

@@ -0,0 +1,121 @@
# application_delegate.py
#
# Copyright 2024 kramo
#
# 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 <https://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""A set of methods that manage your apps life cycle and its interaction
with common system services."""
from typing import Any
from AppKit import NSApp, NSApplication, NSMenu, NSMenuItem # type: ignore
from Foundation import NSObject # type: ignore
from gi.repository import Gio # type: ignore
from cartridges import shared
class ApplicationDelegate(NSObject): # type: ignore
"""A set of methods that manage your apps life cycle and its interaction
with common system services."""
def applicationDidFinishLaunching_(self, *_args: Any) -> None:
main_menu = NSApp.mainMenu()
add_game_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Add Game", "add:", "n"
)
import_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Import", "import:", "i"
)
file_menu = NSMenu.alloc().init()
file_menu.addItem_(add_game_menu_item)
file_menu.addItem_(import_menu_item)
file_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"File", None, ""
)
file_menu_item.setSubmenu_(file_menu)
main_menu.addItem_(file_menu_item)
show_hidden_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Show Hidden", "hidden:", "h"
)
windows_menu = NSMenu.alloc().init()
view_menu = NSMenu.alloc().init()
view_menu.addItem_(show_hidden_menu_item)
view_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"View", None, ""
)
view_menu_item.setSubmenu_(view_menu)
main_menu.addItem_(view_menu_item)
windows_menu = NSMenu.alloc().init()
windows_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Window", None, ""
)
windows_menu_item.setSubmenu_(windows_menu)
main_menu.addItem_(windows_menu_item)
NSApp.setWindowsMenu_(windows_menu)
keyboard_shortcuts_menu_item = (
NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Keyboard Shortcuts", "shortcuts:", "?"
)
)
help_menu = NSMenu.alloc().init()
help_menu.addItem_(keyboard_shortcuts_menu_item)
help_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
"Help", None, ""
)
help_menu_item.setSubmenu_(help_menu)
main_menu.addItem_(help_menu_item)
NSApp.setHelpMenu_(help_menu)
def add_(self, *_args: Any) -> None:
if (not shared.win) or (not (app := shared.win.get_application())):
return
app.lookup_action("add_game").activate()
def import_(self, *_args: Any) -> None:
if (not shared.win) or (not (app := shared.win.get_application())):
return
app.lookup_action("import").activate()
def hidden_(self, *_args: Any) -> None:
if not shared.win:
return
shared.win.lookup_action("show_hidden").activate()
def shortcuts_(self, *_args: Any) -> None:
if (not shared.win) or (not (overlay := shared.win.get_help_overlay())):
return
overlay.present()

View File

@@ -2,7 +2,7 @@
# cartridges.in # cartridges.in
# #
# Copyright 2022-2023 kramo # Copyright 2022-2024 kramo
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -24,6 +24,8 @@ import locale
import os import os
import signal import signal
import sys import sys
from pathlib import Path
from platform import system
VERSION = "@VERSION@" VERSION = "@VERSION@"
@@ -36,7 +38,7 @@ else:
sys.path.insert(1, PKGDATADIR) sys.path.insert(1, PKGDATADIR)
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)
if os.name != "nt": if system() == "Linux":
locale.bindtextdomain("cartridges", LOCALEDIR) locale.bindtextdomain("cartridges", LOCALEDIR)
locale.textdomain("cartridges") locale.textdomain("cartridges")
gettext.install("cartridges", LOCALEDIR) gettext.install("cartridges", LOCALEDIR)
@@ -44,9 +46,15 @@ else:
gettext.install("cartridges") gettext.install("cartridges")
if __name__ == "__main__": if __name__ == "__main__":
from gi.repository import Gio from gi.repository import Gio, GLib
resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource")) try:
# For a macOS application bundle
resource = Gio.Resource.load(
str(Path(__file__).parent / "Resources" / "cartridges.gresource")
)
except GLib.GError:
resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource"))
resource._register() # pylint: disable=protected-access resource._register() # pylint: disable=protected-access
from cartridges import main from cartridges import main

View File

@@ -17,9 +17,11 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import os # pyright: reportAssignmentType=none
import shlex import shlex
from pathlib import Path from pathlib import Path
from sys import platform
from time import time from time import time
from typing import Any, Optional from typing import Any, Optional
@@ -40,28 +42,35 @@ from cartridges.utils.save_cover import convert_cover, save_cover
class DetailsDialog(Adw.Dialog): class DetailsDialog(Adw.Dialog):
__gtype_name__ = "DetailsDialog" __gtype_name__ = "DetailsDialog"
cover_overlay = Gtk.Template.Child() cover_overlay: Gtk.Overlay = Gtk.Template.Child()
cover = Gtk.Template.Child() cover: Gtk.Picture = Gtk.Template.Child()
cover_button_edit = Gtk.Template.Child() cover_button_edit: Gtk.Button = Gtk.Template.Child()
cover_button_delete_revealer = Gtk.Template.Child() cover_button_delete_revealer: Gtk.Revealer = Gtk.Template.Child()
cover_button_delete = Gtk.Template.Child() cover_button_delete: Gtk.Button = Gtk.Template.Child()
spinner = Gtk.Template.Child() spinner: Gtk.Spinner = Gtk.Template.Child()
name = Gtk.Template.Child() name: Adw.EntryRow = Gtk.Template.Child()
developer = Gtk.Template.Child() developer: Adw.EntryRow = Gtk.Template.Child()
executable = Gtk.Template.Child() executable: Adw.EntryRow = Gtk.Template.Child()
exec_info_label = Gtk.Template.Child() exec_info_label: Gtk.Label = Gtk.Template.Child()
exec_info_popover = Gtk.Template.Child() exec_info_popover: Gtk.Popover = Gtk.Template.Child()
file_chooser_button = Gtk.Template.Child() file_chooser_button: Gtk.Button = Gtk.Template.Child()
apply_button = Gtk.Template.Child() apply_button: Gtk.Button = Gtk.Template.Child()
cover_changed: bool = False cover_changed: bool = False
is_open: bool = False
def __init__(self, game: Optional[Game] = None, **kwargs: Any): def __init__(self, game: Optional[Game] = None, **kwargs: Any):
super().__init__(**kwargs) super().__init__(**kwargs)
self.game: Game = game
# Make it so only one dialog can be open at a time
self.__class__.is_open = True
self.connect("closed", lambda *_: self.set_is_open(False))
self.game: Optional[Game] = game
self.game_cover: GameCover = GameCover({self.cover}) self.game_cover: GameCover = GameCover({self.cover})
if self.game: if self.game:
@@ -106,7 +115,7 @@ class DetailsDialog(Adw.Dialog):
# As in software # As in software
exe_name = _("program") exe_name = _("program")
if os.name == "nt": if platform == "win32":
exe_name += ".exe" exe_name += ".exe"
# Translate this string as you would translate "path to {}" # Translate this string as you would translate "path to {}"
exe_path = _("C:\\path\\to\\{}").format(exe_name) exe_path = _("C:\\path\\to\\{}").format(exe_name)
@@ -118,7 +127,7 @@ class DetailsDialog(Adw.Dialog):
exe_path = _("/path/to/{}").format(exe_name) exe_path = _("/path/to/{}").format(exe_name)
# Translate this string as you would translate "path to {}" # Translate this string as you would translate "path to {}"
file_path = _("/path/to/{}").format(file_name) file_path = _("/path/to/{}").format(file_name)
command = "xdg-open" command = "open" if platform == "darwin" else "xdg-open"
# pylint: disable=line-too-long # pylint: disable=line-too-long
exec_info_text = _( exec_info_text = _(
@@ -325,3 +334,6 @@ class DetailsDialog(Adw.Dialog):
def choose_cover(self, *_args: Any) -> None: def choose_cover(self, *_args: Any) -> None:
self.image_file_dialog.open(self.get_root(), None, self.set_cover) self.image_file_dialog.open(self.get_root(), None, self.set_cover)
def set_is_open(self, is_open: bool) -> None:
self.__class__.is_open = is_open

View File

@@ -355,7 +355,7 @@ class HeroicSource(URLExecutableSource):
name = _("Heroic") name = _("Heroic")
iterable_class = HeroicSourceIterable iterable_class = HeroicSourceIterable
url_format = "heroic://launch/{runner}/{app_name}" url_format = "heroic://launch/{runner}/{app_name}"
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
locations: HeroicLocations locations: HeroicLocations
@@ -377,6 +377,7 @@ class HeroicSource(URLExecutableSource):
/ "config" / "config"
/ "heroic", / "heroic",
shared.appdata_dir / "heroic", shared.appdata_dir / "heroic",
shared.app_support_dir / "heroic",
), ),
paths={ paths={
"config.json": LocationSubPath("config.json"), "config.json": LocationSubPath("config.json"),

View File

@@ -81,7 +81,7 @@ class ItchSource(URLExecutableSource):
name = _("itch") name = _("itch")
iterable_class = ItchSourceIterable iterable_class = ItchSourceIterable
url_format = "itch://caves/{cave_id}/launch" url_format = "itch://caves/{cave_id}/launch"
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
locations: ItchLocations locations: ItchLocations
@@ -95,6 +95,7 @@ class ItchSource(URLExecutableSource):
shared.config_dir / "itch", shared.config_dir / "itch",
shared.host_config_dir / "itch", shared.host_config_dir / "itch",
shared.appdata_dir / "itch", shared.appdata_dir / "itch",
shared.app_support_dir / "itch",
), ),
paths={ paths={
"butler.db": LocationSubPath("db/butler.db"), "butler.db": LocationSubPath("db/butler.db"),

View File

@@ -125,6 +125,8 @@ class URLExecutableSource(ExecutableFormatSource):
return "start " + self.url_format return "start " + self.url_format
case "linux": case "linux":
return "xdg-open " + self.url_format return "xdg-open " + self.url_format
case "darwin":
return "open " + self.url_format
case other: case other:
raise NotImplementedError( raise NotImplementedError(
f"No URL handler command available for {other}" f"No URL handler command available for {other}"

View File

@@ -112,7 +112,7 @@ class SteamLocations(NamedTuple):
class SteamSource(URLExecutableSource): class SteamSource(URLExecutableSource):
source_id = "steam" source_id = "steam"
name = _("Steam") name = _("Steam")
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
iterable_class = SteamSourceIterable iterable_class = SteamSourceIterable
url_format = "steam://rungameid/{game_id}" url_format = "steam://rungameid/{game_id}"
@@ -128,6 +128,7 @@ class SteamSource(URLExecutableSource):
shared.data_dir / "Steam", shared.data_dir / "Steam",
shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam", shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam",
shared.programfiles32_dir / "Steam", shared.programfiles32_dir / "Steam",
shared.app_support_dir / "Steam",
), ),
paths={ paths={
"libraryfolders.vdf": LocationSubPath( "libraryfolders.vdf": LocationSubPath(

View File

@@ -24,6 +24,7 @@ import shlex
import sys import sys
from time import time from time import time
from typing import Any, Optional from typing import Any, Optional
from urllib.parse import quote
import gi import gi
@@ -40,7 +41,7 @@ from cartridges.importer.bottles_source import BottlesSource
from cartridges.importer.desktop_source import DesktopSource from cartridges.importer.desktop_source import DesktopSource
from cartridges.importer.flatpak_source import FlatpakSource from cartridges.importer.flatpak_source import FlatpakSource
from cartridges.importer.heroic_source import HeroicSource from cartridges.importer.heroic_source import HeroicSource
from cartridges.importer.importer import Importer from cartridges.importer.importer import Importer # yo dawg
from cartridges.importer.itch_source import ItchSource from cartridges.importer.itch_source import ItchSource
from cartridges.importer.legendary_source import LegendarySource from cartridges.importer.legendary_source import LegendarySource
from cartridges.importer.lutris_source import LutrisSource from cartridges.importer.lutris_source import LutrisSource
@@ -57,6 +58,12 @@ from cartridges.store.store import Store
from cartridges.utils.run_executable import run_executable from cartridges.utils.run_executable import run_executable
from cartridges.window import CartridgesWindow from cartridges.window import CartridgesWindow
if sys.platform == "darwin":
from AppKit import NSApp # type: ignore
from PyObjCTools import AppHelper
from cartridges.application_delegate import ApplicationDelegate
class CartridgesApplication(Adw.Application): class CartridgesApplication(Adw.Application):
state = shared.AppState.DEFAULT state = shared.AppState.DEFAULT
@@ -87,10 +94,24 @@ class CartridgesApplication(Adw.Application):
self.add_main_option_entries((search, launch)) self.add_main_option_entries((search, launch))
if sys.platform == "darwin":
if settings := Gtk.Settings.get_default():
settings.props.gtk_decoration_layout = "close,minimize,maximize:"
def setup_app_delegate() -> None:
NSApp.setDelegate_(ApplicationDelegate.alloc().init()) # type: ignore
AppHelper.runEventLoop() # type: ignore
GLib.Thread.new(None, setup_app_delegate)
def do_activate(self) -> None: # pylint: disable=arguments-differ def do_activate(self) -> None: # pylint: disable=arguments-differ
"""Called on app creation""" """Called on app creation"""
setup_logging() try:
setup_logging()
except ValueError:
pass
log_system_info() log_system_info()
# Set fallback icon-name # Set fallback icon-name
@@ -280,7 +301,7 @@ class CartridgesApplication(Adw.Application):
_parameter: Any = None, _parameter: Any = None,
page_name: Optional[str] = None, page_name: Optional[str] = None,
expander_row: Optional[str] = None, expander_row: Optional[str] = None,
) -> CartridgesWindow: ) -> Optional[CartridgesPreferences]:
if CartridgesPreferences.is_open: if CartridgesPreferences.is_open:
return return
@@ -303,6 +324,9 @@ class CartridgesApplication(Adw.Application):
DetailsDialog(shared.win.active_game).present(shared.win) DetailsDialog(shared.win.active_game).present(shared.win)
def on_add_game_action(self, *_args: Any) -> None: def on_add_game_action(self, *_args: Any) -> None:
if DetailsDialog.is_open:
return
DetailsDialog().present(shared.win) DetailsDialog().present(shared.win)
def on_import_action(self, *_args: Any) -> None: def on_import_action(self, *_args: Any) -> None:
@@ -345,7 +369,7 @@ class CartridgesApplication(Adw.Application):
self.on_remove_game_action() self.on_remove_game_action()
def search(self, uri: str) -> None: def search(self, uri: str) -> None:
Gio.AppInfo.launch_default_for_uri(f"{uri}{shared.win.active_game.name}") Gio.AppInfo.launch_default_for_uri(f"{uri}{quote(shared.win.active_game.name)}")
def on_igdb_search_action(self, *_args: Any) -> None: def on_igdb_search_action(self, *_args: Any) -> None:
self.search("https://www.igdb.com/search?type=1&q=") self.search("https://www.igdb.com/search?type=1&q=")
@@ -375,7 +399,11 @@ class CartridgesApplication(Adw.Application):
if action[1:2]: if action[1:2]:
self.set_accels_for_action( self.set_accels_for_action(
f"app.{action[0]}" if scope == self else f"win.{action[0]}", f"app.{action[0]}" if scope == self else f"win.{action[0]}",
action[1], (
tuple(s.replace("<primary>", "<meta>") for s in action[1])
if sys.platform == "darwin"
else action[1]
),
) )
scope.add_action(simple_action) scope.add_action(simple_action)

View File

@@ -1,11 +1,11 @@
moduledir = join_paths(python_dir, 'cartridges') moduledir = python_dir / 'cartridges'
configure_file( configure_file(
input: 'cartridges.in', input: 'cartridges.in',
output: 'cartridges', output: 'cartridges',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: get_option('bindir') install_dir: get_option('bindir'),
) )
install_subdir('importer', install_dir: moduledir) install_subdir('importer', install_dir: moduledir)
@@ -15,17 +15,14 @@ install_subdir('logging', install_dir: moduledir)
install_subdir('errors', install_dir: moduledir) install_subdir('errors', install_dir: moduledir)
install_data( install_data(
[ [
'application_delegate.py',
'main.py', 'main.py',
'window.py', 'window.py',
'preferences.py', 'preferences.py',
'details_dialog.py', 'details_dialog.py',
'game.py', 'game.py',
'game_cover.py', 'game_cover.py',
configure_file( configure_file(input: 'shared.py.in', output: 'shared.py', configuration: conf),
input: 'shared.py.in',
output: 'shared.py',
configuration: conf
)
], ],
install_dir: moduledir install_dir: moduledir,
) )

View File

@@ -17,6 +17,8 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# pyright: reportAssignmentType=none
import logging import logging
import re import re
from pathlib import Path from pathlib import Path
@@ -30,6 +32,7 @@ from cartridges import shared
from cartridges.errors.friendly_error import FriendlyError from cartridges.errors.friendly_error import FriendlyError
from cartridges.game import Game from cartridges.game import Game
from cartridges.importer.bottles_source import BottlesSource from cartridges.importer.bottles_source import BottlesSource
from cartridges.importer.desktop_source import DesktopSource
from cartridges.importer.flatpak_source import FlatpakSource from cartridges.importer.flatpak_source import FlatpakSource
from cartridges.importer.heroic_source import HeroicSource from cartridges.importer.heroic_source import HeroicSource
from cartridges.importer.itch_source import ItchSource from cartridges.importer.itch_source import ItchSource
@@ -47,74 +50,74 @@ from cartridges.utils.create_dialog import create_dialog
class CartridgesPreferences(Adw.PreferencesDialog): class CartridgesPreferences(Adw.PreferencesDialog):
__gtype_name__ = "CartridgesPreferences" __gtype_name__ = "CartridgesPreferences"
general_page = Gtk.Template.Child() general_page: Adw.PreferencesPage = Gtk.Template.Child()
import_page = Gtk.Template.Child() import_page: Adw.PreferencesPage = Gtk.Template.Child()
sgdb_page = Gtk.Template.Child() sgdb_page: Adw.PreferencesPage = Gtk.Template.Child()
sources_group = Gtk.Template.Child() sources_group: Adw.PreferencesGroup = Gtk.Template.Child()
exit_after_launch_switch = Gtk.Template.Child() exit_after_launch_switch: Adw.SwitchRow = Gtk.Template.Child()
cover_launches_game_switch = Gtk.Template.Child() cover_launches_game_switch: Adw.SwitchRow = Gtk.Template.Child()
high_quality_images_switch = Gtk.Template.Child() high_quality_images_switch: Adw.SwitchRow = Gtk.Template.Child()
remove_missing_switch = Gtk.Template.Child() remove_missing_switch: Adw.SwitchRow = Gtk.Template.Child()
steam_expander_row = Gtk.Template.Child() steam_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
steam_data_action_row = Gtk.Template.Child() steam_data_action_row: Adw.ActionRow = Gtk.Template.Child()
steam_data_file_chooser_button = Gtk.Template.Child() steam_data_file_chooser_button: Gtk.Button = Gtk.Template.Child()
lutris_expander_row = Gtk.Template.Child() lutris_expander_row: Adw.ExpanderRowClass = Gtk.Template.Child()
lutris_data_action_row = Gtk.Template.Child() lutris_data_action_row: Adw.ActionRow = Gtk.Template.Child()
lutris_data_file_chooser_button = Gtk.Template.Child() lutris_data_file_chooser_button: Gtk.Button = Gtk.Template.Child()
lutris_import_steam_switch = Gtk.Template.Child() lutris_import_steam_switch: Adw.SwitchRow = Gtk.Template.Child()
lutris_import_flatpak_switch = Gtk.Template.Child() lutris_import_flatpak_switch: Adw.SwitchRow = Gtk.Template.Child()
heroic_expander_row = Gtk.Template.Child() heroic_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
heroic_config_action_row = Gtk.Template.Child() heroic_config_action_row: Adw.ActionRow = Gtk.Template.Child()
heroic_config_file_chooser_button = Gtk.Template.Child() heroic_config_file_chooser_button: Gtk.Button = Gtk.Template.Child()
heroic_import_epic_switch = Gtk.Template.Child() heroic_import_epic_switch: Adw.SwitchRow = Gtk.Template.Child()
heroic_import_gog_switch = Gtk.Template.Child() heroic_import_gog_switch: Adw.SwitchRow = Gtk.Template.Child()
heroic_import_amazon_switch = Gtk.Template.Child() heroic_import_amazon_switch: Adw.SwitchRow = Gtk.Template.Child()
heroic_import_sideload_switch = Gtk.Template.Child() heroic_import_sideload_switch: Adw.SwitchRow = Gtk.Template.Child()
bottles_expander_row = Gtk.Template.Child() bottles_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
bottles_data_action_row = Gtk.Template.Child() bottles_data_action_row: Adw.ActionRow = Gtk.Template.Child()
bottles_data_file_chooser_button = Gtk.Template.Child() bottles_data_file_chooser_button: Gtk.Button = Gtk.Template.Child()
itch_expander_row = Gtk.Template.Child() itch_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
itch_config_action_row = Gtk.Template.Child() itch_config_action_row: Adw.ActionRow = Gtk.Template.Child()
itch_config_file_chooser_button = Gtk.Template.Child() itch_config_file_chooser_button: Gtk.Button = Gtk.Template.Child()
legendary_expander_row = Gtk.Template.Child() legendary_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
legendary_config_action_row = Gtk.Template.Child() legendary_config_action_row: Adw.ActionRow = Gtk.Template.Child()
legendary_config_file_chooser_button = Gtk.Template.Child() legendary_config_file_chooser_button: Gtk.Button = Gtk.Template.Child()
retroarch_expander_row = Gtk.Template.Child() retroarch_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
retroarch_config_action_row = Gtk.Template.Child() retroarch_config_action_row: Adw.ActionRow = Gtk.Template.Child()
retroarch_config_file_chooser_button = Gtk.Template.Child() retroarch_config_file_chooser_button: Gtk.Button = Gtk.Template.Child()
flatpak_expander_row = Gtk.Template.Child() flatpak_expander_row: Adw.ExpanderRow = Gtk.Template.Child()
flatpak_system_data_action_row = Gtk.Template.Child() flatpak_system_data_action_row: Adw.ActionRow = Gtk.Template.Child()
flatpak_system_data_file_chooser_button = Gtk.Template.Child() flatpak_system_data_file_chooser_button: Gtk.Button = Gtk.Template.Child()
flatpak_user_data_action_row = Gtk.Template.Child() flatpak_user_data_action_row: Adw.ActionRow = Gtk.Template.Child()
flatpak_user_data_file_chooser_button = Gtk.Template.Child() flatpak_user_data_file_chooser_button: Gtk.Button = Gtk.Template.Child()
flatpak_import_launchers_switch = Gtk.Template.Child() flatpak_import_launchers_switch: Adw.SwitchRow = Gtk.Template.Child()
desktop_switch = Gtk.Template.Child() desktop_switch: Adw.SwitchRow = Gtk.Template.Child()
sgdb_key_group = Gtk.Template.Child() sgdb_key_group: Adw.PreferencesGroup = Gtk.Template.Child()
sgdb_key_entry_row = Gtk.Template.Child() sgdb_key_entry_row: Adw.EntryRow = Gtk.Template.Child()
sgdb_switch = Gtk.Template.Child() sgdb_switch: Adw.SwitchRow = Gtk.Template.Child()
sgdb_prefer_switch = Gtk.Template.Child() sgdb_prefer_switch: Adw.SwitchRow = Gtk.Template.Child()
sgdb_animated_switch = Gtk.Template.Child() sgdb_animated_switch: Adw.SwitchRow = Gtk.Template.Child()
sgdb_fetch_button = Gtk.Template.Child() sgdb_fetch_button: Gtk.Button = Gtk.Template.Child()
sgdb_stack = Gtk.Template.Child() sgdb_stack: Gtk.Stack = Gtk.Template.Child()
sgdb_spinner = Gtk.Template.Child() sgdb_spinner: Gtk.Spinner = Gtk.Template.Child()
danger_zone_group = Gtk.Template.Child() danger_zone_group: Adw.PreferencesGroup = Gtk.Template.Child()
remove_all_games_list_box = Gtk.Template.Child() remove_all_games_list_box: Gtk.ListBox = Gtk.Template.Child()
reset_list_box = Gtk.Template.Child() reset_list_box: Gtk.ListBox = Gtk.Template.Child()
reset_group = Gtk.Template.Child() reset_group: Adw.PreferencesGroup = Gtk.Template.Child()
removed_games: set[Game] = set() removed_games: set[Game] = set()
warning_menu_buttons: dict = {} warning_menu_buttons: dict = {}
@@ -169,6 +172,10 @@ class CartridgesPreferences(Adw.PreferencesDialog):
else: else:
self.init_source_row(source) self.init_source_row(source)
# Special case for the desktop source
if not DesktopSource().is_available:
self.desktop_switch.set_visible(False)
# SteamGridDB # SteamGridDB
def sgdb_key_changed(*_args: Any) -> None: def sgdb_key_changed(*_args: Any) -> None:
shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text()) shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text())
@@ -275,7 +282,7 @@ class CartridgesPreferences(Adw.PreferencesDialog):
) -> None: ) -> None:
self.file_chooser.select_folder(shared.win, None, callback, callback_data) self.file_chooser.select_folder(shared.win, None, callback, callback_data)
def undo_remove_all(self, *_args: Any) -> None: def undo_remove_all(self, *_args: Any) -> bool:
shared.win.get_application().state = shared.AppState.UNDO_REMOVE_ALL_GAMES shared.win.get_application().state = shared.AppState.UNDO_REMOVE_ALL_GAMES
for game in self.removed_games: for game in self.removed_games:
game.removed = False game.removed = False
@@ -287,6 +294,8 @@ class CartridgesPreferences(Adw.PreferencesDialog):
shared.win.get_application().state = shared.AppState.DEFAULT shared.win.get_application().state = shared.AppState.DEFAULT
shared.win.create_source_rows() shared.win.create_source_rows()
return True
def remove_all_games(self, *_args: Any) -> None: def remove_all_games(self, *_args: Any) -> None:
shared.win.get_application().state = shared.AppState.REMOVE_ALL_GAMES shared.win.get_application().state = shared.AppState.REMOVE_ALL_GAMES
shared.win.row_selected(None, shared.win.all_games_row_box.get_parent()) shared.win.row_selected(None, shared.win.all_games_row_box.get_parent())

View File

@@ -64,6 +64,8 @@ local_appdata_dir = Path(
) )
programfiles32_dir = Path(getenv("programfiles(x86)") or r"C:\Program Files (x86)") programfiles32_dir = Path(getenv("programfiles(x86)") or r"C:\Program Files (x86)")
app_support_dir = home / "Library" / "Application Support"
try: try:
scale_factor = max( scale_factor = max(
monitor.get_scale_factor() monitor.get_scale_factor()
@@ -79,4 +81,4 @@ win = None
importer = None importer = None
import_time = None import_time = None
store = None store = None
log_files = None log_files = []

78
cartridges/shared.pyi Normal file
View File

@@ -0,0 +1,78 @@
# shared.pyi
#
# Copyright 2024 kramo
#
# 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 <http://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
from typing import Optional
from gi.repository import Gio
from cartridges.importer.importer import Importer
from cartridges.store.store import Store
from cartridges.window import CartridgesWindow
class AppState:
DEFAULT: int
LOAD_FROM_DISK: int
IMPORT: int
REMOVE_ALL_GAMES: int
UNDO_REMOVE_ALL_GAMES: int
APP_ID: str
VERSION: str
PREFIX: str
PROFILE: str
TIFF_COMPRESSION: str
SPEC_VERSION: float
schema: Gio.Settings
state_schema: Gio.Settings
home: Path
data_dir: Path
host_data_dir: Path
config_dir: Path
host_config_dir: Path
cache_dir: Path
host_cache_dir: Path
flatpak_dir: Path
games_dir: Path
covers_dir: Path
appdata_dir: Path
local_appdata_dir: Path
programfiles32_dir: Path
app_support_dir: Path
scale_factor: int
image_size: int
win: Optional[CartridgesWindow]
importer: Optional[Importer]
import_time: Optional[int]
store = Optional[Store]
log_files: list[Path]

View File

@@ -48,16 +48,10 @@ class SteamAPIManager(AsyncManager):
appid = additional_data.get("steam_appid", None) appid = additional_data.get("steam_appid", None)
if appid is None: if appid is None:
return return
# Get online metadata # Get online metadata
try: try:
online_data = self.steam_api_helper.get_api_data(appid=appid) online_data = self.steam_api_helper.get_api_data(appid=appid)
except (SteamNotAGameError, SteamGameNotFoundError):
except SteamGameNotFoundError:
return
except SteamNotAGameError:
game.update_values({"blacklisted": True}) game.update_values({"blacklisted": True})
else: else:
game.update_values(online_data) game.update_values(online_data)

View File

@@ -33,7 +33,7 @@ def create_dialog(
dialog.add_response("dismiss", _("Dismiss")) dialog.add_response("dismiss", _("Dismiss"))
if extra_option: if extra_option:
dialog.add_response(extra_option, _(extra_label)) dialog.add_response(extra_option, extra_label or "")
dialog.choose(win) dialog.choose(win)
return dialog return dialog

View File

@@ -17,9 +17,12 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# pyright: reportAssignmentType=none
from sys import platform
from typing import Any, Optional from typing import Any, Optional
from gi.repository import Adw, Gio, GLib, Gtk from gi.repository import Adw, Gio, GLib, Gtk, Pango
from cartridges import shared from cartridges import shared
from cartridges.game import Game from cartridges.game import Game
@@ -31,51 +34,52 @@ from cartridges.utils.relative_date import relative_date
class CartridgesWindow(Adw.ApplicationWindow): class CartridgesWindow(Adw.ApplicationWindow):
__gtype_name__ = "CartridgesWindow" __gtype_name__ = "CartridgesWindow"
overlay_split_view = Gtk.Template.Child() overlay_split_view: Adw.OverlaySplitView = Gtk.Template.Child()
navigation_view = Gtk.Template.Child() navigation_view: Adw.NavigationView = Gtk.Template.Child()
sidebar = Gtk.Template.Child() sidebar_navigation_page: Adw.NavigationPage = Gtk.Template.Child()
all_games_row_box = Gtk.Template.Child() sidebar: Gtk.ListBox = Gtk.Template.Child()
all_games_no_label = Gtk.Template.Child() all_games_row_box: Gtk.Box = Gtk.Template.Child()
added_row_box = Gtk.Template.Child() all_games_no_label: Gtk.Label = Gtk.Template.Child()
added_games_no_label = Gtk.Template.Child() added_row_box: Gtk.Box = Gtk.Template.Child()
toast_overlay = Gtk.Template.Child() added_games_no_label: Gtk.Label = Gtk.Template.Child()
primary_menu_button = Gtk.Template.Child() toast_overlay: Adw.ToastOverlay = Gtk.Template.Child()
show_sidebar_button = Gtk.Template.Child() primary_menu_button: Gtk.MenuButton = Gtk.Template.Child()
details_view = Gtk.Template.Child() show_sidebar_button: Gtk.Button = Gtk.Template.Child()
library_page = Gtk.Template.Child() details_view: Gtk.Overlay = Gtk.Template.Child()
library_view = Gtk.Template.Child() library_page: Adw.NavigationPage = Gtk.Template.Child()
library = Gtk.Template.Child() library_view: Adw.ToolbarView = Gtk.Template.Child()
scrolledwindow = Gtk.Template.Child() library: Gtk.FlowBox = Gtk.Template.Child()
library_overlay = Gtk.Template.Child() scrolledwindow: Gtk.ScrolledWindow = Gtk.Template.Child()
notice_empty = Gtk.Template.Child() library_overlay: Gtk.Overlay = Gtk.Template.Child()
notice_no_results = Gtk.Template.Child() notice_empty: Adw.StatusPage = Gtk.Template.Child()
search_bar = Gtk.Template.Child() notice_no_results: Adw.StatusPage = Gtk.Template.Child()
search_entry = Gtk.Template.Child() search_bar: Gtk.SearchBar = Gtk.Template.Child()
search_button = Gtk.Template.Child() search_entry: Gtk.SearchEntry = Gtk.Template.Child()
search_button: Gtk.ToggleButton = Gtk.Template.Child()
details_page = Gtk.Template.Child() details_page: Adw.NavigationPage = Gtk.Template.Child()
details_view_toolbar_view = Gtk.Template.Child() details_view_toolbar_view: Adw.ToolbarView = Gtk.Template.Child()
details_view_cover = Gtk.Template.Child() details_view_cover: Gtk.Picture = Gtk.Template.Child()
details_view_spinner = Gtk.Template.Child() details_view_spinner: Gtk.Spinner = Gtk.Template.Child()
details_view_title = Gtk.Template.Child() details_view_title: Gtk.Label = Gtk.Template.Child()
details_view_blurred_cover = Gtk.Template.Child() details_view_blurred_cover: Gtk.Picture = Gtk.Template.Child()
details_view_play_button = Gtk.Template.Child() details_view_play_button: Gtk.Button = Gtk.Template.Child()
details_view_developer = Gtk.Template.Child() details_view_developer: Gtk.Label = Gtk.Template.Child()
details_view_added = Gtk.Template.Child() details_view_added: Gtk.ShortcutLabel = Gtk.Template.Child()
details_view_last_played = Gtk.Template.Child() details_view_last_played: Gtk.Label = Gtk.Template.Child()
details_view_hide_button = Gtk.Template.Child() details_view_hide_button: Gtk.Button = Gtk.Template.Child()
hidden_library_page = Gtk.Template.Child() hidden_library_page: Adw.NavigationPage = Gtk.Template.Child()
hidden_primary_menu_button = Gtk.Template.Child() hidden_primary_menu_button: Gtk.MenuButton = Gtk.Template.Child()
hidden_library = Gtk.Template.Child() hidden_library: Gtk.FlowBox = Gtk.Template.Child()
hidden_library_view = Gtk.Template.Child() hidden_library_view: Adw.ToolbarView = Gtk.Template.Child()
hidden_scrolledwindow = Gtk.Template.Child() hidden_scrolledwindow: Gtk.ScrolledWindow = Gtk.Template.Child()
hidden_library_overlay = Gtk.Template.Child() hidden_library_overlay: Gtk.Overlay = Gtk.Template.Child()
hidden_notice_empty = Gtk.Template.Child() hidden_notice_empty: Adw.StatusPage = Gtk.Template.Child()
hidden_notice_no_results = Gtk.Template.Child() hidden_notice_no_results: Adw.StatusPage = Gtk.Template.Child()
hidden_search_bar = Gtk.Template.Child() hidden_search_bar: Gtk.SearchBar = Gtk.Template.Child()
hidden_search_entry = Gtk.Template.Child() hidden_search_entry: Gtk.SearchEntry = Gtk.Template.Child()
hidden_search_button = Gtk.Template.Child() hidden_search_button: Gtk.ToggleButton = Gtk.Template.Child()
game_covers: dict = {} game_covers: dict = {}
toasts: dict = {} toasts: dict = {}
@@ -152,6 +156,8 @@ class CartridgesWindow(Adw.ApplicationWindow):
Gtk.Label( Gtk.Label(
label=self.get_application().get_source_name(source_id), label=self.get_application().get_source_name(source_id),
halign=Gtk.Align.START, halign=Gtk.Align.START,
wrap=True,
wrap_mode=Pango.WrapMode.CHAR,
) )
) )
@@ -213,6 +219,9 @@ class CartridgesWindow(Adw.ApplicationWindow):
def __init__(self, **kwargs: Any) -> None: def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs) super().__init__(**kwargs)
if platform == "darwin":
self.sidebar_navigation_page.set_title("")
self.details_view.set_measure_overlay(self.details_view_toolbar_view, True) self.details_view.set_measure_overlay(self.details_view_toolbar_view, True)
self.details_view.set_clip_overlay(self.details_view_toolbar_view, False) self.details_view.set_clip_overlay(self.details_view_toolbar_view, False)
@@ -443,6 +452,9 @@ class CartridgesWindow(Adw.ApplicationWindow):
self.navigation_view.pop_to_page(self.library_page) self.navigation_view.pop_to_page(self.library_page)
def on_show_hidden_action(self, *_args: Any) -> None: def on_show_hidden_action(self, *_args: Any) -> None:
if self.navigation_view.get_visible_page() == self.hidden_library_page:
return
self.navigation_view.push(self.hidden_library_page) self.navigation_view.push(self.hidden_library_page)
def on_sort_action(self, action: Gio.SimpleAction, state: GLib.Variant) -> None: def on_sort_action(self, action: Gio.SimpleAction, state: GLib.Variant) -> None:

View File

@@ -79,7 +79,7 @@ template $CartridgesWindow: Adw.ApplicationWindow {
sidebar-width-fraction: .2; sidebar-width-fraction: .2;
[sidebar] [sidebar]
Adw.NavigationPage { Adw.NavigationPage sidebar_navigation_page {
title: _("Cartridges"); title: _("Cartridges");
Adw.ToolbarView { Adw.ToolbarView {
@@ -94,6 +94,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
} }
ScrolledWindow { ScrolledWindow {
hscrollbar-policy: never;
ListBox sidebar { ListBox sidebar {
Box all_games_row_box { Box all_games_row_box {
margin-top: 12; margin-top: 12;
@@ -109,6 +111,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
Label { Label {
halign: start; halign: start;
label: _("All Games"); label: _("All Games");
wrap: true;
wrap-mode: char;
} }
Label all_games_no_label { Label all_games_no_label {
@@ -135,6 +139,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
halign: start; halign: start;
label: _("Added"); label: _("Added");
margin-end: 6; margin-end: 6;
wrap: true;
wrap-mode: char;
} }
Label added_games_no_label { Label added_games_no_label {
@@ -175,15 +181,11 @@ template $CartridgesWindow: Adw.ApplicationWindow {
[top] [top]
Adw.HeaderBar header_bar { Adw.HeaderBar header_bar {
[start] [start]
Revealer { Button show_sidebar_button {
transition-type: slide_right; icon-name: "sidebar-show-symbolic";
reveal-child: bind overlay_split_view.show-sidebar inverted; action-name: "win.show_sidebar";
tooltip-text: _("Toggle Sidebar");
Button show_sidebar_button { visible: bind overlay_split_view.show-sidebar inverted;
icon-name: "sidebar-show-symbolic";
action-name: "win.show_sidebar";
tooltip-text: _("Toggle Sidebar");
}
} }
[start] [start]

View File

@@ -1,11 +1,11 @@
scalable_dir = join_paths('hicolor', 'scalable', 'apps') scalable_dir = join_paths('hicolor', 'scalable', 'apps')
install_data( install_data(
join_paths(scalable_dir, ('@0@.svg').format(app_id)), join_paths(scalable_dir, ('@0@.svg').format(app_id)),
install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir) install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir),
) )
symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') symbolic_dir = join_paths('hicolor', 'symbolic', 'apps')
install_data( install_data(
join_paths(symbolic_dir, ('@0@-symbolic.svg').format(app_id)), join_paths(symbolic_dir, ('@0@-symbolic.svg').format(app_id)),
install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir) install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir),
) )

View File

@@ -1,20 +1,28 @@
blueprints = custom_target('blueprints', blueprints = custom_target(
'blueprints',
input: files( input: files(
'gtk/help-overlay.blp', 'gtk/details-dialog.blp',
'gtk/window.blp',
'gtk/game.blp', 'gtk/game.blp',
'gtk/help-overlay.blp',
'gtk/preferences.blp', 'gtk/preferences.blp',
'gtk/details-dialog.blp' 'gtk/window.blp',
), ),
output: '.', output: '.',
command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'], command: [
find_program('blueprint-compiler'),
'batch-compile',
'@OUTPUT@',
'@CURRENT_SOURCE_DIR@',
'@INPUT@',
],
) )
gnome.compile_resources('cartridges', gnome.compile_resources(
'cartridges',
configure_file( configure_file(
input: 'cartridges.gresource.xml.in', input: 'cartridges.gresource.xml.in',
output: 'cartridges.gresource.xml', output: 'cartridges.gresource.xml',
configuration: conf configuration: conf,
), ),
gresource_bundle: true, gresource_bundle: true,
install: true, install: true,
@@ -22,27 +30,26 @@ gnome.compile_resources('cartridges',
dependencies: blueprints, dependencies: blueprints,
) )
if host_machine.system() == 'windows' if host_machine.system() == 'windows'
desktop_file = configure_file( desktop_file = configure_file(
input: 'page.kramo.Cartridges.desktop.in', input: 'page.kramo.Cartridges.desktop.in',
output: app_id + '.desktop.in', output: app_id + '.desktop.in',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'applications') install_dir: join_paths(get_option('datadir'), 'applications'),
) )
else else
desktop_file = i18n.merge_file( desktop_file = i18n.merge_file(
input: configure_file( input: configure_file(
input: 'page.kramo.Cartridges.desktop.in', input: 'page.kramo.Cartridges.desktop.in',
output: app_id + '.desktop.in', output: app_id + '.desktop.in',
configuration: conf configuration: conf,
), ),
output: app_id + '.desktop', output: app_id + '.desktop',
type: 'desktop', type: 'desktop',
po_dir: '../po', po_dir: '../po',
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'applications') install_dir: join_paths(get_option('datadir'), 'applications'),
) )
endif endif
@@ -59,29 +66,30 @@ if host_machine.system() == 'windows'
output: app_id + '.metainfo.xml', output: app_id + '.metainfo.xml',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo') install_dir: join_paths(get_option('datadir'), 'metainfo'),
) )
else else
appstream_file = i18n.merge_file( appstream_file = i18n.merge_file(
input: configure_file( input: configure_file(
input: 'page.kramo.Cartridges.metainfo.xml.in', input: 'page.kramo.Cartridges.metainfo.xml.in',
output: app_id + '.metainfo.xml.in', output: app_id + '.metainfo.xml.in',
configuration: conf configuration: conf,
), ),
output: app_id + '.metainfo.xml', output: app_id + '.metainfo.xml',
po_dir: '../po', po_dir: '../po',
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo') install_dir: join_paths(get_option('datadir'), 'metainfo'),
) )
endif endif
if host_machine.system() != 'windows' if host_machine.system() != 'windows'
appstreamcli = find_program('appstreamcli', required: false) appstreamcli = find_program('appstreamcli', required: false)
if appstreamcli.found() if appstreamcli.found()
test('Validate appstream file', test(
'Validate appstream file',
appstreamcli, appstreamcli,
args: ['validate', '--no-net', '--explain', appstream_file], args: ['validate', '--no-net', '--explain', appstream_file],
workdir: meson.current_build_dir() workdir: meson.current_build_dir(),
) )
endif endif
endif endif
@@ -90,16 +98,18 @@ install_data(
configure_file( configure_file(
input: 'page.kramo.Cartridges.gschema.xml.in', input: 'page.kramo.Cartridges.gschema.xml.in',
output: app_id + '.gschema.xml', output: app_id + '.gschema.xml',
configuration: conf configuration: conf,
), ),
install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas'),
) )
compile_schemas = find_program('glib-compile-schemas', required: false) compile_schemas = find_program('glib-compile-schemas', required: false)
if compile_schemas.found() if compile_schemas.found()
test('Validate schema file', test(
compile_schemas, 'Validate schema file',
args: ['--strict', '--dry-run', meson.current_source_dir()]) compile_schemas,
args: ['--strict', '--dry-run', meson.current_source_dir()],
)
endif endif
subdir('icons') subdir('icons')

View File

@@ -54,12 +54,18 @@
</screenshots> </screenshots>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="2.8.4" date="2024-04-16"> <release version="2.9.3" date="2024-07-18">
<description translate="no"> <description translate="no">
<ul> <ul>
<li>Fixed an issue with the import dialog not closing</li> <li>Fixed incorrect modifiers being used for keyboard shortcuts</li>
<li>Fixed an issue with Lutris games not importing</li> </ul>
<li>Cartrdiges builds are available for Windows again!</li> </description>
</release>
<release version="2.9" date="2024-07-10">
<description translate="no">
<ul>
<li>Cartridges is now available on macOS! You can download it from GitHub.</li>
<li>Updated translations</li>
</ul> </ul>
</description> </description>
</release> </release>

View File

@@ -35,7 +35,7 @@ Stored as a Unix time stamp.
The executable to run when launching a game. The executable to run when launching a game.
If the source has a URL handler, using that is preferred. In that case, the value should be `"xdg-open url://example/url"` for Linux and `"start url://example/url"` for Windows. If the source has a URL handler, using that is preferred. In that case, the value should be `"xdg-open url://example/url"` for Linux, `"start url://example/url"` for Windows and `"open url://example/url"` for macOS.
Stored as either a string (preferred) or an argument vector to be passed to the shell through [subprocess.Popen](https://docs.python.org/3/library/subprocess.html#popen-constructor). Stored as either a string (preferred) or an argument vector to be passed to the shell through [subprocess.Popen](https://docs.python.org/3/library/subprocess.html#popen-constructor).

View File

@@ -1,7 +1,11 @@
project('cartridges', project(
version: '2.8.3', 'cartridges',
meson_version: '>= 0.59.0', version: '2.9.3',
default_options: [ 'warning_level=2', 'werror=false', ], meson_version: '>= 0.59.0',
default_options: [
'warning_level=2',
'werror=false',
],
) )
# Translations are broken on Windows for multiple reasons # Translations are broken on Windows for multiple reasons
@@ -23,7 +27,7 @@ profile = get_option('profile')
if profile == 'development' if profile == 'development'
app_id = 'page.kramo.Cartridges.Devel' app_id = 'page.kramo.Cartridges.Devel'
prefix = '/page/kramo/Cartridges/Devel' prefix = '/page/kramo/Cartridges/Devel'
elif profile == 'release' elif profile == 'release'
app_id = 'page.kramo.Cartridges' app_id = 'page.kramo.Cartridges'
prefix = '/page/kramo/Cartridges' prefix = '/page/kramo/Cartridges'
endif endif
@@ -44,14 +48,14 @@ subdir('data')
subdir('cartridges') subdir('cartridges')
if host_machine.system() == 'windows' if host_machine.system() == 'windows'
subdir('windows') subdir('build-aux/windows')
else else
subdir('search-provider') subdir('search-provider')
subdir('po') subdir('po')
endif endif
gnome.post_install( gnome.post_install(
glib_compile_schemas: true, glib_compile_schemas: true,
gtk_update_icon_cache: true, gtk_update_icon_cache: true,
update_desktop_database: true, update_desktop_database: true,
) )

View File

@@ -1,13 +1,13 @@
# SOME DESCRIPTIVE TITLE. # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR kramo # Copyright (C) YEAR kramo
# This file is distributed under the same license as the Cartridges package. # This file is distributed under the same license as the Cartridges package.
# foo expert <deferred_water346@simplelogin.com>, 2023. # foo expert <deferred_water346@simplelogin.com>, 2023, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2023-09-24 16:04+0000\n" "PO-Revision-Date: 2024-06-28 07:09+0000\n"
"Last-Translator: foo expert <deferred_water346@simplelogin.com>\n" "Last-Translator: foo expert <deferred_water346@simplelogin.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/cartridges/" "Language-Team: Czech <https://hosted.weblate.org/projects/cartridges/"
"cartridges/cs/>\n" "cartridges/cs/>\n"
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.1-dev\n" "X-Generator: Weblate 5.7-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -276,15 +276,13 @@ msgstr "Flatpak"
#. The location of the system-wide data directory #. The location of the system-wide data directory
#: data/gtk/preferences.blp:351 #: data/gtk/preferences.blp:351
#, fuzzy
msgid "System Location" msgid "System Location"
msgstr "Nastavit umístění" msgstr "Systémové umístění"
#. The location of the user-specific data directory #. The location of the user-specific data directory
#: data/gtk/preferences.blp:369 #: data/gtk/preferences.blp:369
#, fuzzy
msgid "User Location" msgid "User Location"
msgstr "Nastavit umístění" msgstr "Uživatelské umístění"
#: data/gtk/preferences.blp:386 #: data/gtk/preferences.blp:386
msgid "Import Game Launchers" msgid "Import Game Launchers"
@@ -323,17 +321,16 @@ msgid "Prefer Animated Images"
msgstr "Upřednostnit animované obrázky" msgstr "Upřednostnit animované obrázky"
#: data/gtk/preferences.blp:433 #: data/gtk/preferences.blp:433
#, fuzzy
msgid "Update Covers" msgid "Update Covers"
msgstr "Odstranit obal" msgstr "Aktualizovat obálky"
#: data/gtk/preferences.blp:434 #: data/gtk/preferences.blp:434
msgid "Fetch covers for games already in your library" msgid "Fetch covers for games already in your library"
msgstr "" msgstr "Najít obálky pro hry ve vaší knihovně"
#: data/gtk/preferences.blp:439 #: data/gtk/preferences.blp:439
msgid "Update" msgid "Update"
msgstr "" msgstr "Aktualizovat"
#: data/gtk/window.blp:6 data/gtk/window.blp:14 #: data/gtk/window.blp:6 data/gtk/window.blp:14
msgid "No Games Found" msgid "No Games Found"
@@ -417,15 +414,15 @@ msgstr "O Kazetách"
#: data/gtk/window.blp:561 #: data/gtk/window.blp:561
msgid "IGDB" msgid "IGDB"
msgstr "" msgstr "IGDB"
#: data/gtk/window.blp:563 #: data/gtk/window.blp:563
msgid "ProtonDB" msgid "ProtonDB"
msgstr "" msgstr "ProtonDB"
#: data/gtk/window.blp:565 #: data/gtk/window.blp:565
msgid "HowLongToBeat" msgid "HowLongToBeat"
msgstr "" msgstr "HowLongToBeat"
#. The variable is the title of the game #. The variable is the title of the game
#: cartridges/main.py:205 cartridges/game.py:125 #: cartridges/main.py:205 cartridges/game.py:125
@@ -553,11 +550,11 @@ msgstr ""
#: cartridges/preferences.py:196 #: cartridges/preferences.py:196
msgid "Downloading covers…" msgid "Downloading covers…"
msgstr "" msgstr "Stahování obálek…"
#: cartridges/preferences.py:215 #: cartridges/preferences.py:215
msgid "Covers updated" msgid "Covers updated"
msgstr "" msgstr "Obálky aktualizovány"
#: cartridges/preferences.py:360 #: cartridges/preferences.py:360
msgid "Installation Not Found" msgid "Installation Not Found"

View File

@@ -3,13 +3,14 @@
# This file is distributed under the same license as the Cartridges package. # This file is distributed under the same license as the Cartridges package.
# سید حسین موسوی فرد <shmf1385@protonmail.com>, 2023. # سید حسین موسوی فرد <shmf1385@protonmail.com>, 2023.
# Danial Behzadi <dani.behzi@ubuntu.com>, 2023. # Danial Behzadi <dani.behzi@ubuntu.com>, 2023.
# آوید <avds+git@disroot.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2023-09-24 16:04+0000\n" "PO-Revision-Date: 2024-07-14 20:09+0000\n"
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n" "Last-Translator: آوید <avds+git@disroot.org>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/cartridges/" "Language-Team: Persian <https://hosted.weblate.org/projects/cartridges/"
"cartridges/fa/>\n" "cartridges/fa/>\n"
"Language: fa\n" "Language: fa\n"
@@ -17,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.1-dev\n" "X-Generator: Weblate 5.7-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -74,7 +75,7 @@ msgstr "لغو"
#: data/gtk/details-dialog.blp:46 #: data/gtk/details-dialog.blp:46
msgid "New Cover" msgid "New Cover"
msgstr "طرج جلد جدید" msgstr "طرح جلد جدید"
#: data/gtk/details-dialog.blp:65 #: data/gtk/details-dialog.blp:65
msgid "Delete Cover" msgid "Delete Cover"
@@ -98,7 +99,7 @@ msgstr "گزینش پرونده"
#: data/gtk/details-dialog.blp:120 #: data/gtk/details-dialog.blp:120
msgid "More Info" msgid "More Info"
msgstr "اطّلاعات بیشتر" msgstr "اطلاعات بیشتر"
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:443 #: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:443
msgid "Edit" msgid "Edit"
@@ -127,7 +128,7 @@ msgstr "جست‌وجو"
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:543 #: data/gtk/help-overlay.blp:24 data/gtk/window.blp:543
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "میان‌برهیا صفحه‌کلید" msgstr "میان‌برهای صفحه‌کلید"
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103 #: data/gtk/help-overlay.blp:29 cartridges/game.py:103
#: cartridges/preferences.py:134 cartridges/importer/importer.py:394 #: cartridges/preferences.py:134 cartridges/importer/importer.py:394
@@ -182,7 +183,7 @@ msgstr "طرح جلد بازی را اجرا می‌کند"
#: data/gtk/preferences.blp:21 #: data/gtk/preferences.blp:21
msgid "Swaps the behavior of the cover image and the play button" msgid "Swaps the behavior of the cover image and the play button"
msgstr "تعویض رفتار تصویر جلد و دکمهٔ بازی کردن" msgstr "تغییر رفتار تصویر جلد و دکمهٔ بازی کردن"
#: data/gtk/preferences.blp:26 cartridges/details_dialog.py:82 #: data/gtk/preferences.blp:26 cartridges/details_dialog.py:82
msgid "Images" msgid "Images"
@@ -194,7 +195,7 @@ msgstr "عکس‌های با کیفیت بالا"
#: data/gtk/preferences.blp:30 #: data/gtk/preferences.blp:30
msgid "Save game covers losslessly at the cost of storage" msgid "Save game covers losslessly at the cost of storage"
msgstr "ذخیرهٔ طرح جلدهای بدون اتلاف به فیمت ذخیره‌سازی" msgstr "ذخیرهٔ طرح جلدهای بدون اتلاف به قیمت ذخیره‌سازی"
#: data/gtk/preferences.blp:35 #: data/gtk/preferences.blp:35
msgid "Danger Zone" msgid "Danger Zone"
@@ -206,7 +207,7 @@ msgstr "حذف کردن همهٔ بازی‌ها"
#: data/gtk/preferences.blp:120 #: data/gtk/preferences.blp:120
msgid "Remove Uninstalled Games" msgid "Remove Uninstalled Games"
msgstr "برداشن بازی‌های نصب نشده" msgstr "برداشتن بازی‌های نصبنشده"
#: data/gtk/preferences.blp:125 #: data/gtk/preferences.blp:125
msgid "Sources" msgid "Sources"
@@ -254,7 +255,7 @@ msgstr "درون‌ریزی بازی‌های آمازون"
#: data/gtk/preferences.blp:228 #: data/gtk/preferences.blp:228
msgid "Import Sideloaded Games" msgid "Import Sideloaded Games"
msgstr "درون‌ریزی بازی‌های نصب شده" msgstr "درون‌ریزی بازی‌های نصبشده"
#: data/gtk/preferences.blp:233 cartridges/importer/bottles_source.py:86 #: data/gtk/preferences.blp:233 cartridges/importer/bottles_source.py:86
msgid "Bottles" msgid "Bottles"
@@ -278,15 +279,13 @@ msgstr "فلت‌پک"
#. The location of the system-wide data directory #. The location of the system-wide data directory
#: data/gtk/preferences.blp:351 #: data/gtk/preferences.blp:351
#, fuzzy
msgid "System Location" msgid "System Location"
msgstr "تنظیم مکان" msgstr "مکان سامانه"
#. The location of the user-specific data directory #. The location of the user-specific data directory
#: data/gtk/preferences.blp:369 #: data/gtk/preferences.blp:369
#, fuzzy
msgid "User Location" msgid "User Location"
msgstr "تنظیم مکان" msgstr "مکان کاربر"
#: data/gtk/preferences.blp:386 #: data/gtk/preferences.blp:386
msgid "Import Game Launchers" msgid "Import Game Launchers"
@@ -322,20 +321,19 @@ msgstr "ترجیح به تصویرهای رسمی"
#: data/gtk/preferences.blp:427 #: data/gtk/preferences.blp:427
msgid "Prefer Animated Images" msgid "Prefer Animated Images"
msgstr "ترچیح تصویرهای پویا" msgstr "ترجیح تصویرهای پویا"
#: data/gtk/preferences.blp:433 #: data/gtk/preferences.blp:433
#, fuzzy
msgid "Update Covers" msgid "Update Covers"
msgstr "حذف طرح جلد" msgstr "به‌روزرسانی طرح جلد"
#: data/gtk/preferences.blp:434 #: data/gtk/preferences.blp:434
msgid "Fetch covers for games already in your library" msgid "Fetch covers for games already in your library"
msgstr "" msgstr "دریافت طرح جلد بازی‌های کنونی کتاب‌خانه‌تان"
#: data/gtk/preferences.blp:439 #: data/gtk/preferences.blp:439
msgid "Update" msgid "Update"
msgstr "" msgstr "به‌روزرسانی"
#: data/gtk/window.blp:6 data/gtk/window.blp:14 #: data/gtk/window.blp:6 data/gtk/window.blp:14
msgid "No Games Found" msgid "No Games Found"
@@ -359,7 +357,7 @@ msgstr "بدون بازی نهفته"
#: data/gtk/window.blp:41 #: data/gtk/window.blp:41
msgid "Games you hide will appear here" msgid "Games you hide will appear here"
msgstr "بازی‌هایی که پنهان می‌کنید، این‌جا ظاهر خواهند شد" msgstr "بازی‌هایی که پنهان می‌کنید، این‌جا نمایان خواهند شد"
#: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228 #: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228
msgid "All Games" msgid "All Games"
@@ -407,7 +405,7 @@ msgstr "قدیمی‌ترین"
#: data/gtk/window.blp:528 #: data/gtk/window.blp:528
msgid "Last Played" msgid "Last Played"
msgstr "آخرین بازی شده" msgstr "آخرین بازیشده"
#: data/gtk/window.blp:535 #: data/gtk/window.blp:535
msgid "Show Hidden" msgid "Show Hidden"
@@ -419,15 +417,15 @@ msgstr "دربارهٔ کارتریج‌ها"
#: data/gtk/window.blp:561 #: data/gtk/window.blp:561
msgid "IGDB" msgid "IGDB"
msgstr "" msgstr "IGDB"
#: data/gtk/window.blp:563 #: data/gtk/window.blp:563
msgid "ProtonDB" msgid "ProtonDB"
msgstr "" msgstr "ProtonDB"
#: data/gtk/window.blp:565 #: data/gtk/window.blp:565
msgid "HowLongToBeat" msgid "HowLongToBeat"
msgstr "" msgstr "HowLongToBeat"
#. The variable is the title of the game #. The variable is the title of the game
#: cartridges/main.py:205 cartridges/game.py:125 #: cartridges/main.py:205 cartridges/game.py:125
@@ -451,7 +449,7 @@ msgstr "هرگز"
#. The variable is the date when the game was last played #. The variable is the date when the game was last played
#: cartridges/window.py:380 #: cartridges/window.py:380
msgid "Last played: {}" msgid "Last played: {}"
msgstr "آخرین بازی شده: {}" msgstr "آخرین بازیشده: {}"
#: cartridges/details_dialog.py:73 #: cartridges/details_dialog.py:73
msgid "Apply" msgid "Apply"
@@ -505,7 +503,7 @@ msgstr ""
"\n" "\n"
"<tt>\"{}\"</tt>\n" "<tt>\"{}\"</tt>\n"
"\n" "\n"
"برای گشودن پروندهٔ {}‌با برنامهٔ پیش‌گزیده:\n" "برای گشودن پروندهٔ {} با برنامهٔ پیش‌گزیده:\n"
"\n" "\n"
"<tt>{} \"{}\"</tt>\n" "<tt>{} \"{}\"</tt>\n"
"\n" "\n"
@@ -530,7 +528,7 @@ msgstr "نتوانست ترجیحات را اعمال کند"
#. The variable is the title of the game #. The variable is the title of the game
#: cartridges/game.py:139 #: cartridges/game.py:139
msgid "{} hidden" msgid "{} hidden"
msgstr "{}‌نهفته" msgstr "{} نهفته"
#: cartridges/game.py:139 #: cartridges/game.py:139
msgid "{} unhidden" msgid "{} unhidden"
@@ -555,11 +553,11 @@ msgstr ""
#: cartridges/preferences.py:196 #: cartridges/preferences.py:196
msgid "Downloading covers…" msgid "Downloading covers…"
msgstr "" msgstr "در حال دریافت طرح‌های جلد…"
#: cartridges/preferences.py:215 #: cartridges/preferences.py:215
msgid "Covers updated" msgid "Covers updated"
msgstr "" msgstr "طرح‌های جلد به‌روزرسانی شد"
#: cartridges/preferences.py:360 #: cartridges/preferences.py:360
msgid "Installation Not Found" msgid "Installation Not Found"
@@ -599,7 +597,7 @@ msgstr "هیچ بازی جدیدی پیدا نشد"
#: cartridges/importer/importer.py:379 #: cartridges/importer/importer.py:379
msgid "1 game imported" msgid "1 game imported"
msgstr "۱ بازی درون‌ریخته شد" msgstr "یک بازی درون‌ریخته شد"
#. The variable is the number of games #. The variable is the number of games
#: cartridges/importer/importer.py:383 #: cartridges/importer/importer.py:383

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2024-03-27 19:15+0000\n" "PO-Revision-Date: 2024-05-07 09:07+0000\n"
"Last-Translator: Scrambled777 <weblate.scrambled777@simplelogin.com>\n" "Last-Translator: Scrambled777 <weblate.scrambled777@simplelogin.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/cartridges/" "Language-Team: Hindi <https://hosted.weblate.org/projects/cartridges/"
"cartridges/hi/>\n" "cartridges/hi/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5-dev\n" "X-Generator: Weblate 5.5.4-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -65,7 +65,7 @@ msgstr "गेम विवरण संपादन"
#: data/gtk/window.blp:542 cartridges/details_dialog.py:267 #: data/gtk/window.blp:542 cartridges/details_dialog.py:267
#: cartridges/importer/importer.py:320 cartridges/importer/importer.py:370 #: cartridges/importer/importer.py:320 cartridges/importer/importer.py:370
msgid "Preferences" msgid "Preferences"
msgstr "प्राथमिकताए" msgstr "प्राथमिकताए"
#: data/gtk/details-dialog.blp:15 #: data/gtk/details-dialog.blp:15
msgid "Cancel" msgid "Cancel"
@@ -77,7 +77,7 @@ msgstr "नया कवर"
#: data/gtk/details-dialog.blp:65 #: data/gtk/details-dialog.blp:65
msgid "Delete Cover" msgid "Delete Cover"
msgstr "कवर टाए" msgstr "कवर मिटाए"
#: data/gtk/details-dialog.blp:93 data/gtk/game.blp:81 #: data/gtk/details-dialog.blp:93 data/gtk/game.blp:81
msgid "Title" msgid "Title"
@@ -89,7 +89,7 @@ msgstr "विकासकर्ता (वैकल्पिक)"
#: data/gtk/details-dialog.blp:103 #: data/gtk/details-dialog.blp:103
msgid "Executable" msgid "Executable"
msgstr "एक्सेक्यूटेबल" msgstr "निष्पादनयोग्य"
#: data/gtk/details-dialog.blp:109 #: data/gtk/details-dialog.blp:109
msgid "Select File" msgid "Select File"
@@ -109,15 +109,15 @@ msgstr "छुपाएं"
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:463 #: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:463
msgid "Remove" msgid "Remove"
msgstr "हटाए" msgstr "हटाए"
#: data/gtk/game.blp:111 cartridges/window.py:352 #: data/gtk/game.blp:111 cartridges/window.py:352
msgid "Unhide" msgid "Unhide"
msgstr "सामने लाए" msgstr "सामने लाए"
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9 #: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
msgid "General" msgid "General"
msgstr "जनरल" msgstr "सामान्य"
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:205 data/gtk/window.blp:221 #: data/gtk/help-overlay.blp:14 data/gtk/window.blp:205 data/gtk/window.blp:221
#: data/gtk/window.blp:272 data/gtk/window.blp:288 data/gtk/window.blp:474 #: data/gtk/window.blp:272 data/gtk/window.blp:288 data/gtk/window.blp:474
@@ -131,7 +131,7 @@ msgstr "कीबोर्ड शॉर्टकट"
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103 #: data/gtk/help-overlay.blp:29 cartridges/game.py:103
#: cartridges/preferences.py:134 cartridges/importer/importer.py:394 #: cartridges/preferences.py:134 cartridges/importer/importer.py:394
msgid "Undo" msgid "Undo"
msgstr "पूर्ववत" msgstr "पूर्ववत करें"
#: data/gtk/help-overlay.blp:34 #: data/gtk/help-overlay.blp:34
msgid "Quit" msgid "Quit"
@@ -139,11 +139,11 @@ msgstr "छोड़ें"
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:92 data/gtk/window.blp:185 #: data/gtk/help-overlay.blp:39 data/gtk/window.blp:92 data/gtk/window.blp:185
msgid "Toggle Sidebar" msgid "Toggle Sidebar"
msgstr "साइडबार टॉगल करें" msgstr "पार्श्वपट्टी टॉगल करें"
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:198 data/gtk/window.blp:265 #: data/gtk/help-overlay.blp:44 data/gtk/window.blp:198 data/gtk/window.blp:265
msgid "Main Menu" msgid "Main Menu"
msgstr "मुख्य मेन्यू" msgstr "मुख्य मेनू"
#: data/gtk/help-overlay.blp:50 #: data/gtk/help-overlay.blp:50
msgid "Games" msgid "Games"
@@ -160,7 +160,7 @@ msgstr "आयात"
#: data/gtk/help-overlay.blp:63 #: data/gtk/help-overlay.blp:63
msgid "Show Hidden Games" msgid "Show Hidden Games"
msgstr "छिपे हुए गेम्स दिखाए" msgstr "छिपे हुए गेम्स दिखाए"
#: data/gtk/help-overlay.blp:68 #: data/gtk/help-overlay.blp:68
msgid "Remove Game" msgid "Remove Game"
@@ -205,7 +205,7 @@ msgstr "सभी गेम्स हटाएं"
#: data/gtk/preferences.blp:120 #: data/gtk/preferences.blp:120
msgid "Remove Uninstalled Games" msgid "Remove Uninstalled Games"
msgstr "अनइंस्टॉल किए गए गेम्स हटाएं" msgstr "अस्थापित गेम्स हटाएं"
#: data/gtk/preferences.blp:125 #: data/gtk/preferences.blp:125
msgid "Sources" msgid "Sources"
@@ -291,7 +291,7 @@ msgstr "गेम लॉन्चर आयात करें"
#: data/gtk/preferences.blp:391 cartridges/importer/desktop_source.py:215 #: data/gtk/preferences.blp:391 cartridges/importer/desktop_source.py:215
msgid "Desktop Entries" msgid "Desktop Entries"
msgstr "डेस्कटॉप प्रविष्टिया" msgstr "डेस्कटॉप प्रविष्टिया"
#: data/gtk/preferences.blp:403 data/gtk/window.blp:562 #: data/gtk/preferences.blp:403 data/gtk/window.blp:562
msgid "SteamGridDB" msgid "SteamGridDB"
@@ -319,11 +319,11 @@ msgstr "आधिकारिक छवियों से अधिक प्
#: data/gtk/preferences.blp:427 #: data/gtk/preferences.blp:427
msgid "Prefer Animated Images" msgid "Prefer Animated Images"
msgstr "एनिमेटेड छवियों को प्राथमिकता दें" msgstr "सजीव छवियों को प्राथमिकता दें"
#: data/gtk/preferences.blp:433 #: data/gtk/preferences.blp:433
msgid "Update Covers" msgid "Update Covers"
msgstr "कवर अपडेट करें" msgstr "कवर अद्यतन करें"
#: data/gtk/preferences.blp:434 #: data/gtk/preferences.blp:434
msgid "Fetch covers for games already in your library" msgid "Fetch covers for games already in your library"
@@ -331,7 +331,7 @@ msgstr "अपनी लाइब्रेरी में पहले से
#: data/gtk/preferences.blp:439 #: data/gtk/preferences.blp:439
msgid "Update" msgid "Update"
msgstr "अपडेट" msgstr "अद्यतन"
#: data/gtk/window.blp:6 data/gtk/window.blp:14 #: data/gtk/window.blp:6 data/gtk/window.blp:14
msgid "No Games Found" msgid "No Games Found"
@@ -339,7 +339,7 @@ msgstr "कोई गेम नहीं मिला"
#: data/gtk/window.blp:7 data/gtk/window.blp:15 #: data/gtk/window.blp:7 data/gtk/window.blp:15
msgid "Try a different search" msgid "Try a different search"
msgstr "कोई भिन्न खोज आज़माएँ।" msgstr "भिन्न खोज का प्रयास करें"
#: data/gtk/window.blp:21 #: data/gtk/window.blp:21
msgid "No Games" msgid "No Games"
@@ -347,7 +347,7 @@ msgstr "कोई गेम नहीं"
#: data/gtk/window.blp:22 #: data/gtk/window.blp:22
msgid "Use the + button to add games" msgid "Use the + button to add games"
msgstr "गेम जोड़ने के लिए + बटन का उपयोग करें" msgstr "गेम जोड़ने के लिए + बटन का उपयोग करें"
#: data/gtk/window.blp:40 #: data/gtk/window.blp:40
msgid "No Hidden Games" msgid "No Hidden Games"
@@ -355,7 +355,7 @@ msgstr "कोई छुपे गेम्स नहीं"
#: data/gtk/window.blp:41 #: data/gtk/window.blp:41
msgid "Games you hide will appear here" msgid "Games you hide will appear here"
msgstr "आपके द्वारा छिपाए गए गेम यहां दिखाई देंगे" msgstr "आपके द्वारा छिपाए गए गेम यहां दिखाई देंगे"
#: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228 #: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228
msgid "All Games" msgid "All Games"
@@ -407,7 +407,7 @@ msgstr "अंतिम बार खेला गया"
#: data/gtk/window.blp:535 #: data/gtk/window.blp:535
msgid "Show Hidden" msgid "Show Hidden"
msgstr "छुप हुआ दिखाए" msgstr "छुप हुआ दिखाए"
#: data/gtk/window.blp:544 #: data/gtk/window.blp:544
msgid "About Cartridges" msgid "About Cartridges"
@@ -451,7 +451,7 @@ msgstr "अंतिम बार खेला गया: {}"
#: cartridges/details_dialog.py:73 #: cartridges/details_dialog.py:73
msgid "Apply" msgid "Apply"
msgstr "लागू" msgstr "लागू करें"
#: cartridges/details_dialog.py:79 #: cartridges/details_dialog.py:79
msgid "Add New Game" msgid "Add New Game"
@@ -463,7 +463,7 @@ msgstr "जोड़ें"
#: cartridges/details_dialog.py:90 #: cartridges/details_dialog.py:90
msgid "Executables" msgid "Executables"
msgstr "एक्सेक्यूटेबल" msgstr "निष्पादनयोग्य"
#. Translate this string as you would translate "file" #. Translate this string as you would translate "file"
#: cartridges/details_dialog.py:105 #: cartridges/details_dialog.py:105
@@ -497,15 +497,16 @@ msgid ""
"\n" "\n"
"If the path contains spaces, make sure to wrap it in double quotes!" "If the path contains spaces, make sure to wrap it in double quotes!"
msgstr "" msgstr ""
"एक्सेक्यूटेबल \"{}\" लॉन्च करने के लिए, कमांड का उपयोग करें:\n" "निष्पादनयोग्य \"{}\" लॉन्च करने के लिए, कमांड का उपयोग करें:\n"
"\n" "\n"
"<tt>\"{}\"</tt>\n" "<tt>\"{}\"</tt>\n"
"\n" "\n"
"डिफ़ॉल्ट एप्लिकेशन के साथ \"{}\" फाइल खोलने के लिए, इसका उपयोग करें:\n" "तयशुदा अनुप्रयोग के साथ \"{}\" फाइल खोलने के लिए, इसका उपयोग करें:\n"
"\n" "\n"
"<tt>{} \"{}\"</tt>\n" "<tt>{} \"{}\"</tt>\n"
"\n" "\n"
"यदि पथ में रिक्त स्थान हैं, तो इसे दोहरे उद्धरण चिह्नों में लपेटना सुनिश्चित करें!" "यदि पथ में रिक्त स्थान हैं, तो इसे दोहरे उद्धरण चिह्नों में लपेटना सुनिश्चित "
"करें!"
#: cartridges/details_dialog.py:167 cartridges/details_dialog.py:173 #: cartridges/details_dialog.py:167 cartridges/details_dialog.py:173
msgid "Couldn't Add Game" msgid "Couldn't Add Game"
@@ -517,11 +518,11 @@ msgstr "गेम का शीर्षक रिक्त नहीं हो
#: cartridges/details_dialog.py:173 cartridges/details_dialog.py:217 #: cartridges/details_dialog.py:173 cartridges/details_dialog.py:217
msgid "Executable cannot be empty." msgid "Executable cannot be empty."
msgstr "Executable खाली नहीं हो सकता।" msgstr "निष्पादनयोग्य खाली नहीं हो सकता।"
#: cartridges/details_dialog.py:208 cartridges/details_dialog.py:216 #: cartridges/details_dialog.py:208 cartridges/details_dialog.py:216
msgid "Couldn't Apply Preferences" msgid "Couldn't Apply Preferences"
msgstr "प्राथमिकताए लागू नहीं की जा सकी" msgstr "प्राथमिकताए लागू नहीं की जा सकी"
#. The variable is the title of the game #. The variable is the title of the game
#: cartridges/game.py:139 #: cartridges/game.py:139
@@ -555,7 +556,7 @@ msgstr "कवर डाउनलोड हो रहा है…"
#: cartridges/preferences.py:215 #: cartridges/preferences.py:215
msgid "Covers updated" msgid "Covers updated"
msgstr "कवर अप्डैटिड" msgstr "कवर अद्यतित"
#: cartridges/preferences.py:360 #: cartridges/preferences.py:360
msgid "Installation Not Found" msgid "Installation Not Found"
@@ -563,7 +564,7 @@ msgstr "इंस्टालेशन नहीं मिला"
#: cartridges/preferences.py:361 #: cartridges/preferences.py:361
msgid "Select a valid directory" msgid "Select a valid directory"
msgstr "एक वैध डॉयरेक्टरी का चयन करें" msgstr "एक मान्य निर्देशिका चुनें"
#: cartridges/preferences.py:397 cartridges/importer/importer.py:318 #: cartridges/preferences.py:397 cartridges/importer/importer.py:318
msgid "Warning" msgid "Warning"
@@ -571,7 +572,7 @@ msgstr "चेतावनी"
#: cartridges/preferences.py:431 #: cartridges/preferences.py:431
msgid "Invalid Directory" msgid "Invalid Directory"
msgstr "अवैध डॉयरेक्टरी" msgstr "अमान्य निर्देशिका"
#: cartridges/preferences.py:437 #: cartridges/preferences.py:437
msgid "Set Location" msgid "Set Location"
@@ -579,7 +580,7 @@ msgstr "स्थान तय करें"
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:319 #: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:319
msgid "Dismiss" msgid "Dismiss"
msgstr "खारिज" msgstr "खारिज करें"
#: cartridges/importer/importer.py:145 #: cartridges/importer/importer.py:145
msgid "Importing Games…" msgid "Importing Games…"
@@ -587,7 +588,7 @@ msgstr "गेम्स आयात किया जा रहा है…"
#: cartridges/importer/importer.py:338 #: cartridges/importer/importer.py:338
msgid "The following errors occured during import:" msgid "The following errors occured during import:"
msgstr "आयात के दौरान निम्नलिखित त्रुटिया हुईं:" msgstr "आयात के दौरान निम्नलिखित त्रुटिया हुईं:"
#: cartridges/importer/importer.py:367 #: cartridges/importer/importer.py:367
msgid "No new games found" msgid "No new games found"
@@ -605,22 +606,22 @@ msgstr "{} गेम्स आयातित"
#. A single game removed #. A single game removed
#: cartridges/importer/importer.py:387 #: cartridges/importer/importer.py:387
msgid "1 removed" msgid "1 removed"
msgstr "1 हटाया" msgstr "1 हटाया गया"
#. The variable is the name of the source #. The variable is the name of the source
#: cartridges/importer/location.py:34 #: cartridges/importer/location.py:34
msgid "Select the {} cache directory." msgid "Select the {} cache directory."
msgstr "{} कैशे डॉयरेक्टरी का चयन करें।" msgstr "{} कैशे निर्देशिका का चयन करें।"
#. The variable is the name of the source #. The variable is the name of the source
#: cartridges/importer/location.py:36 #: cartridges/importer/location.py:36
msgid "Select the {} configuration directory." msgid "Select the {} configuration directory."
msgstr "{} कॉन्फ़िगरेशन डॉयरेक्टरी का चयन करें।" msgstr "{} विन्यास निर्देशिका का चयन करें।"
#. The variable is the name of the source #. The variable is the name of the source
#: cartridges/importer/location.py:38 #: cartridges/importer/location.py:38
msgid "Select the {} data directory." msgid "Select the {} data directory."
msgstr "{} डेटा डॉयरेक्टरी का चयन करें।" msgstr "{} डेटा निर्देशिका का चयन करें।"
#: cartridges/importer/retroarch_source.py:129 #: cartridges/importer/retroarch_source.py:129
msgid "No RetroArch Core Selected" msgid "No RetroArch Core Selected"
@@ -629,7 +630,7 @@ msgstr "कोई RetroArch कोर चयनित नहीं"
#. The variable is a newline separated list of playlists #. The variable is a newline separated list of playlists
#: cartridges/importer/retroarch_source.py:131 #: cartridges/importer/retroarch_source.py:131
msgid "The following playlists have no default core:" msgid "The following playlists have no default core:"
msgstr "निम्नलिखित प्लेलिस्ट में कोई डिफ़ॉल्ट कोर नहीं है:" msgstr "निम्नलिखित प्लेलिस्ट में कोई तयशुदा कोर नहीं है:"
#: cartridges/importer/retroarch_source.py:133 #: cartridges/importer/retroarch_source.py:133
msgid "Games with no core selected were not imported" msgid "Games with no core selected were not imported"

View File

@@ -7,13 +7,14 @@
# Michaks <fexwex3@gmail.com>, 2023. # Michaks <fexwex3@gmail.com>, 2023.
# Igor Popowicz <igorpopowicz12@gmail.com>, 2024. # Igor Popowicz <igorpopowicz12@gmail.com>, 2024.
# polswert1 <polswert1@users.noreply.hosted.weblate.org>, 2024. # polswert1 <polswert1@users.noreply.hosted.weblate.org>, 2024.
# Karol <k.derbotprogramista@gmail.com>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2024-04-14 07:01+0000\n" "PO-Revision-Date: 2024-05-15 14:01+0000\n"
"Last-Translator: polswert1 <polswert1@users.noreply.hosted.weblate.org>\n" "Last-Translator: Karol <k.derbotprogramista@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/cartridges/" "Language-Team: Polish <https://hosted.weblate.org/projects/cartridges/"
"cartridges/pl/>\n" "cartridges/pl/>\n"
"Language: pl\n" "Language: pl\n"
@@ -22,7 +23,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n" "|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.5-dev\n" "X-Generator: Weblate 5.6-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -98,7 +99,7 @@ msgstr "Plik wykonywalny"
#: data/gtk/details-dialog.blp:109 #: data/gtk/details-dialog.blp:109
msgid "Select File" msgid "Select File"
msgstr "" msgstr "Wybierz Plik"
#: data/gtk/details-dialog.blp:120 #: data/gtk/details-dialog.blp:120
msgid "More Info" msgid "More Info"
@@ -143,8 +144,9 @@ msgid "Quit"
msgstr "Wyjdź" msgstr "Wyjdź"
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:92 data/gtk/window.blp:185 #: data/gtk/help-overlay.blp:39 data/gtk/window.blp:92 data/gtk/window.blp:185
#, fuzzy
msgid "Toggle Sidebar" msgid "Toggle Sidebar"
msgstr "" msgstr "przełącz pasek boczny"
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:198 data/gtk/window.blp:265 #: data/gtk/help-overlay.blp:44 data/gtk/window.blp:198 data/gtk/window.blp:265
msgid "Main Menu" msgid "Main Menu"
@@ -164,14 +166,12 @@ msgid "Import"
msgstr "Importuj" msgstr "Importuj"
#: data/gtk/help-overlay.blp:63 #: data/gtk/help-overlay.blp:63
#, fuzzy
msgid "Show Hidden Games" msgid "Show Hidden Games"
msgstr "Pokaż ukryte gry" msgstr "Pokaż Ukryte Gry"
#: data/gtk/help-overlay.blp:68 #: data/gtk/help-overlay.blp:68
#, fuzzy
msgid "Remove Game" msgid "Remove Game"
msgstr "Usuń grę" msgstr "Usuń Grę"
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:117 #: data/gtk/preferences.blp:13 data/gtk/preferences.blp:117
#: data/gtk/preferences.blp:415 #: data/gtk/preferences.blp:415
@@ -211,9 +211,8 @@ msgid "Remove All Games"
msgstr "Usuń wszystkie gry" msgstr "Usuń wszystkie gry"
#: data/gtk/preferences.blp:120 #: data/gtk/preferences.blp:120
#, fuzzy
msgid "Remove Uninstalled Games" msgid "Remove Uninstalled Games"
msgstr "Usuń wszystkie gry" msgstr "Usuń Odinstalowane Gry"
#: data/gtk/preferences.blp:125 #: data/gtk/preferences.blp:125
msgid "Sources" msgid "Sources"
@@ -256,9 +255,8 @@ msgid "Import GOG Games"
msgstr "Importuj gry z GOG" msgstr "Importuj gry z GOG"
#: data/gtk/preferences.blp:224 #: data/gtk/preferences.blp:224
#, fuzzy
msgid "Import Amazon Games" msgid "Import Amazon Games"
msgstr "Importuj gry Steam" msgstr "Importuj gry Amazon"
#: data/gtk/preferences.blp:228 #: data/gtk/preferences.blp:228
msgid "Import Sideloaded Games" msgid "Import Sideloaded Games"
@@ -278,7 +276,7 @@ msgstr "Legendarne"
#: data/gtk/preferences.blp:314 cartridges/importer/retroarch_source.py:142 #: data/gtk/preferences.blp:314 cartridges/importer/retroarch_source.py:142
msgid "RetroArch" msgid "RetroArch"
msgstr "" msgstr "RetroArch"
#: data/gtk/preferences.blp:341 cartridges/importer/flatpak_source.py:143 #: data/gtk/preferences.blp:341 cartridges/importer/flatpak_source.py:143
msgid "Flatpak" msgid "Flatpak"

View File

@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2024-01-04 04:07+0000\n" "PO-Revision-Date: 2024-04-20 05:07+0000\n"
"Last-Translator: Filipe Motta <luiz_filipe_motta@hotmail.com>\n" "Last-Translator: Filipe Motta <luiz_filipe_motta@hotmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"cartridges/cartridges/pt_BR/>\n" "cartridges/cartridges/pt_BR/>\n"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.4-dev\n" "X-Generator: Weblate 5.5-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -343,27 +343,24 @@ msgid "No Games Found"
msgstr "Nenhum jogo encontrado" msgstr "Nenhum jogo encontrado"
#: data/gtk/window.blp:7 data/gtk/window.blp:15 #: data/gtk/window.blp:7 data/gtk/window.blp:15
#, fuzzy
msgid "Try a different search" msgid "Try a different search"
msgstr "Tente uma busca diferente." msgstr "Tente uma busca diferente"
#: data/gtk/window.blp:21 #: data/gtk/window.blp:21
msgid "No Games" msgid "No Games"
msgstr "Sem jogos" msgstr "Sem jogos"
#: data/gtk/window.blp:22 #: data/gtk/window.blp:22
#, fuzzy
msgid "Use the + button to add games" msgid "Use the + button to add games"
msgstr "Use o botão + para adicionar jogos." msgstr "Use o botão + para adicionar jogos"
#: data/gtk/window.blp:40 #: data/gtk/window.blp:40
msgid "No Hidden Games" msgid "No Hidden Games"
msgstr "Sem jogos ocultos" msgstr "Sem jogos ocultos"
#: data/gtk/window.blp:41 #: data/gtk/window.blp:41
#, fuzzy
msgid "Games you hide will appear here" msgid "Games you hide will appear here"
msgstr "Os jogos ocultos aparecerão aqui." msgstr "Os jogos ocultos aparecerão aqui"
#: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228 #: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228
msgid "All Games" msgid "All Games"

4
pyrightconfig.json Normal file
View File

@@ -0,0 +1,4 @@
{
"reportRedeclaration": "none",
"reportMissingModuleSource": "none"
}

View File

@@ -7,19 +7,19 @@ configure_file(
input: 'cartridges-search-provider.in', input: 'cartridges-search-provider.in',
output: 'cartridges-search-provider', output: 'cartridges-search-provider',
configuration: conf, configuration: conf,
install_dir: libexecdir install_dir: libexecdir,
) )
configure_file( configure_file(
input: 'page.kramo.Cartridges.SearchProvider.service.in', input: 'page.kramo.Cartridges.SearchProvider.service.in',
output: app_id + '.SearchProvider.service', output: app_id + '.SearchProvider.service',
configuration: conf, configuration: conf,
install_dir: service_dir install_dir: service_dir,
) )
configure_file( configure_file(
input: 'page.kramo.Cartridges.SearchProvider.ini', input: 'page.kramo.Cartridges.SearchProvider.ini',
output: app_id + '.SearchProvider.ini', output: app_id + '.SearchProvider.ini',
configuration: conf, configuration: conf,
install_dir: serarch_provider_dir install_dir: serarch_provider_dir,
) )