Compare commits
380 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afd1972a76 | ||
|
|
8a7875b843 | ||
|
|
aec8a4efa7 | ||
|
|
2b93a1feeb | ||
|
|
5306b7c81c | ||
|
|
c5675efa48 | ||
|
|
83399c7882 | ||
|
|
04900c7acf | ||
|
|
3ae6b40773 | ||
|
|
4a5ebb3221 | ||
|
|
778caead01 | ||
|
|
2b7f520f2a | ||
|
|
c80f5271da | ||
|
|
f7cf7c4a3b | ||
|
|
c4aa903752 | ||
|
|
4559516b5a | ||
|
|
d4dbf9e589 | ||
|
|
1f7c9a8b0b | ||
|
|
725267c7b9 | ||
|
|
78d6416285 | ||
|
|
c86f14c4f5 | ||
|
|
97e8f93744 | ||
|
|
6d47629bd0 | ||
|
|
ccd97c73ea | ||
|
|
8ec776a04c | ||
|
|
8efce829ca | ||
|
|
6155ace0ec | ||
|
|
35d85a607f | ||
|
|
7ed7814e51 | ||
|
|
b086766b77 | ||
|
|
389b904455 | ||
|
|
303f2a2063 | ||
|
|
3e1ef88a1f | ||
|
|
124d2c8ec7 | ||
|
|
f741b9f100 | ||
|
|
7c9d9a317b | ||
|
|
b707f90a3f | ||
|
|
06e4dadf3c | ||
|
|
80c8566535 | ||
|
|
3f5d3eb3b1 | ||
|
|
64ae27a8a4 | ||
|
|
0482167237 | ||
|
|
2c9c9febfc | ||
|
|
8825c09ae8 | ||
|
|
ec69361826 | ||
|
|
f8bc23991a | ||
|
|
29da7feba9 | ||
|
|
93049f3908 | ||
|
|
5ab3085083 | ||
|
|
7d0b9854d3 | ||
|
|
bcc3c57117 | ||
|
|
08a90365a8 | ||
|
|
a6884b5c3c | ||
|
|
f7a3e01cee | ||
|
|
9bce2190f7 | ||
|
|
8f4ddb37b2 | ||
|
|
551acccbd9 | ||
|
|
b521ea6daf | ||
|
|
248cd10367 | ||
|
|
387430d5cd | ||
|
|
6017c57e6c | ||
|
|
50bc67bb1b | ||
|
|
76fd2f97ef | ||
|
|
e5f8e81c2e | ||
|
|
b574439328 | ||
|
|
2b52391229 | ||
|
|
9b24f7c473 | ||
|
|
644bf10713 | ||
|
|
2962988727 | ||
|
|
6d3d6e6a8f | ||
|
|
9557caecbc | ||
|
|
a48841e5cb | ||
|
|
59966e9198 | ||
|
|
69394d01ec | ||
|
|
684f457713 | ||
|
|
baa4d6f0c4 | ||
|
|
2662d66058 | ||
|
|
2cd670fcfe | ||
|
|
38bed27c61 | ||
|
|
815c1ec088 | ||
|
|
89ba4aecaa | ||
|
|
82ff5b3b46 | ||
|
|
3a052b6367 | ||
|
|
6a78f6d55e | ||
|
|
a352d21864 | ||
|
|
6f51f8ad7a | ||
|
|
cfbd68bf12 | ||
|
|
ad545921b7 | ||
|
|
69928a8b4f | ||
|
|
61e7e0274c | ||
|
|
406d0c281c | ||
|
|
27bc40e6f6 | ||
|
|
ac36118d57 | ||
|
|
38e71e32b9 | ||
|
|
c3226e33e8 | ||
|
|
3513f29435 | ||
|
|
bd7cda12e3 | ||
|
|
0c7f2f2800 | ||
|
|
5f9c990b25 | ||
|
|
29a3e6e9d3 | ||
|
|
bebc8f3d7f | ||
|
|
df2b8c40c9 | ||
|
|
69b168ca01 | ||
|
|
8e01f125f1 | ||
|
|
6d3762b31b | ||
|
|
8df64c4d05 | ||
|
|
42927032c1 | ||
|
|
d3b2615bce | ||
|
|
bb41fc5345 | ||
|
|
22ba068bd3 | ||
|
|
294a846374 | ||
|
|
2982129bfe | ||
|
|
2d9c954932 | ||
|
|
776a9683f7 | ||
|
|
90f9dd0b54 | ||
|
|
99c8dad184 | ||
|
|
189b381a5a | ||
|
|
2f90d2306b | ||
|
|
1835910284 | ||
|
|
421d534d79 | ||
|
|
a8b1791d8f | ||
|
|
ea5617518b | ||
|
|
5860a47072 | ||
|
|
0eada1edf7 | ||
|
|
65e870f6b8 | ||
|
|
34ab816a09 | ||
|
|
273955749a | ||
|
|
3bef033e5e | ||
|
|
81a65a7c10 | ||
|
|
82acfcd67c | ||
|
|
8511c87410 | ||
|
|
f3a0db6e2e | ||
|
|
89c1b5eca0 | ||
|
|
4a9b554f0f | ||
|
|
89bc0877fd | ||
|
|
c5b56e3100 | ||
|
|
c9c5f41ee9 | ||
|
|
ee912ba4ca | ||
|
|
46196fd0de | ||
|
|
94f7dbfd59 | ||
|
|
8516e19d9d | ||
|
|
79a7c5ab3e | ||
|
|
f273f9b23f | ||
|
|
35b23e8f27 | ||
|
|
200dbb067f | ||
|
|
66a71b105e | ||
|
|
c41bfef102 | ||
|
|
f26f9e35ef | ||
|
|
6f5836a979 | ||
|
|
1e4c499478 | ||
|
|
befbfb6d51 | ||
|
|
d11cc3ad0c | ||
|
|
d0e36323f5 | ||
|
|
a6022484a8 | ||
|
|
25aeea7f52 | ||
|
|
642f2192f8 | ||
|
|
68def0a60d | ||
|
|
5dd4f2bb57 | ||
|
|
0d65a43845 | ||
|
|
a70b528eb0 | ||
|
|
4e945945c3 | ||
|
|
32e7af6559 | ||
|
|
c0f1c93bb6 | ||
|
|
74ec8cbb75 | ||
|
|
837c46b1ba | ||
|
|
5680b08e1c | ||
|
|
c0b6998833 | ||
|
|
93054b2f57 | ||
|
|
ae86450a01 | ||
|
|
ed36feecaf | ||
|
|
6486f5b336 | ||
|
|
a1afb98b20 | ||
|
|
c607a65d1f | ||
|
|
5364e6a320 | ||
|
|
89862ae266 | ||
|
|
82a7d4b20e | ||
|
|
c2d671273a | ||
|
|
38d47dae33 | ||
|
|
e287ec1986 | ||
|
|
a79c6b980b | ||
|
|
0c55c3ba2a | ||
|
|
8c5f4f1780 | ||
|
|
01f1f31f10 | ||
|
|
a9196c1e55 | ||
|
|
489cb543de | ||
|
|
ab128ab461 | ||
|
|
9883cc6b6b | ||
|
|
70b8493e72 | ||
|
|
20f1ce6e83 | ||
|
|
1e2d85b50d | ||
|
|
2d791e46b0 | ||
|
|
bc3bc2dac6 | ||
|
|
059709d18d | ||
|
|
81d3323a21 | ||
|
|
1afd8916e3 | ||
|
|
5cf41402e7 | ||
|
|
4bd82c9457 | ||
|
|
d44632de8f | ||
|
|
7c6936503a | ||
|
|
e91d641444 | ||
|
|
57b931200e | ||
|
|
17d89f444d | ||
|
|
d4b0f98caa | ||
|
|
420ca939ef | ||
|
|
91f4e05abe | ||
|
|
a4a929c965 | ||
|
|
37f838e4a2 | ||
|
|
a39303603c | ||
|
|
195f7dbb7e | ||
|
|
191beed12e | ||
|
|
208eae75c1 | ||
|
|
f3c590b033 | ||
|
|
a0c736b7cf | ||
|
|
0d32414f1e | ||
|
|
eeb18eb017 | ||
|
|
a3aa7f9ccf | ||
|
|
0e2918cfe8 | ||
|
|
e67977287d | ||
|
|
57a7c98f7a | ||
|
|
8dc96b53b2 | ||
|
|
0d6432388c | ||
|
|
73897a9ed3 | ||
|
|
f8037e2542 | ||
|
|
afb2d8b6d3 | ||
|
|
dbb6076fdc | ||
|
|
16d6a026e5 | ||
|
|
cb9513ff13 | ||
|
|
b466eb7ab2 | ||
|
|
5551756111 | ||
|
|
9b97e8c355 | ||
|
|
5abf3f300d | ||
|
|
8ca264ff95 | ||
|
|
1c2c844f89 | ||
|
|
86ac95641c | ||
|
|
c2c998adcd | ||
|
|
70063172aa | ||
|
|
0599a61057 | ||
|
|
07b78bcdbd | ||
|
|
2655b60806 | ||
|
|
21952e635a | ||
|
|
9670a98246 | ||
|
|
3ebd2dd883 | ||
|
|
78199267b3 | ||
|
|
0098669ab6 | ||
|
|
fefa9d27bd | ||
|
|
fe07f4f571 | ||
|
|
70d8d91b53 | ||
|
|
675359ee58 | ||
|
|
f43d8ff907 | ||
|
|
e90215bf66 | ||
|
|
2e844b2d06 | ||
|
|
8de7226a2f | ||
|
|
7598f1ea71 | ||
|
|
417a02e8b6 | ||
|
|
1aff1347e3 | ||
|
|
e4dc1253ae | ||
|
|
459e13ad05 | ||
|
|
e554cf8678 | ||
|
|
f0afdcc943 | ||
|
|
d3a6eaa4d1 | ||
|
|
1404878e28 | ||
|
|
fa8a15addf | ||
|
|
04d0e9e90e | ||
|
|
0677eae0a2 | ||
|
|
f3dcdbf0d2 | ||
|
|
0b577d2480 | ||
|
|
ca73023bc9 | ||
|
|
b8cd1fd741 | ||
|
|
26e8d6d2c6 | ||
|
|
311ed3b09c | ||
|
|
8eca19d9a1 | ||
|
|
7bcb113a33 | ||
|
|
fbf076660d | ||
|
|
b1992a9466 | ||
|
|
4510daf8cc | ||
|
|
8bb2368b3d | ||
|
|
c347d9b0f4 | ||
|
|
9cd4d7048c | ||
|
|
da777d3605 | ||
|
|
4587720934 | ||
|
|
270fa2092c | ||
|
|
82dddd1c5c | ||
|
|
3d17b5a920 | ||
|
|
2c67dd23ab | ||
|
|
45d1ddaa7d | ||
|
|
bb4870e99d | ||
|
|
190b446de5 | ||
|
|
52b6c47c8d | ||
|
|
0df123975c | ||
|
|
7f576d1bd3 | ||
|
|
30152cd10a | ||
|
|
2acdedf033 | ||
|
|
a399113ff9 | ||
|
|
8839db272b | ||
|
|
a0bfca01d6 | ||
|
|
0601fd5ebb | ||
|
|
15da65fccf | ||
|
|
00ff297867 | ||
|
|
fbb2ccec57 | ||
|
|
8bd96fdb38 | ||
|
|
55cd590424 | ||
|
|
386120a505 | ||
|
|
faee57a42a | ||
|
|
0a2051f5c7 | ||
|
|
be6338cdd4 | ||
|
|
bb7fded0e5 | ||
|
|
7d91b84a87 | ||
|
|
62ebcba590 | ||
|
|
0865d4e133 | ||
|
|
9a7875eb87 | ||
|
|
6b26076b92 | ||
|
|
19b0737715 | ||
|
|
06de79ad54 | ||
|
|
9ffbcc73ae | ||
|
|
5a89f8a542 | ||
|
|
f9cfc311fa | ||
|
|
45884d5c11 | ||
|
|
86a34f1596 | ||
|
|
9ccb315a2d | ||
|
|
3002cef448 | ||
|
|
89f6dcad19 | ||
|
|
5c62b7ba02 | ||
|
|
c96b64f72e | ||
|
|
c00234754f | ||
|
|
8ab3cf274e | ||
|
|
de4a7ae303 | ||
|
|
a1c5a4bdd8 | ||
|
|
cc8256d945 | ||
|
|
6114f65204 | ||
|
|
036aad32cd | ||
|
|
33e847ef94 | ||
|
|
8f4e4e619a | ||
|
|
5be70bba52 | ||
|
|
99ef85daf3 | ||
|
|
719cedba67 | ||
|
|
19432a1fe7 | ||
|
|
220d00141f | ||
|
|
633e2a6c5d | ||
|
|
bc25afa494 | ||
|
|
6bf246a8e6 | ||
|
|
ac71bc6ecb | ||
|
|
d7d6270bbc | ||
|
|
cd986c3f5e | ||
|
|
c3bd7ee736 | ||
|
|
b4bfe38765 | ||
|
|
a0c46bbc74 | ||
|
|
6a06f7329d | ||
|
|
16db07511a | ||
|
|
34863901fd | ||
|
|
3f5f8b71e8 | ||
|
|
618a98ee89 | ||
|
|
867e4d3cce | ||
|
|
3c019796c2 | ||
|
|
1c8448c1e1 | ||
|
|
ec7f9bd560 | ||
|
|
dad3dcafb7 | ||
|
|
c6ef2ea0b4 | ||
|
|
6db3557cff | ||
|
|
22200be167 | ||
|
|
eb0d3584cf | ||
|
|
6d9d594caf | ||
|
|
cf6b69619a | ||
|
|
fe5b85c79c | ||
|
|
e7d27cc1c4 | ||
|
|
e4d9f8ba45 | ||
|
|
2d00d3a1bc | ||
|
|
87a4319360 | ||
|
|
b577b3ec7b | ||
|
|
dc232e1e43 | ||
|
|
39be891452 | ||
|
|
c3cad7c793 | ||
|
|
2952322759 | ||
|
|
653bc8668c | ||
|
|
1a23851000 | ||
|
|
560d1cd273 | ||
|
|
dc0d7304f1 | ||
|
|
6893551f1c | ||
|
|
df461421c3 | ||
|
|
536e6792e7 | ||
|
|
5fd6ea20f4 |
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
github: [kra-mo]
|
||||||
68
.github/workflows/ci.yml
vendored
@@ -10,51 +10,51 @@ jobs:
|
|||||||
name: Flatpak
|
name: Flatpak
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: bilelmoussaoui/flatpak-github-actions:gnome-44
|
image: bilelmoussaoui/flatpak-github-actions:gnome-45
|
||||||
options: --privileged
|
options: --privileged
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Flatpak Builder
|
- name: Flatpak Builder
|
||||||
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.1
|
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3
|
||||||
with:
|
with:
|
||||||
bundle: hu.kramo.Cartridges.Devel.flatpak
|
bundle: hu.kramo.Cartridges.Devel.flatpak
|
||||||
manifest-path: flatpak/hu.kramo.Cartridges.Devel.json
|
manifest-path: flatpak/hu.kramo.Cartridges.Devel.json
|
||||||
|
|
||||||
windows:
|
# windows:
|
||||||
name: Windows
|
# name: Windows
|
||||||
runs-on: windows-latest
|
# runs-on: windows-latest
|
||||||
steps:
|
# steps:
|
||||||
- name: Checkout
|
# - name: Checkout
|
||||||
uses: actions/checkout@v3
|
# uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup MSYS2
|
# - name: Setup MSYS2
|
||||||
uses: msys2/setup-msys2@v2
|
# uses: msys2/setup-msys2@v2
|
||||||
with:
|
# with:
|
||||||
msystem: UCRT64
|
# msystem: UCRT64
|
||||||
update: true
|
# update: true
|
||||||
install: mingw-w64-ucrt-x86_64-gtk4 mingw-w64-ucrt-x86_64-libadwaita mingw-w64-ucrt-x86_64-python-gobject mingw-w64-ucrt-x86_64-python-yaml mingw-w64-ucrt-x86_64-python-requests mingw-w64-ucrt-x86_64-python-pillow mingw-w64-ucrt-x86_64-desktop-file-utils mingw-w64-ucrt-x86_64-ca-certificates mingw-w64-ucrt-x86_64-meson git
|
# install: mingw-w64-ucrt-x86_64-gtk4 mingw-w64-ucrt-x86_64-libadwaita mingw-w64-ucrt-x86_64-python-gobject mingw-w64-ucrt-x86_64-python-yaml mingw-w64-ucrt-x86_64-python-requests mingw-w64-ucrt-x86_64-python-pillow mingw-w64-ucrt-x86_64-desktop-file-utils mingw-w64-ucrt-x86_64-ca-certificates mingw-w64-ucrt-x86_64-meson git
|
||||||
|
|
||||||
- name: Compile
|
# - name: Compile
|
||||||
shell: msys2 {0}
|
# shell: msys2 {0}
|
||||||
run: |
|
# run: |
|
||||||
meson setup _build
|
# meson setup _build
|
||||||
ninja -C _build install
|
# ninja -C _build install
|
||||||
pacman --noconfirm -Rs mingw-w64-ucrt-x86_64-desktop-file-utils mingw-w64-ucrt-x86_64-meson git
|
# pacman --noconfirm -Rs mingw-w64-ucrt-x86_64-desktop-file-utils mingw-w64-ucrt-x86_64-meson git
|
||||||
find /ucrt64/share/locale/ -type f ! -name "*cartridges.mo" -delete
|
# find /ucrt64/share/locale/ -type f ! -name "*cartridges.mo" -delete
|
||||||
|
|
||||||
- name: Test
|
# - name: Test
|
||||||
shell: msys2 {0}
|
# shell: msys2 {0}
|
||||||
run: |
|
# run: |
|
||||||
set +e
|
# set +e
|
||||||
timeout 2 cartridges; [ "$?" -eq "124" ]
|
# timeout 2 cartridges; [ "$?" -eq "124" ]
|
||||||
|
|
||||||
- name: Inno Setup
|
# - name: Inno Setup
|
||||||
run: iscc ".\_build\Cartridges.iss"
|
# run: iscc ".\_build\windows\Cartridges.iss"
|
||||||
|
|
||||||
- name: Upload Artifact
|
# - name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
# uses: actions/upload-artifact@v3
|
||||||
with:
|
# with:
|
||||||
name: Windows Installer
|
# name: Windows Installer
|
||||||
path: _build/Output/Cartridges Setup.exe
|
# path: _build/windows/Output/Cartridges Setup.exe
|
||||||
|
|||||||
10
.github/workflows/publish-release.yml
vendored
@@ -11,10 +11,10 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Download workflow artifact
|
- name: Download workflow artifact
|
||||||
uses: dawidd6/action-download-artifact@v2.27.0
|
uses: dawidd6/action-download-artifact@v3.0.0
|
||||||
with:
|
with:
|
||||||
workflow: ci.yml
|
workflow: ci.yml
|
||||||
commit: ${{ github.sha }}
|
commit: ${{ github.sha }}
|
||||||
@@ -39,7 +39,7 @@ jobs:
|
|||||||
- name: Publish release
|
- name: Publish release
|
||||||
uses: softprops/action-gh-release@v0.1.15
|
uses: softprops/action-gh-release@v0.1.15
|
||||||
with:
|
with:
|
||||||
files: Windows Installer/Cartridges Setup.exe
|
# files: Windows Installer/Cartridges Setup.exe
|
||||||
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
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
ignore=importers
|
ignore=importers
|
||||||
|
|
||||||
[MESSAGES CONTROL]
|
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
|
||||||
disable=raw-checker-failed,
|
disable=raw-checker-failed,
|
||||||
bad-inline-option,
|
bad-inline-option,
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
The project follows the [GNOME Code of Conduct](https://wiki.gnome.org/Foundation/CodeOfConduct).
|
The project follows the [GNOME Code of Conduct](https://conduct.gnome.org/).
|
||||||
|
|
||||||
If you believe that someone is violating the Code of Conduct, or have any other concerns, please contact us via [cartridges-community@kramo.hu](mailto:cartridges-community@kramo.hu).
|
If you believe that someone is violating the Code of Conduct, or have any other concerns, please contact us via [cartridges-community@kramo.page](mailto:cartridges-community@kramo.page).
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
## Code
|
## Code
|
||||||
Fork the repository, make your changes, then create a pull request.
|
|
||||||
|
Be sure to follow the [code style](#code-style) of the project.
|
||||||
|
|
||||||
|
### Adding a feature
|
||||||
|
[Create an issue](https://github.com/kra-mo/cartridges/issues/new) or join the [Discord](https://discord.gg/4KSFh3AmQR)/[Matrix](https://matrix.to/#/#cartridges:matrix.org) to discuss it with the maintainers. We will provide additional guidance.
|
||||||
|
|
||||||
|
### Fixing a bug
|
||||||
|
Fork the repository, make your changes, then create a pull request. Be sure to mention the GitHub issue you're fixing if one was already open.
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
### Weblate
|
### Weblate
|
||||||
@@ -17,7 +24,7 @@ The project can be translated on [Weblate](https://hosted.weblate.org/engage/car
|
|||||||
# Building
|
# Building
|
||||||
|
|
||||||
## GNOME Builder
|
## GNOME Builder
|
||||||
1. Install [GNOME Builder](https://flathub.org/apps/details/org.gnome.Builder).
|
1. Install [GNOME Builder](https://flathub.org/apps/org.gnome.Builder).
|
||||||
2. Click "Clone Repository" with `https://github.com/kra-mo/cartridges.git` as the URL.
|
2. Click "Clone Repository" with `https://github.com/kra-mo/cartridges.git` as the URL.
|
||||||
3. Click on the build button (hammer) at the top.
|
3. Click on the build button (hammer) at the top.
|
||||||
|
|
||||||
@@ -33,3 +40,23 @@ cd cartridges
|
|||||||
meson setup build
|
meson setup build
|
||||||
ninja -C build install
|
ninja -C build install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Code style
|
||||||
|
|
||||||
|
All code is auto-formatted with [Black](https://github.com/psf/black) and linted with [Pylint](https://github.com/pylint-dev/pylint). Imports are sorted by [isort](https://github.com/pycqa/isort).
|
||||||
|
|
||||||
|
VSCode extensions are available for all of these and you can set them up with the following `settings.json` configuration:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"python.formatting.provider": "none",
|
||||||
|
"[python]": {
|
||||||
|
"editor.defaultFormatter": "ms-python.black-formatter",
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.organizeImports": true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"isort.args":["--profile", "black"],
|
||||||
|
```
|
||||||
|
|
||||||
|
For other code editors, you can install them via `pip` and invoke them from the command line.
|
||||||
|
|||||||
61
README.md
@@ -1,37 +1,37 @@
|
|||||||
|
|
||||||
|
[circle-url]: https://circle.gnome.org
|
||||||
|
[circle-image]: https://circle.gnome.org/assets/button/badge.svg
|
||||||
|
[weblate-url]: https://hosted.weblate.org/engage/cartridges/
|
||||||
|
[weblate-image]: https://hosted.weblate.org/widgets/cartridges/-/cartridges/svg-badge.svg
|
||||||
|
[discord-url]: https://discord.gg/4KSFh3AmQR
|
||||||
|
[discord-image]: https://img.shields.io/discord/1088155799299313754?color=%235865F2&label=discord&logo=discord&logoColor=%23FFFFFF&style=for-the-badge
|
||||||
|
[matrix-url]: https://matrix.to/#/#cartridges:matrix.org
|
||||||
|
[matrix-image]: https://img.shields.io/matrix/cartridges:matrix.org?label=Matrix&logo=matrix&color=%230dbd8b&style=for-the-badge
|
||||||
|
[flathub-url]: https://flathub.org/apps/hu.kramo.Cartridges
|
||||||
|
[flathub-image]: https://img.shields.io/flathub/v/hu.kramo.Cartridges?logo=flathub&style=for-the-badge
|
||||||
|
[installs-image]: https://img.shields.io/flathub/downloads/hu.kramo.Cartridges?style=for-the-badge
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="data/icons/hicolor/scalable/apps/hu.kramo.Cartridges.svg" width="128" height="128">
|
<img src="data/icons/hicolor/scalable/apps/hu.kramo.Cartridges.svg" width="128" height="128">
|
||||||
|
|
||||||
# Cartridges
|
# Cartridges
|
||||||
|
|
||||||
A GTK4 + Libadwaita game launcher
|
|
||||||
|
|
||||||
[![GNOME Circle][circle-image]][circle-url]
|
A GTK4 + Libadwaita game launcher
|
||||||
[![Flathub][flathub-image]][flathub-url]
|
|
||||||
[![Build status][github-actions-image]][github-actions-url]
|
|
||||||
[![Translation Status][weblate-image]][weblate-url]
|
|
||||||
[![Code style][code-style-image]][code-style-url]
|
|
||||||
[![Discord][discord-image]][discord-url]
|
|
||||||
|
|
||||||
[circle-url]: https://circle.gnome.org
|
[![GNOME Circle][circle-image]][circle-url]
|
||||||
[circle-image]: https://circle.gnome.org/assets/button/badge.svg
|
[![Translation Status][weblate-image]][weblate-url]
|
||||||
[github-actions-url]: https://github.com/kra-mo/cartridges
|
|
||||||
[github-actions-image]: https://github.com/kra-mo/cartridges/actions/workflows/ci.yml/badge.svg
|
[![Flathub][flathub-image]][flathub-url]
|
||||||
[code-style-url]: https://github.com/psf/black
|
[![Discord][discord-image]][discord-url]
|
||||||
[code-style-image]: https://img.shields.io/badge/code%20style-black-000000?style=flat
|
[![Matrix][matrix-image]][matrix-url]
|
||||||
[weblate-url]: https://hosted.weblate.org/engage/cartridges/
|
[![Installs][installs-image]][flathub-url]
|
||||||
[weblate-image]: https://hosted.weblate.org/widgets/cartridges/-/cartridges/svg-badge.svg
|
|
||||||
[discord-url]: https://discord.gg/4KSFh3AmQR
|
|
||||||
[discord-image]: https://img.shields.io/discord/1088155799299313754?color=%235865F2&label=discord&logo=discord&logoColor=%23FFFFFF
|
|
||||||
[flathub-url]: https://flathub.org/apps/hu.kramo.Cartridges
|
|
||||||
[flathub-image]: https://img.shields.io/flathub/v/hu.kramo.Cartridges
|
|
||||||
|
|
||||||
<img src="data/screenshots/1.png">
|
<img src="data/screenshots/1.png">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
# The Project
|
# The Project
|
||||||
|
|
||||||
Cartridges is a simple game launcher written in Python using GTK4 and Libadwaita.
|
Cartridges is an easy-to-use, elegant game launcher written in Python using GTK4 and Libadwaita.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -43,14 +43,23 @@ Cartridges is a simple game launcher written in Python using GTK4 and Libadwaita
|
|||||||
- Bottles
|
- Bottles
|
||||||
- itch
|
- itch
|
||||||
- Legendary
|
- Legendary
|
||||||
|
- RetroArch
|
||||||
- Flatpak
|
- Flatpak
|
||||||
- Hiding games
|
- Desktop Entries
|
||||||
|
- Filtering games by source
|
||||||
- Searching and sorting by title, date added and last played
|
- Searching and sorting by title, date added and last played
|
||||||
|
- Hiding games
|
||||||
- Automatically downloading cover art from [SteamGridDB](https://www.steamgriddb.com/)
|
- Automatically downloading cover art from [SteamGridDB](https://www.steamgriddb.com/)
|
||||||
- Searching for games on various databases
|
- Searching for games on various databases
|
||||||
- Animated covers
|
- Animated covers
|
||||||
|
- A search provider for GNOME
|
||||||
|
|
||||||
For updates and questions, join our [Discord server][discord-url]!
|
For updates and questions, join our [Discord server][discord-url] (bridged to [Matrix](https://matrix.to/#/#cartridges:matrix.org))!
|
||||||
|
|
||||||
|
## Donations
|
||||||
|
I accept donations through [GitHub Sponsors](https://github.com/sponsors/kra-mo).
|
||||||
|
|
||||||
|
Thank you for your generosity! 💜
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
@@ -73,7 +82,7 @@ Note: Windows might present you with a warning when trying to install the app. T
|
|||||||
|
|
||||||
### Winget
|
### Winget
|
||||||
|
|
||||||
Install the latest release with the command: `winget install cartridges`.
|
Install the latest release with the command: `winget install cartridges`.
|
||||||
|
|
||||||
## Building manually
|
## Building manually
|
||||||
|
|
||||||
@@ -87,6 +96,6 @@ Thanks to [Weblate](https://weblate.org/) for hosting our translations!
|
|||||||
|
|
||||||
# Code of Conduct
|
# Code of Conduct
|
||||||
|
|
||||||
The project follows the [GNOME Code of Conduct](https://wiki.gnome.org/Foundation/CodeOfConduct).
|
The project follows the [GNOME Code of Conduct](https://conduct.gnome.org/).
|
||||||
|
|
||||||
See [CODE_OF_CONDUCT.md](https://github.com/kra-mo/cartridges/blob/main/CODE_OF_CONDUCT.md).
|
See [CODE_OF_CONDUCT.md](https://github.com/kra-mo/cartridges/blob/main/CODE_OF_CONDUCT.md).
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Cartridges is a simple game launcher for all of your games. It has support for i
|
|||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
<foaf:name>kramo</foaf:name>
|
<foaf:name>kramo</foaf:name>
|
||||||
<foaf:mbox rdf:resource="mailto:contact@kramo.hu" />
|
<foaf:mbox rdf:resource="mailto:contact@kramo.page" />
|
||||||
<foaf:account>
|
<foaf:account>
|
||||||
<foaf:OnlineAccount>
|
<foaf:OnlineAccount>
|
||||||
<foaf:accountServiceHomepage rdf:resource="https://github.com"/>
|
<foaf:accountServiceHomepage rdf:resource="https://github.com"/>
|
||||||
@@ -37,23 +37,5 @@ Cartridges is a simple game launcher for all of your games. It has support for i
|
|||||||
</foaf:account>
|
</foaf:account>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
<maintainer>
|
|
||||||
<foaf:Person>
|
|
||||||
<foaf:name>Geoffrey Coulaud</foaf:name>
|
|
||||||
<foaf:mbox rdf:resource="mailto:geoffrey.coulaud@gmail.com" />
|
|
||||||
<foaf:account>
|
|
||||||
<foaf:OnlineAccount>
|
|
||||||
<foaf:accountServiceHomepage rdf:resource="https://github.com"/>
|
|
||||||
<foaf:accountName>GeoffreyCoulaud</foaf:accountName>
|
|
||||||
</foaf:OnlineAccount>
|
|
||||||
</foaf:account>
|
|
||||||
<foaf:account>
|
|
||||||
<foaf:OnlineAccount>
|
|
||||||
<foaf:accountServiceHomepage rdf:resource="https://gitlab.gnome.org"/>
|
|
||||||
<foaf:accountName>GeoffreyCoulaud</foaf:accountName>
|
|
||||||
</foaf:OnlineAccount>
|
|
||||||
</foaf:account>
|
|
||||||
</foaf:Person>
|
|
||||||
</maintainer>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -19,11 +19,11 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import signal
|
|
||||||
import locale
|
|
||||||
import gettext
|
import gettext
|
||||||
|
import locale
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
|
||||||
VERSION = "@VERSION@"
|
VERSION = "@VERSION@"
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
@@ -32,29 +32,27 @@ if os.name == "nt":
|
|||||||
os.environ["LANGUAGE"] = locale.windows_locale[
|
os.environ["LANGUAGE"] = locale.windows_locale[
|
||||||
windll.kernel32.GetUserDefaultUILanguage()
|
windll.kernel32.GetUserDefaultUILanguage()
|
||||||
]
|
]
|
||||||
pkgdatadir = os.path.join(os.path.dirname(__file__), "..", "share", "cartridges")
|
PKGDATADIR = os.path.join(os.path.dirname(__file__), "..", "share", "cartridges")
|
||||||
localedir = os.path.join(os.path.dirname(__file__), "..", "share", "locale")
|
LOCALEDIR = os.path.join(os.path.dirname(__file__), "..", "share", "locale")
|
||||||
else:
|
else:
|
||||||
pkgdatadir = "@pkgdatadir@"
|
PKGDATADIR = "@pkgdatadir@"
|
||||||
localedir = "@localedir@"
|
LOCALEDIR = "@localedir@"
|
||||||
|
|
||||||
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 os.name != "nt":
|
||||||
locale.bindtextdomain("cartridges", localedir)
|
locale.bindtextdomain("cartridges", LOCALEDIR)
|
||||||
locale.textdomain("cartridges")
|
locale.textdomain("cartridges")
|
||||||
|
|
||||||
gettext.install("cartridges", localedir)
|
gettext.install("cartridges", LOCALEDIR)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import gi
|
|
||||||
|
|
||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
resource = Gio.Resource.load(os.path.join(pkgdatadir, "cartridges.gresource"))
|
resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource"))
|
||||||
resource._register()
|
resource._register() # pylint: disable=protected-access
|
||||||
|
|
||||||
from src import main
|
from cartridges import main
|
||||||
|
|
||||||
sys.exit(main.main(VERSION))
|
sys.exit(main.main(VERSION))
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# details_window.py
|
# details_window.py
|
||||||
#
|
#
|
||||||
# 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
|
||||||
@@ -18,23 +18,27 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import shlex
|
||||||
|
from pathlib import Path
|
||||||
from time import time
|
from time import time
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
from gi.repository import Adw, Gio, GLib, Gtk
|
from gi.repository import Adw, Gio, GLib, Gtk
|
||||||
from PIL import Image
|
from PIL import Image, UnidentifiedImageError
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.errors.friendly_error import FriendlyError
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.game_cover import GameCover
|
from cartridges.game_cover import GameCover
|
||||||
from src.store.managers.sgdb_manager import SGDBManager
|
from cartridges.store.managers.cover_manager import CoverManager
|
||||||
from src.utils.create_dialog import create_dialog
|
from cartridges.store.managers.sgdb_manager import SgdbManager
|
||||||
from src.utils.save_cover import resize_cover, save_cover
|
from cartridges.utils.create_dialog import create_dialog
|
||||||
|
from cartridges.utils.save_cover import convert_cover, save_cover
|
||||||
|
|
||||||
|
|
||||||
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/details-window.ui")
|
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/details-dialog.ui")
|
||||||
class DetailsWindow(Adw.Window):
|
class DetailsDialog(Adw.Dialog):
|
||||||
__gtype_name__ = "DetailsWindow"
|
__gtype_name__ = "DetailsDialog"
|
||||||
|
|
||||||
cover_overlay = Gtk.Template.Child()
|
cover_overlay = Gtk.Template.Child()
|
||||||
cover = Gtk.Template.Child()
|
cover = Gtk.Template.Child()
|
||||||
@@ -49,22 +53,19 @@ class DetailsWindow(Adw.Window):
|
|||||||
|
|
||||||
exec_info_label = Gtk.Template.Child()
|
exec_info_label = Gtk.Template.Child()
|
||||||
exec_info_popover = Gtk.Template.Child()
|
exec_info_popover = Gtk.Template.Child()
|
||||||
|
file_chooser_button = Gtk.Template.Child()
|
||||||
|
|
||||||
apply_button = Gtk.Template.Child()
|
apply_button = Gtk.Template.Child()
|
||||||
|
|
||||||
cover_changed = False
|
cover_changed: bool = False
|
||||||
|
|
||||||
def __init__(self, game=None, **kwargs):
|
def __init__(self, game: Optional[Game] = None, **kwargs: Any):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
self.game: Game = game
|
||||||
self.win = shared.win
|
self.game_cover: GameCover = GameCover({self.cover})
|
||||||
self.game = game
|
|
||||||
self.game_cover = GameCover({self.cover})
|
|
||||||
|
|
||||||
self.set_transient_for(self.win)
|
|
||||||
|
|
||||||
if self.game:
|
if self.game:
|
||||||
self.set_title(_("Edit Game Details"))
|
self.set_title(_("Game Details"))
|
||||||
self.name.set_text(self.game.name)
|
self.name.set_text(self.game.name)
|
||||||
if self.game.developer:
|
if self.game.developer:
|
||||||
self.developer.set_text(self.game.developer)
|
self.developer.set_text(self.game.developer)
|
||||||
@@ -76,17 +77,29 @@ class DetailsWindow(Adw.Window):
|
|||||||
self.cover_button_delete_revealer.set_reveal_child(True)
|
self.cover_button_delete_revealer.set_reveal_child(True)
|
||||||
else:
|
else:
|
||||||
self.set_title(_("Add New Game"))
|
self.set_title(_("Add New Game"))
|
||||||
self.apply_button.set_label(_("Confirm"))
|
self.apply_button.set_label(_("Add"))
|
||||||
|
|
||||||
image_filter = Gtk.FileFilter(name=_("Images"))
|
image_filter = Gtk.FileFilter(name=_("Images"))
|
||||||
for extension in Image.registered_extensions():
|
for extension in Image.registered_extensions():
|
||||||
image_filter.add_suffix(extension[1:])
|
image_filter.add_suffix(extension[1:])
|
||||||
image_filter.add_suffix("svg") # Gdk.Texture supports .svg but PIL doesn't
|
image_filter.add_suffix("svg") # Gdk.Texture supports .svg but PIL doesn't
|
||||||
|
|
||||||
file_filters = Gio.ListStore.new(Gtk.FileFilter)
|
image_filters = Gio.ListStore.new(Gtk.FileFilter)
|
||||||
file_filters.append(image_filter)
|
image_filters.append(image_filter)
|
||||||
self.file_dialog = Gtk.FileDialog()
|
|
||||||
self.file_dialog.set_filters(file_filters)
|
exec_filter = Gtk.FileFilter(name=_("Executables"))
|
||||||
|
exec_filter.add_mime_type("application/x-executable")
|
||||||
|
|
||||||
|
exec_filters = Gio.ListStore.new(Gtk.FileFilter)
|
||||||
|
exec_filters.append(exec_filter)
|
||||||
|
|
||||||
|
self.image_file_dialog = Gtk.FileDialog()
|
||||||
|
self.image_file_dialog.set_filters(image_filters)
|
||||||
|
self.image_file_dialog.set_default_filter(image_filter)
|
||||||
|
|
||||||
|
self.exec_file_dialog = Gtk.FileDialog()
|
||||||
|
self.exec_file_dialog.set_filters(exec_filters)
|
||||||
|
self.exec_file_dialog.set_default_filter(exec_filter)
|
||||||
|
|
||||||
# Translate this string as you would translate "file"
|
# Translate this string as you would translate "file"
|
||||||
file_name = _("file.txt")
|
file_name = _("file.txt")
|
||||||
@@ -114,29 +127,36 @@ class DetailsWindow(Adw.Window):
|
|||||||
|
|
||||||
self.exec_info_label.set_label(exec_info_text)
|
self.exec_info_label.set_label(exec_info_text)
|
||||||
|
|
||||||
def clear_info_selection(*_args):
|
self.exec_info_popover.update_property(
|
||||||
self.exec_info_label.select_region(-1, -1)
|
(Gtk.AccessibleProperty.LABEL,),
|
||||||
|
(
|
||||||
|
exec_info_text.replace("<tt>", "").replace("</tt>", ""),
|
||||||
|
), # Remove formatting, else the screen reader reads it
|
||||||
|
)
|
||||||
|
|
||||||
self.exec_info_popover.connect("show", clear_info_selection)
|
def set_exec_info_a11y_label(*_args: Any) -> None:
|
||||||
|
self.set_focus(self.exec_info_popover)
|
||||||
|
|
||||||
|
self.exec_info_popover.connect("show", set_exec_info_a11y_label)
|
||||||
|
|
||||||
self.cover_button_delete.connect("clicked", self.delete_pixbuf)
|
self.cover_button_delete.connect("clicked", self.delete_pixbuf)
|
||||||
self.cover_button_edit.connect("clicked", self.choose_cover)
|
self.cover_button_edit.connect("clicked", self.choose_cover)
|
||||||
|
self.file_chooser_button.connect("clicked", self.choose_executable)
|
||||||
self.apply_button.connect("clicked", self.apply_preferences)
|
self.apply_button.connect("clicked", self.apply_preferences)
|
||||||
|
|
||||||
self.name.connect("activate", self.focus_executable)
|
self.name.connect("entry-activated", self.focus_executable)
|
||||||
self.developer.connect("activate", self.focus_executable)
|
self.developer.connect("entry-activated", self.focus_executable)
|
||||||
self.executable.connect("activate", self.apply_preferences)
|
self.executable.connect("entry-activated", self.apply_preferences)
|
||||||
|
|
||||||
self.set_focus(self.name)
|
self.set_focus(self.name)
|
||||||
self.present()
|
|
||||||
|
|
||||||
def delete_pixbuf(self, *_args):
|
def delete_pixbuf(self, *_args: Any) -> None:
|
||||||
self.game_cover.new_cover()
|
self.game_cover.new_cover()
|
||||||
|
|
||||||
self.cover_button_delete_revealer.set_reveal_child(False)
|
self.cover_button_delete_revealer.set_reveal_child(False)
|
||||||
self.cover_changed = True
|
self.cover_changed = True
|
||||||
|
|
||||||
def apply_preferences(self, *_args):
|
def apply_preferences(self, *_args: Any) -> None:
|
||||||
final_name = self.name.get_text()
|
final_name = self.name.get_text()
|
||||||
final_developer = self.developer.get_text()
|
final_developer = self.developer.get_text()
|
||||||
final_executable = self.executable.get_text()
|
final_executable = self.executable.get_text()
|
||||||
@@ -155,24 +175,32 @@ class DetailsWindow(Adw.Window):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Increment the number after the game id (eg. imported_1, imported_2)
|
# Increment the number after the game id (eg. imported_1, imported_2)
|
||||||
|
source_id = "imported"
|
||||||
numbers = [0]
|
numbers = [0]
|
||||||
game_id: str
|
game_id: str
|
||||||
for game_id in shared.store.games:
|
for game_id in shared.store.source_games.get(source_id, set()):
|
||||||
prefix = "imported_"
|
prefix = "imported_"
|
||||||
if not game_id.startswith(prefix):
|
if not game_id.startswith(prefix):
|
||||||
continue
|
continue
|
||||||
numbers.append(int(game_id.replace(prefix, "", 1)))
|
numbers.append(int(game_id.replace(prefix, "", 1)))
|
||||||
|
|
||||||
game_number = max(numbers) + 1
|
game_number = max(numbers) + 1
|
||||||
|
|
||||||
self.game = Game(
|
self.game = Game(
|
||||||
{
|
{
|
||||||
"game_id": f"imported_{game_number}",
|
"game_id": f"imported_{game_number}",
|
||||||
"hidden": False,
|
"hidden": False,
|
||||||
"source": "imported",
|
"source": source_id,
|
||||||
"added": int(time()),
|
"added": int(time()),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if shared.win.sidebar.get_selected_row().get_child() not in (
|
||||||
|
shared.win.all_games_row_box,
|
||||||
|
shared.win.added_row_box,
|
||||||
|
):
|
||||||
|
shared.win.sidebar.select_row(shared.win.added_row_box.get_parent())
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if final_name == "":
|
if final_name == "":
|
||||||
create_dialog(
|
create_dialog(
|
||||||
@@ -194,10 +222,10 @@ class DetailsWindow(Adw.Window):
|
|||||||
self.game.developer = final_developer or None
|
self.game.developer = final_developer or None
|
||||||
self.game.executable = final_executable
|
self.game.executable = final_executable
|
||||||
|
|
||||||
if self.game.game_id in self.win.game_covers.keys():
|
if self.game.game_id in shared.win.game_covers.keys():
|
||||||
self.win.game_covers[self.game.game_id].animation = None
|
shared.win.game_covers[self.game.game_id].animation = None
|
||||||
|
|
||||||
self.win.game_covers[self.game.game_id] = self.game_cover
|
shared.win.game_covers[self.game.game_id] = self.game_cover
|
||||||
|
|
||||||
if self.cover_changed:
|
if self.cover_changed:
|
||||||
save_cover(
|
save_cover(
|
||||||
@@ -213,16 +241,16 @@ class DetailsWindow(Adw.Window):
|
|||||||
# Get a cover from SGDB if none is present
|
# Get a cover from SGDB if none is present
|
||||||
if not self.game_cover.get_texture():
|
if not self.game_cover.get_texture():
|
||||||
self.game.set_loading(1)
|
self.game.set_loading(1)
|
||||||
sgdb_manager: SGDBManager = shared.store.managers[SGDBManager]
|
sgdb_manager = shared.store.managers[SgdbManager]
|
||||||
sgdb_manager.reset_cancellable()
|
sgdb_manager.reset_cancellable()
|
||||||
sgdb_manager.process_game(self.game, {}, self.update_cover_callback)
|
sgdb_manager.process_game(self.game, {}, self.update_cover_callback)
|
||||||
|
|
||||||
self.game_cover.pictures.remove(self.cover)
|
self.game_cover.pictures.remove(self.cover)
|
||||||
|
|
||||||
self.close()
|
self.close()
|
||||||
self.win.show_details_view(self.game)
|
shared.win.show_details_page(self.game)
|
||||||
|
|
||||||
def update_cover_callback(self, manager: SGDBManager):
|
def update_cover_callback(self, manager: SgdbManager) -> None:
|
||||||
# Set the game as not loading
|
# Set the game as not loading
|
||||||
self.game.set_loading(-1)
|
self.game.set_loading(-1)
|
||||||
self.game.update()
|
self.game.update()
|
||||||
@@ -239,33 +267,61 @@ class DetailsWindow(Adw.Window):
|
|||||||
_("Preferences"),
|
_("Preferences"),
|
||||||
).connect("response", self.update_cover_error_response)
|
).connect("response", self.update_cover_error_response)
|
||||||
|
|
||||||
def update_cover_error_response(self, _widget, response):
|
def update_cover_error_response(self, _widget: Any, response: str) -> None:
|
||||||
if response == "open_preferences":
|
if response == "open_preferences":
|
||||||
shared.win.get_application().on_preferences_action(page_name="sgdb")
|
shared.win.get_application().on_preferences_action(page_name="sgdb")
|
||||||
|
|
||||||
def focus_executable(self, *_args):
|
def focus_executable(self, *_args: Any) -> None:
|
||||||
self.set_focus(self.executable)
|
self.set_focus(self.executable)
|
||||||
|
|
||||||
def toggle_loading(self):
|
def toggle_loading(self) -> None:
|
||||||
self.apply_button.set_sensitive(not self.apply_button.get_sensitive())
|
self.apply_button.set_sensitive(not self.apply_button.get_sensitive())
|
||||||
self.spinner.set_spinning(not self.spinner.get_spinning())
|
self.spinner.set_spinning(not self.spinner.get_spinning())
|
||||||
self.cover_overlay.set_opacity(not self.cover_overlay.get_opacity())
|
self.cover_overlay.set_opacity(not self.cover_overlay.get_opacity())
|
||||||
|
|
||||||
def set_cover(self, _source, result, *_args):
|
def set_cover(self, _source: Any, result: Gio.Task, *_args: Any) -> None:
|
||||||
try:
|
try:
|
||||||
path = self.file_dialog.open_finish(result).get_path()
|
path = self.image_file_dialog.open_finish(result).get_path()
|
||||||
except GLib.GError:
|
except GLib.Error:
|
||||||
return
|
return
|
||||||
|
|
||||||
def resize():
|
def thread_func() -> None:
|
||||||
if cover := resize_cover(path):
|
new_path = None
|
||||||
self.game_cover.new_cover(cover)
|
|
||||||
|
try:
|
||||||
|
with Image.open(path) as image:
|
||||||
|
if getattr(image, "is_animated", False):
|
||||||
|
new_path = convert_cover(path)
|
||||||
|
except UnidentifiedImageError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not new_path:
|
||||||
|
new_path = convert_cover(
|
||||||
|
pixbuf=shared.store.managers[CoverManager].composite_cover(
|
||||||
|
Path(path)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if new_path:
|
||||||
|
self.game_cover.new_cover(new_path)
|
||||||
self.cover_button_delete_revealer.set_reveal_child(True)
|
self.cover_button_delete_revealer.set_reveal_child(True)
|
||||||
self.cover_changed = True
|
self.cover_changed = True
|
||||||
|
|
||||||
self.toggle_loading()
|
self.toggle_loading()
|
||||||
|
|
||||||
self.toggle_loading()
|
self.toggle_loading()
|
||||||
GLib.Thread.new(None, resize)
|
GLib.Thread.new(None, thread_func)
|
||||||
|
|
||||||
def choose_cover(self, *_args):
|
def set_executable(self, _source: Any, result: Gio.Task, *_args: Any) -> None:
|
||||||
self.file_dialog.open(self, None, self.set_cover)
|
try:
|
||||||
|
path = self.exec_file_dialog.open_finish(result).get_path()
|
||||||
|
except GLib.Error:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.executable.set_text(shlex.quote(path))
|
||||||
|
|
||||||
|
def choose_executable(self, *_args: Any) -> None:
|
||||||
|
self.exec_file_dialog.open(self.get_root(), None, self.set_executable)
|
||||||
|
|
||||||
|
def choose_cover(self, *_args: Any) -> None:
|
||||||
|
self.image_file_dialog.open(self.get_root(), None, self.set_cover)
|
||||||
@@ -8,14 +8,14 @@ class ErrorProducer:
|
|||||||
Specifies the report_error and collect_errors methods in a thread-safe manner.
|
Specifies the report_error and collect_errors methods in a thread-safe manner.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
errors: list[Exception] = None
|
errors: list[Exception]
|
||||||
errors_lock: Lock = None
|
errors_lock: Lock
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.errors = []
|
self.errors = []
|
||||||
self.errors_lock = Lock()
|
self.errors_lock = Lock()
|
||||||
|
|
||||||
def report_error(self, error: Exception):
|
def report_error(self, error: Exception) -> None:
|
||||||
"""Report an error"""
|
"""Report an error"""
|
||||||
with self.errors_lock:
|
with self.errors_lock:
|
||||||
self.errors.append(error)
|
self.errors.append(error)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from typing import Iterable
|
from typing import Iterable, Optional
|
||||||
|
|
||||||
|
|
||||||
class FriendlyError(Exception):
|
class FriendlyError(Exception):
|
||||||
@@ -27,8 +27,8 @@ class FriendlyError(Exception):
|
|||||||
self,
|
self,
|
||||||
title: str,
|
title: str,
|
||||||
subtitle: str,
|
subtitle: str,
|
||||||
title_args: Iterable[str] = None,
|
title_args: Optional[Iterable[str]] = None,
|
||||||
subtitle_args: Iterable[str] = None,
|
subtitle_args: Optional[Iterable[str]] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Create a friendly error
|
"""Create a friendly error
|
||||||
|
|
||||||
@@ -17,16 +17,16 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import shlex
|
import shlex
|
||||||
import subprocess
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import time
|
from time import time
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
from gi.repository import Adw, GLib, GObject, Gtk
|
from gi.repository import Adw, GObject, Gtk
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
from cartridges.game_cover import GameCover
|
||||||
|
from cartridges.utils.run_executable import run_executable
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
# pylint: disable=too-many-instance-attributes
|
||||||
@@ -45,30 +45,30 @@ class Game(Gtk.Box):
|
|||||||
game_options = Gtk.Template.Child()
|
game_options = Gtk.Template.Child()
|
||||||
hidden_game_options = Gtk.Template.Child()
|
hidden_game_options = Gtk.Template.Child()
|
||||||
|
|
||||||
loading = 0
|
loading: int = 0
|
||||||
filtered = False
|
filtered: bool = False
|
||||||
|
|
||||||
added = None
|
added: int
|
||||||
executable = None
|
executable: str
|
||||||
game_id = None
|
game_id: str
|
||||||
source = None
|
source: str
|
||||||
hidden = False
|
hidden: bool = False
|
||||||
last_played = 0
|
last_played: int = 0
|
||||||
name = None
|
name: str
|
||||||
developer = None
|
developer: Optional[str] = None
|
||||||
removed = False
|
removed: bool = False
|
||||||
blacklisted = False
|
blacklisted: bool = False
|
||||||
game_cover = None
|
game_cover: GameCover = None
|
||||||
version = 0
|
version: int = 0
|
||||||
|
|
||||||
def __init__(self, data, **kwargs):
|
def __init__(self, data: dict[str, Any], **kwargs: Any) -> None:
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
self.win = shared.win
|
self.app = shared.win.get_application()
|
||||||
self.app = self.win.get_application()
|
|
||||||
self.version = shared.SPEC_VERSION
|
self.version = shared.SPEC_VERSION
|
||||||
|
|
||||||
self.update_values(data)
|
self.update_values(data)
|
||||||
|
self.base_source = self.source.split("_")[0]
|
||||||
|
|
||||||
self.set_play_icon()
|
self.set_play_icon()
|
||||||
|
|
||||||
@@ -81,55 +81,42 @@ class Game(Gtk.Box):
|
|||||||
|
|
||||||
shared.schema.connect("changed", self.schema_changed)
|
shared.schema.connect("changed", self.schema_changed)
|
||||||
|
|
||||||
def update_values(self, data):
|
def update_values(self, data: dict[str, Any]) -> None:
|
||||||
for key, value in data.items():
|
for key, value in data.items():
|
||||||
# Convert executables to strings
|
# Convert executables to strings
|
||||||
if key == "executable" and isinstance(value, list):
|
if key == "executable" and isinstance(value, list):
|
||||||
value = shlex.join(value)
|
value = shlex.join(value)
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
def update(self):
|
def update(self) -> None:
|
||||||
self.emit("update-ready", {})
|
self.emit("update-ready", {})
|
||||||
|
|
||||||
def save(self):
|
def save(self) -> None:
|
||||||
self.emit("save-ready", {})
|
self.emit("save-ready", {})
|
||||||
|
|
||||||
def create_toast(self, title, action=None):
|
def create_toast(self, title: str, action: Optional[str] = None) -> None:
|
||||||
toast = Adw.Toast.new(title.format(self.name))
|
toast = Adw.Toast.new(title.format(self.name))
|
||||||
toast.set_priority(Adw.ToastPriority.HIGH)
|
toast.set_priority(Adw.ToastPriority.HIGH)
|
||||||
|
toast.set_use_markup(False)
|
||||||
|
|
||||||
if action:
|
if action:
|
||||||
toast.set_button_label(_("Undo"))
|
toast.set_button_label(_("Undo"))
|
||||||
toast.connect("button-clicked", self.win.on_undo_action, self, action)
|
toast.connect("button-clicked", shared.win.on_undo_action, self, action)
|
||||||
|
|
||||||
if (self, action) in self.win.toasts.keys():
|
if (self, action) in shared.win.toasts.keys():
|
||||||
# Dismiss the toast if there already is one
|
# Dismiss the toast if there already is one
|
||||||
self.win.toasts[(self, action)].dismiss()
|
shared.win.toasts[(self, action)].dismiss()
|
||||||
|
|
||||||
self.win.toasts[(self, action)] = toast
|
shared.win.toasts[(self, action)] = toast
|
||||||
|
|
||||||
self.win.toast_overlay.add_toast(toast)
|
shared.win.toast_overlay.add_toast(toast)
|
||||||
|
|
||||||
def launch(self):
|
def launch(self) -> None:
|
||||||
self.last_played = int(time())
|
self.last_played = int(time())
|
||||||
self.save()
|
self.save()
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
args = (
|
run_executable(self.executable)
|
||||||
"flatpak-spawn --host /bin/sh -c " + shlex.quote(self.executable) # Flatpak
|
|
||||||
if os.getenv("FLATPAK_ID") == shared.APP_ID
|
|
||||||
else self.executable # Others
|
|
||||||
)
|
|
||||||
|
|
||||||
logging.info("Starting %s: %s", self.name, str(args))
|
|
||||||
# pylint: disable=consider-using-with
|
|
||||||
subprocess.Popen(
|
|
||||||
args,
|
|
||||||
cwd=Path.home(),
|
|
||||||
shell=True,
|
|
||||||
start_new_session=True,
|
|
||||||
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0,
|
|
||||||
)
|
|
||||||
|
|
||||||
if shared.schema.get_boolean("exit-after-launch"):
|
if shared.schema.get_boolean("exit-after-launch"):
|
||||||
self.app.quit()
|
self.app.quit()
|
||||||
@@ -137,82 +124,80 @@ class Game(Gtk.Box):
|
|||||||
# The variable is the title of the game
|
# The variable is the title of the game
|
||||||
self.create_toast(_("{} launched"))
|
self.create_toast(_("{} launched"))
|
||||||
|
|
||||||
def toggle_hidden(self, toast=True):
|
def toggle_hidden(self, toast: bool = True) -> None:
|
||||||
self.hidden = not self.hidden
|
self.hidden = not self.hidden
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
if shared.win.navigation_view.get_visible_page() == shared.win.details_page:
|
||||||
self.win.on_go_back_action()
|
shared.win.navigation_view.pop()
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
if toast:
|
if toast:
|
||||||
self.create_toast(
|
self.create_toast(
|
||||||
# The variable is the title of the game
|
# The variable is the title of the game
|
||||||
(_("{} hidden") if self.hidden else _("{} unhidden")).format(
|
(_("{} hidden") if self.hidden else _("{} unhidden")).format(self.name),
|
||||||
GLib.markup_escape_text(self.name)
|
|
||||||
),
|
|
||||||
"hide",
|
"hide",
|
||||||
)
|
)
|
||||||
|
|
||||||
def remove_game(self):
|
def remove_game(self) -> None:
|
||||||
# Add "removed=True" to the game properties so it can be deleted on next init
|
# Add "removed=True" to the game properties so it can be deleted on next init
|
||||||
self.removed = True
|
self.removed = True
|
||||||
self.save()
|
self.save()
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
if shared.win.navigation_view.get_visible_page() == shared.win.details_page:
|
||||||
self.win.on_go_back_action()
|
shared.win.navigation_view.pop()
|
||||||
|
|
||||||
# The variable is the title of the game
|
# The variable is the title of the game
|
||||||
self.create_toast(
|
self.create_toast(_("{} removed").format(self.name), "remove")
|
||||||
_("{} removed").format(GLib.markup_escape_text(self.name)), "remove"
|
|
||||||
)
|
|
||||||
|
|
||||||
def set_loading(self, state):
|
def set_loading(self, state: int) -> None:
|
||||||
self.loading += state
|
self.loading += state
|
||||||
loading = self.loading > 0
|
loading = self.loading > 0
|
||||||
|
|
||||||
self.cover.set_opacity(int(not loading))
|
self.cover.set_opacity(int(not loading))
|
||||||
self.spinner.set_spinning(loading)
|
self.spinner.set_spinning(loading)
|
||||||
|
|
||||||
def get_cover_path(self):
|
def get_cover_path(self) -> Optional[Path]:
|
||||||
cover_path = shared.covers_dir / f"{self.game_id}.gif"
|
cover_path = shared.covers_dir / f"{self.game_id}.gif"
|
||||||
if cover_path.is_file():
|
if cover_path.is_file():
|
||||||
return cover_path
|
return cover_path # type: ignore
|
||||||
|
|
||||||
cover_path = shared.covers_dir / f"{self.game_id}.tiff"
|
cover_path = shared.covers_dir / f"{self.game_id}.tiff"
|
||||||
if cover_path.is_file():
|
if cover_path.is_file():
|
||||||
return cover_path
|
return cover_path # type: ignore
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def toggle_play(self, _widget, _prop1, _prop2, state=True):
|
def toggle_play(
|
||||||
|
self, _widget: Any, _prop1: Any, _prop2: Any, state: bool = True
|
||||||
|
) -> None:
|
||||||
if not self.menu_button.get_active():
|
if not self.menu_button.get_active():
|
||||||
self.play_revealer.set_reveal_child(not state)
|
self.play_revealer.set_reveal_child(not state)
|
||||||
self.menu_revealer.set_reveal_child(not state)
|
self.menu_revealer.set_reveal_child(not state)
|
||||||
|
|
||||||
def main_button_clicked(self, _widget, button):
|
def main_button_clicked(self, _widget: Any, button: bool) -> None:
|
||||||
if shared.schema.get_boolean("cover-launches-game") ^ button:
|
if shared.schema.get_boolean("cover-launches-game") ^ button:
|
||||||
self.launch()
|
self.launch()
|
||||||
else:
|
else:
|
||||||
self.win.show_details_view(self)
|
shared.win.show_details_page(self)
|
||||||
|
|
||||||
def set_play_icon(self):
|
def set_play_icon(self) -> None:
|
||||||
self.play_button.set_icon_name(
|
self.play_button.set_icon_name(
|
||||||
"help-about-symbolic"
|
"help-about-symbolic"
|
||||||
if shared.schema.get_boolean("cover-launches-game")
|
if shared.schema.get_boolean("cover-launches-game")
|
||||||
else "media-playback-start-symbolic"
|
else "media-playback-start-symbolic"
|
||||||
)
|
)
|
||||||
|
|
||||||
def schema_changed(self, _settings, key):
|
def schema_changed(self, _settings: Any, key: str) -> None:
|
||||||
if key == "cover-launches-game":
|
if key == "cover-launches-game":
|
||||||
self.set_play_icon()
|
self.set_play_icon()
|
||||||
|
|
||||||
@GObject.Signal(name="update-ready", arg_types=[object])
|
@GObject.Signal(name="update-ready", arg_types=[object])
|
||||||
def update_ready(self, _additional_data) -> None:
|
def update_ready(self, _additional_data): # type: ignore
|
||||||
"""Signal emitted when the game needs updating"""
|
"""Signal emitted when the game needs updating"""
|
||||||
|
|
||||||
@GObject.Signal(name="save-ready", arg_types=[object])
|
@GObject.Signal(name="save-ready", arg_types=[object])
|
||||||
def save_ready(self, _additional_data) -> None:
|
def save_ready(self, _additional_data): # type: ignore
|
||||||
"""Signal emitted when the game needs saving"""
|
"""Signal emitted when the game needs saving"""
|
||||||
@@ -17,19 +17,22 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from gi.repository import Gdk, GdkPixbuf, Gio, GLib
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from gi.repository import Gdk, GdkPixbuf, Gio, GLib, Gtk
|
||||||
from PIL import Image, ImageFilter, ImageStat
|
from PIL import Image, ImageFilter, ImageStat
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
|
||||||
|
|
||||||
class GameCover:
|
class GameCover:
|
||||||
texture = None
|
texture: Optional[Gdk.Texture]
|
||||||
blurred = None
|
blurred: Optional[Gdk.Texture]
|
||||||
luminance = None
|
luminance: Optional[tuple[float, float]]
|
||||||
path = None
|
path: Optional[Path]
|
||||||
animation = None
|
animation: Optional[GdkPixbuf.PixbufAnimation]
|
||||||
anim_iter = None
|
anim_iter: Optional[GdkPixbuf.PixbufAnimationIter]
|
||||||
|
|
||||||
placeholder = Gdk.Texture.new_from_resource(
|
placeholder = Gdk.Texture.new_from_resource(
|
||||||
shared.PREFIX + "/library_placeholder.svg"
|
shared.PREFIX + "/library_placeholder.svg"
|
||||||
@@ -38,21 +41,11 @@ class GameCover:
|
|||||||
shared.PREFIX + "/library_placeholder_small.svg"
|
shared.PREFIX + "/library_placeholder_small.svg"
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, pictures, path=None):
|
def __init__(self, pictures: set[Gtk.Picture], path: Optional[Path] = None) -> None:
|
||||||
self.pictures = pictures
|
self.pictures = pictures
|
||||||
self.new_cover(path)
|
self.new_cover(path)
|
||||||
|
|
||||||
# Wrap the function in another one as Gio.Task.run_in_thread does not allow for passing args
|
def new_cover(self, path: Optional[Path] = None) -> None:
|
||||||
def create_func(self, path):
|
|
||||||
self.animation = GdkPixbuf.PixbufAnimation.new_from_file(str(path))
|
|
||||||
self.anim_iter = self.animation.get_iter()
|
|
||||||
|
|
||||||
def wrapper(task, *_args):
|
|
||||||
self.update_animation((task, self.animation))
|
|
||||||
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
def new_cover(self, path=None):
|
|
||||||
self.animation = None
|
self.animation = None
|
||||||
self.texture = None
|
self.texture = None
|
||||||
self.blurred = None
|
self.blurred = None
|
||||||
@@ -61,22 +54,26 @@ class GameCover:
|
|||||||
|
|
||||||
if path:
|
if path:
|
||||||
if path.suffix == ".gif":
|
if path.suffix == ".gif":
|
||||||
|
self.animation = GdkPixbuf.PixbufAnimation.new_from_file(str(path))
|
||||||
|
self.anim_iter = self.animation.get_iter()
|
||||||
self.task = Gio.Task.new()
|
self.task = Gio.Task.new()
|
||||||
self.task.run_in_thread(self.create_func(self.path))
|
self.task.run_in_thread(
|
||||||
|
lambda *_: self.update_animation((self.task, self.animation))
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.texture = Gdk.Texture.new_from_filename(str(path))
|
self.texture = Gdk.Texture.new_from_filename(str(path))
|
||||||
|
|
||||||
if not self.animation:
|
if not self.animation:
|
||||||
self.set_texture(self.texture)
|
self.set_texture(self.texture)
|
||||||
|
|
||||||
def get_texture(self):
|
def get_texture(self) -> Gdk.Texture:
|
||||||
return (
|
return (
|
||||||
Gdk.Texture.new_for_pixbuf(self.animation.get_static_image())
|
Gdk.Texture.new_for_pixbuf(self.animation.get_static_image())
|
||||||
if self.animation
|
if self.animation
|
||||||
else self.texture
|
else self.texture
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_blurred(self):
|
def get_blurred(self) -> Gdk.Texture:
|
||||||
if not self.blurred:
|
if not self.blurred:
|
||||||
if self.path:
|
if self.path:
|
||||||
with Image.open(self.path) as image:
|
with Image.open(self.path) as image:
|
||||||
@@ -94,24 +91,24 @@ class GameCover:
|
|||||||
stat = ImageStat.Stat(image.convert("L"))
|
stat = ImageStat.Stat(image.convert("L"))
|
||||||
|
|
||||||
# Luminance values for light and dark mode
|
# Luminance values for light and dark mode
|
||||||
self.luminance = [
|
self.luminance = (
|
||||||
min((stat.mean[0] + stat.extrema[0][0]) / 510, 0.7),
|
min((stat.mean[0] + stat.extrema[0][0]) / 510, 0.7),
|
||||||
max((stat.mean[0] + stat.extrema[0][1]) / 510, 0.3),
|
max((stat.mean[0] + stat.extrema[0][1]) / 510, 0.3),
|
||||||
]
|
)
|
||||||
else:
|
else:
|
||||||
self.blurred = self.placeholder_small
|
self.blurred = self.placeholder_small
|
||||||
self.luminance = (0.3, 0.5)
|
self.luminance = (0.3, 0.5)
|
||||||
|
|
||||||
return self.blurred
|
return self.blurred
|
||||||
|
|
||||||
def add_picture(self, picture):
|
def add_picture(self, picture: Gtk.Picture) -> None:
|
||||||
self.pictures.add(picture)
|
self.pictures.add(picture)
|
||||||
if not self.animation:
|
if not self.animation:
|
||||||
self.set_texture(self.texture)
|
self.set_texture(self.texture)
|
||||||
else:
|
else:
|
||||||
self.update_animation((self.task, self.animation))
|
self.update_animation((self.task, self.animation))
|
||||||
|
|
||||||
def set_texture(self, texture):
|
def set_texture(self, texture: Gdk.Texture) -> None:
|
||||||
self.pictures.discard(
|
self.pictures.discard(
|
||||||
picture for picture in self.pictures if not picture.is_visible()
|
picture for picture in self.pictures if not picture.is_visible()
|
||||||
)
|
)
|
||||||
@@ -121,13 +118,13 @@ class GameCover:
|
|||||||
for picture in self.pictures:
|
for picture in self.pictures:
|
||||||
picture.set_paintable(texture or self.placeholder)
|
picture.set_paintable(texture or self.placeholder)
|
||||||
|
|
||||||
def update_animation(self, data):
|
def update_animation(self, data: GdkPixbuf.PixbufAnimation) -> None:
|
||||||
if self.animation == data[1]:
|
if self.animation == data[1]:
|
||||||
self.anim_iter.advance()
|
self.anim_iter.advance() # type: ignore
|
||||||
|
|
||||||
self.set_texture(Gdk.Texture.new_for_pixbuf(self.anim_iter.get_pixbuf()))
|
self.set_texture(Gdk.Texture.new_for_pixbuf(self.anim_iter.get_pixbuf())) # type: ignore
|
||||||
|
|
||||||
delay_time = self.anim_iter.get_delay_time()
|
delay_time = self.anim_iter.get_delay_time() # type: ignore
|
||||||
GLib.timeout_add(
|
GLib.timeout_add(
|
||||||
20 if delay_time < 20 else delay_time,
|
20 if delay_time < 20 else delay_time,
|
||||||
self.update_animation,
|
self.update_animation,
|
||||||
@@ -19,39 +19,35 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import time
|
from typing import NamedTuple
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
from src.importer.sources.source import (
|
from cartridges.importer.source import SourceIterable, URLExecutableSource
|
||||||
SourceIterationResult,
|
|
||||||
SourceIterator,
|
|
||||||
URLExecutableSource,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class BottlesSourceIterator(SourceIterator):
|
class BottlesSourceIterable(SourceIterable):
|
||||||
source: "BottlesSource"
|
source: "BottlesSource"
|
||||||
|
|
||||||
def generator_builder(self) -> SourceIterationResult:
|
def __iter__(self):
|
||||||
"""Generator method producing games"""
|
"""Generator method producing games"""
|
||||||
|
|
||||||
data = self.source.data_location["library.yml"].read_text("utf-8")
|
data = self.source.locations.data["library.yml"].read_text("utf-8")
|
||||||
library: dict = yaml.safe_load(data)
|
library: dict = yaml.safe_load(data)
|
||||||
added_time = int(time())
|
|
||||||
|
|
||||||
for entry in library.values():
|
for entry in library.values():
|
||||||
# Build game
|
# Build game
|
||||||
values = {
|
values = {
|
||||||
"source": self.source.id,
|
"source": self.source.source_id,
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"name": entry["name"],
|
"name": entry["name"],
|
||||||
"game_id": self.source.game_id_format.format(game_id=entry["id"]),
|
"game_id": self.source.game_id_format.format(game_id=entry["id"]),
|
||||||
"executable": self.source.executable_format.format(
|
"executable": self.source.make_executable(
|
||||||
bottle_name=entry["bottle"]["name"], game_name=entry["name"]
|
bottle_name=entry["bottle"]["name"],
|
||||||
|
game_name=entry["name"],
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
game = Game(values)
|
game = Game(values)
|
||||||
@@ -62,11 +58,11 @@ class BottlesSourceIterator(SourceIterator):
|
|||||||
# as Cartridges can't access directories picked via Bottles' file picker portal
|
# as Cartridges can't access directories picked via Bottles' file picker portal
|
||||||
bottles_location = Path(
|
bottles_location = Path(
|
||||||
yaml.safe_load(
|
yaml.safe_load(
|
||||||
self.source.data_location["data.yml"].read_text("utf-8")
|
self.source.locations.data["data.yml"].read_text("utf-8")
|
||||||
)["custom_bottles_path"]
|
)["custom_bottles_path"]
|
||||||
)
|
)
|
||||||
except (FileNotFoundError, KeyError):
|
except (FileNotFoundError, KeyError):
|
||||||
bottles_location = self.source.data_location.root / "bottles"
|
bottles_location = self.source.locations.data.root / "bottles"
|
||||||
|
|
||||||
bottle_path = entry["bottle"]["path"]
|
bottle_path = entry["bottle"]["path"]
|
||||||
|
|
||||||
@@ -76,27 +72,38 @@ class BottlesSourceIterator(SourceIterator):
|
|||||||
image_path = bottles_location / bottle_path / "grids" / image_name
|
image_path = bottles_location / bottle_path / "grids" / image_name
|
||||||
additional_data = {"local_image_path": image_path}
|
additional_data = {"local_image_path": image_path}
|
||||||
|
|
||||||
# Produce game
|
|
||||||
yield (game, additional_data)
|
yield (game, additional_data)
|
||||||
|
|
||||||
|
|
||||||
|
class BottlesLocations(NamedTuple):
|
||||||
|
data: Location
|
||||||
|
|
||||||
|
|
||||||
class BottlesSource(URLExecutableSource):
|
class BottlesSource(URLExecutableSource):
|
||||||
"""Generic Bottles source"""
|
"""Generic Bottles source"""
|
||||||
|
|
||||||
name = "Bottles"
|
source_id = "bottles"
|
||||||
iterator_class = BottlesSourceIterator
|
name = _("Bottles")
|
||||||
|
iterable_class = BottlesSourceIterable
|
||||||
url_format = 'bottles:run/"{bottle_name}"/"{game_name}"'
|
url_format = 'bottles:run/"{bottle_name}"/"{game_name}"'
|
||||||
available_on = {"linux"}
|
available_on = {"linux"}
|
||||||
|
|
||||||
data_location = Location(
|
locations: BottlesLocations
|
||||||
schema_key="bottles-location",
|
|
||||||
candidates=(
|
def __init__(self) -> None:
|
||||||
shared.flatpak_dir / "com.usebottles.bottles" / "data" / "bottles",
|
super().__init__()
|
||||||
shared.data_dir / "bottles/",
|
self.locations = BottlesLocations(
|
||||||
shared.home / ".local" / "share" / "bottles",
|
Location(
|
||||||
),
|
schema_key="bottles-location",
|
||||||
paths={
|
candidates=(
|
||||||
"library.yml": (False, "library.yml"),
|
shared.flatpak_dir / "com.usebottles.bottles" / "data" / "bottles",
|
||||||
"data.yml": (False, "data.yml"),
|
shared.data_dir / "bottles/",
|
||||||
},
|
shared.host_data_dir / "bottles",
|
||||||
)
|
),
|
||||||
|
paths={
|
||||||
|
"library.yml": LocationSubPath("library.yml"),
|
||||||
|
"data.yml": LocationSubPath("data.yml"),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
223
cartridges/importer/desktop_source.py
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
# desktop_source.py
|
||||||
|
#
|
||||||
|
# Copyright 2023 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
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shlex
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import NamedTuple
|
||||||
|
|
||||||
|
from gi.repository import GLib, Gtk
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.importer.source import Source, SourceIterable
|
||||||
|
|
||||||
|
|
||||||
|
class DesktopSourceIterable(SourceIterable):
|
||||||
|
source: "DesktopSource"
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
"""Generator method producing games"""
|
||||||
|
|
||||||
|
icon_theme = Gtk.IconTheme.new()
|
||||||
|
|
||||||
|
search_paths = [
|
||||||
|
shared.host_data_dir,
|
||||||
|
"/run/host/usr/local/share",
|
||||||
|
"/run/host/usr/share",
|
||||||
|
"/run/host/usr/share/pixmaps",
|
||||||
|
"/usr/share/pixmaps",
|
||||||
|
] + GLib.get_system_data_dirs()
|
||||||
|
|
||||||
|
for search_path in search_paths:
|
||||||
|
path = Path(search_path)
|
||||||
|
|
||||||
|
if not str(search_path).endswith("/pixmaps"):
|
||||||
|
path = path / "icons"
|
||||||
|
|
||||||
|
if not path.is_dir():
|
||||||
|
continue
|
||||||
|
|
||||||
|
if str(path).startswith("/app/"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
icon_theme.add_search_path(str(path))
|
||||||
|
|
||||||
|
launch_command, full_path = self.check_launch_commands()
|
||||||
|
|
||||||
|
for path in search_paths:
|
||||||
|
if str(path).startswith("/app/"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
path = Path(path) / "applications"
|
||||||
|
|
||||||
|
if not path.is_dir():
|
||||||
|
continue
|
||||||
|
|
||||||
|
for entry in path.iterdir():
|
||||||
|
if entry.suffix != ".desktop":
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip Lutris games
|
||||||
|
if str(entry.name).startswith("net.lutris."):
|
||||||
|
continue
|
||||||
|
|
||||||
|
keyfile = GLib.KeyFile.new()
|
||||||
|
|
||||||
|
try:
|
||||||
|
keyfile.load_from_file(str(entry), 0)
|
||||||
|
|
||||||
|
if "Game" not in keyfile.get_string_list(
|
||||||
|
"Desktop Entry", "Categories"
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
name = keyfile.get_string("Desktop Entry", "Name")
|
||||||
|
executable = keyfile.get_string("Desktop Entry", "Exec").split(
|
||||||
|
" %"
|
||||||
|
)[0]
|
||||||
|
except GLib.Error:
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
try_exec = "which " + keyfile.get_string("Desktop Entry", "TryExec")
|
||||||
|
if not self.check_command(try_exec):
|
||||||
|
continue
|
||||||
|
|
||||||
|
except GLib.Error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Skip Steam games
|
||||||
|
if "steam://rungameid/" in executable:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip Heroic games
|
||||||
|
if "heroic://launch/" in executable:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip Bottles games
|
||||||
|
if "bottles-cli " in executable:
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
if keyfile.get_boolean("Desktop Entry", "NoDisplay"):
|
||||||
|
continue
|
||||||
|
except GLib.Error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
if keyfile.get_boolean("Desktop Entry", "Hidden"):
|
||||||
|
continue
|
||||||
|
except GLib.Error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Strip /run/host from Flatpak paths
|
||||||
|
if entry.is_relative_to(prefix := "/run/host"):
|
||||||
|
entry = Path("/") / entry.relative_to(prefix)
|
||||||
|
|
||||||
|
launch_arg = shlex.quote(str(entry if full_path else entry.stem))
|
||||||
|
|
||||||
|
values = {
|
||||||
|
"source": self.source.source_id,
|
||||||
|
"added": shared.import_time,
|
||||||
|
"name": name,
|
||||||
|
"game_id": f"desktop_{entry.stem}",
|
||||||
|
"executable": f"{launch_command} {launch_arg}",
|
||||||
|
}
|
||||||
|
game = Game(values)
|
||||||
|
|
||||||
|
additional_data = {}
|
||||||
|
|
||||||
|
try:
|
||||||
|
icon_str = keyfile.get_string("Desktop Entry", "Icon")
|
||||||
|
except GLib.Error:
|
||||||
|
yield game
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if "/" in icon_str:
|
||||||
|
additional_data = {"local_icon_path": Path(icon_str)}
|
||||||
|
yield (game, additional_data)
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
if (
|
||||||
|
icon_path := icon_theme.lookup_icon(
|
||||||
|
icon_str,
|
||||||
|
None,
|
||||||
|
512,
|
||||||
|
1,
|
||||||
|
shared.win.get_direction(),
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
.get_file()
|
||||||
|
.get_path()
|
||||||
|
):
|
||||||
|
additional_data = {"local_icon_path": Path(icon_path)}
|
||||||
|
except GLib.Error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
yield (game, additional_data)
|
||||||
|
|
||||||
|
def check_command(self, command) -> bool:
|
||||||
|
flatpak_str = "flatpak-spawn --host /bin/sh -c "
|
||||||
|
|
||||||
|
if os.getenv("FLATPAK_ID") == shared.APP_ID:
|
||||||
|
command = flatpak_str + shlex.quote(command)
|
||||||
|
|
||||||
|
try:
|
||||||
|
subprocess.run(command, shell=True, check=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_launch_commands(self) -> (str, bool):
|
||||||
|
"""Check whether `gio launch` `gtk4-launch` or `gtk-launch` are available on the system"""
|
||||||
|
commands = (("gio launch", True), ("gtk4-launch", False), ("gtk-launch", False))
|
||||||
|
|
||||||
|
for command, full_path in commands:
|
||||||
|
# Even if `gio` is available, `gio launch` is only available on GLib >= 2.67.2
|
||||||
|
command_to_check = (
|
||||||
|
"gio help launch" if command == "gio launch" else f"which {command}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.check_command(command_to_check):
|
||||||
|
return command, full_path
|
||||||
|
|
||||||
|
return commands[2]
|
||||||
|
|
||||||
|
|
||||||
|
class DesktopLocations(NamedTuple):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DesktopSource(Source):
|
||||||
|
"""Generic Flatpak source"""
|
||||||
|
|
||||||
|
source_id = "desktop"
|
||||||
|
name = _("Desktop Entries")
|
||||||
|
iterable_class = DesktopSourceIterable
|
||||||
|
available_on = {"linux"}
|
||||||
|
|
||||||
|
locations: DesktopLocations
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.locations = DesktopLocations()
|
||||||
@@ -17,27 +17,33 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
from itertools import chain
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import time
|
from typing import NamedTuple
|
||||||
|
|
||||||
from gi.repository import GLib, Gtk
|
from gi.repository import GLib, Gtk
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
from src.importer.sources.source import Source, SourceIterationResult, SourceIterator
|
from cartridges.importer.source import ExecutableFormatSource, SourceIterable
|
||||||
|
|
||||||
|
|
||||||
class FlatpakSourceIterator(SourceIterator):
|
class FlatpakSourceIterable(SourceIterable):
|
||||||
source: "FlatpakSource"
|
source: "FlatpakSource"
|
||||||
|
|
||||||
def generator_builder(self) -> SourceIterationResult:
|
def __iter__(self):
|
||||||
"""Generator method producing games"""
|
"""Generator method producing games"""
|
||||||
|
|
||||||
added_time = int(time())
|
|
||||||
|
|
||||||
icon_theme = Gtk.IconTheme.new()
|
icon_theme = Gtk.IconTheme.new()
|
||||||
icon_theme.add_search_path(str(self.source.data_location["icons"]))
|
if user_data := self.source.locations.user_data["icons"]:
|
||||||
|
icon_theme.add_search_path(str(user_data))
|
||||||
|
|
||||||
|
if system_data := self.source.locations.system_data["icons"]:
|
||||||
|
icon_theme.add_search_path(str(system_data))
|
||||||
|
|
||||||
|
if not (system_data or user_data):
|
||||||
|
return
|
||||||
|
|
||||||
blacklist = (
|
blacklist = (
|
||||||
{"hu.kramo.Cartridges", "hu.kramo.Cartridges.Devel"}
|
{"hu.kramo.Cartridges", "hu.kramo.Cartridges.Devel"}
|
||||||
@@ -50,10 +56,20 @@ class FlatpakSourceIterator(SourceIterator):
|
|||||||
"com.heroicgameslauncher.hgl",
|
"com.heroicgameslauncher.hgl",
|
||||||
"com.usebottles.Bottles",
|
"com.usebottles.Bottles",
|
||||||
"io.itch.itch",
|
"io.itch.itch",
|
||||||
|
"org.libretro.RetroArch",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
for entry in (self.source.data_location["applications"]).iterdir():
|
generators = set(
|
||||||
|
location.iterdir()
|
||||||
|
for location in (
|
||||||
|
self.source.locations.user_data["applications"],
|
||||||
|
self.source.locations.system_data["applications"],
|
||||||
|
)
|
||||||
|
if location
|
||||||
|
)
|
||||||
|
|
||||||
|
for entry in chain(*generators):
|
||||||
if entry.suffix != ".desktop":
|
if entry.suffix != ".desktop":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -72,17 +88,15 @@ class FlatpakSourceIterator(SourceIterator):
|
|||||||
|
|
||||||
name = keyfile.get_string("Desktop Entry", "Name")
|
name = keyfile.get_string("Desktop Entry", "Name")
|
||||||
|
|
||||||
except GLib.GError:
|
except GLib.Error:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
values = {
|
values = {
|
||||||
"source": self.source.id,
|
"source": self.source.source_id,
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"name": name,
|
"name": name,
|
||||||
"game_id": self.source.game_id_format.format(game_id=flatpak_id),
|
"game_id": self.source.game_id_format.format(game_id=flatpak_id),
|
||||||
"executable": self.source.executable_format.format(
|
"executable": self.source.make_executable(flatpak_id=flatpak_id),
|
||||||
flatpak_id=flatpak_id
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
game = Game(values)
|
game = Game(values)
|
||||||
|
|
||||||
@@ -104,29 +118,49 @@ class FlatpakSourceIterator(SourceIterator):
|
|||||||
additional_data = {"local_icon_path": Path(icon_path)}
|
additional_data = {"local_icon_path": Path(icon_path)}
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
except GLib.GError:
|
except GLib.Error:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Produce game
|
|
||||||
yield (game, additional_data)
|
yield (game, additional_data)
|
||||||
|
|
||||||
|
|
||||||
class FlatpakSource(Source):
|
class FlatpakLocations(NamedTuple):
|
||||||
|
system_data: Location
|
||||||
|
user_data: Location
|
||||||
|
|
||||||
|
|
||||||
|
class FlatpakSource(ExecutableFormatSource):
|
||||||
"""Generic Flatpak source"""
|
"""Generic Flatpak source"""
|
||||||
|
|
||||||
name = "Flatpak"
|
source_id = "flatpak"
|
||||||
iterator_class = FlatpakSourceIterator
|
name = _("Flatpak")
|
||||||
|
iterable_class = FlatpakSourceIterable
|
||||||
executable_format = "flatpak run {flatpak_id}"
|
executable_format = "flatpak run {flatpak_id}"
|
||||||
available_on = {"linux"}
|
available_on = {"linux"}
|
||||||
|
|
||||||
data_location = Location(
|
locations: FlatpakLocations
|
||||||
schema_key="flatpak-location",
|
|
||||||
candidates=(
|
def __init__(self) -> None:
|
||||||
"/var/lib/flatpak/",
|
super().__init__()
|
||||||
shared.data_dir / "flatpak",
|
self.locations = FlatpakLocations(
|
||||||
),
|
Location(
|
||||||
paths={
|
schema_key="flatpak-system-location",
|
||||||
"applications": (True, "exports/share/applications"),
|
candidates=("/var/lib/flatpak/",),
|
||||||
"icons": (True, "exports/share/icons"),
|
paths={
|
||||||
},
|
"applications": LocationSubPath("exports/share/applications", True),
|
||||||
)
|
"icons": LocationSubPath("exports/share/icons", True),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||||
|
optional=True,
|
||||||
|
),
|
||||||
|
Location(
|
||||||
|
schema_key="flatpak-user-location",
|
||||||
|
candidates=(shared.data_dir / "flatpak",),
|
||||||
|
paths={
|
||||||
|
"applications": LocationSubPath("exports/share/applications", True),
|
||||||
|
"icons": LocationSubPath("exports/share/icons", True),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||||
|
optional=True,
|
||||||
|
),
|
||||||
|
)
|
||||||
387
cartridges/importer/heroic_source.py
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
# heroic_source.py
|
||||||
|
#
|
||||||
|
# Copyright 2022-2023 kramo
|
||||||
|
# Copyright 2023 Geoffrey Coulaud
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from abc import abstractmethod
|
||||||
|
from functools import cached_property
|
||||||
|
from hashlib import sha256
|
||||||
|
from json import JSONDecodeError
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Iterable, NamedTuple, Optional, TypedDict
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
|
from cartridges.importer.source import (
|
||||||
|
SourceIterable,
|
||||||
|
SourceIterationResult,
|
||||||
|
URLExecutableSource,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def path_json_load(path: Path):
|
||||||
|
"""
|
||||||
|
Load JSON from the file at the given path
|
||||||
|
|
||||||
|
:raises OSError: if the file can't be opened
|
||||||
|
:raises JSONDecodeError: if the file isn't valid JSON
|
||||||
|
"""
|
||||||
|
with path.open("r", encoding="utf-8") as open_file:
|
||||||
|
return json.load(open_file)
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidLibraryFileError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidInstalledFileError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidStoreFileError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class HeroicLibraryEntry(TypedDict):
|
||||||
|
app_name: str
|
||||||
|
installed: Optional[bool]
|
||||||
|
runner: str
|
||||||
|
title: str
|
||||||
|
developer: str
|
||||||
|
art_square: str
|
||||||
|
|
||||||
|
|
||||||
|
class SubSourceIterable(Iterable):
|
||||||
|
"""Class representing a Heroic sub-source"""
|
||||||
|
|
||||||
|
source: "HeroicSource"
|
||||||
|
source_iterable: "HeroicSourceIterable"
|
||||||
|
name: str
|
||||||
|
service: str
|
||||||
|
image_uri_params: str = ""
|
||||||
|
relative_library_path: Path
|
||||||
|
library_json_entries_key: str = "library"
|
||||||
|
|
||||||
|
def __init__(self, source, source_iterable) -> None:
|
||||||
|
self.source = source
|
||||||
|
self.source_iterable = source_iterable
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def library_path(self) -> Path:
|
||||||
|
path = self.source.locations.config.root / self.relative_library_path
|
||||||
|
logging.debug("Using Heroic %s library.json path %s", self.name, path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
def process_library_entry(self, entry: HeroicLibraryEntry) -> SourceIterationResult:
|
||||||
|
"""Build a Game from a Heroic library entry"""
|
||||||
|
|
||||||
|
app_name = entry["app_name"]
|
||||||
|
runner = entry["runner"]
|
||||||
|
|
||||||
|
# Build game
|
||||||
|
values = {
|
||||||
|
"source": f"{self.source.source_id}_{self.service}",
|
||||||
|
"added": shared.import_time,
|
||||||
|
"name": entry["title"],
|
||||||
|
"developer": entry.get("developer", None),
|
||||||
|
"game_id": self.source.game_id_format.format(
|
||||||
|
service=self.service, game_id=app_name
|
||||||
|
),
|
||||||
|
"executable": self.source.make_executable(runner=runner, app_name=app_name),
|
||||||
|
"hidden": self.source_iterable.is_hidden(app_name),
|
||||||
|
}
|
||||||
|
game = Game(values)
|
||||||
|
|
||||||
|
# Get the image path from the Heroic cache
|
||||||
|
# Filenames are derived from the URL that Heroic used to get the file
|
||||||
|
uri: str = entry["art_square"] + self.image_uri_params
|
||||||
|
digest = sha256(uri.encode()).hexdigest()
|
||||||
|
image_path = self.source.locations.config.root / "images-cache" / digest
|
||||||
|
additional_data = {"local_image_path": image_path}
|
||||||
|
|
||||||
|
return (game, additional_data)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
"""
|
||||||
|
Iterate through the games with a generator
|
||||||
|
:raises InvalidLibraryFileError: on initial call if the library file is bad
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
iterator = iter(
|
||||||
|
path_json_load(self.library_path)[self.library_json_entries_key]
|
||||||
|
)
|
||||||
|
except (OSError, JSONDecodeError, TypeError, KeyError) as error:
|
||||||
|
raise InvalidLibraryFileError(
|
||||||
|
f"Invalid {self.library_path.name}"
|
||||||
|
) from error
|
||||||
|
for entry in iterator:
|
||||||
|
try:
|
||||||
|
yield self.process_library_entry(entry)
|
||||||
|
except KeyError as error:
|
||||||
|
logging.warning(
|
||||||
|
"Skipped invalid %s game %s",
|
||||||
|
self.name,
|
||||||
|
entry.get("app_name", "UNKNOWN"),
|
||||||
|
exc_info=error,
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
class StoreSubSourceIterable(SubSourceIterable):
|
||||||
|
"""
|
||||||
|
Class representing a "store" sub source.
|
||||||
|
Games can be installed or not, this class does the check accordingly.
|
||||||
|
"""
|
||||||
|
|
||||||
|
relative_installed_path: Path
|
||||||
|
installed_app_names: set[str]
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def installed_path(self) -> Path:
|
||||||
|
path = self.source.locations.config.root / self.relative_installed_path
|
||||||
|
logging.debug("Using Heroic %s installed.json path %s", self.name, path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_installed_app_names(self) -> set[str]:
|
||||||
|
"""
|
||||||
|
Get the sub source's installed app names as a set.
|
||||||
|
|
||||||
|
:raises InvalidInstalledFileError: if the installed file data cannot be read
|
||||||
|
Whenever possible, `__cause__` is set with the original exception
|
||||||
|
"""
|
||||||
|
|
||||||
|
def is_installed(self, app_name: str) -> bool:
|
||||||
|
return app_name in self.installed_app_names
|
||||||
|
|
||||||
|
def process_library_entry(self, entry):
|
||||||
|
# Skip games that are not installed
|
||||||
|
app_name = entry["app_name"]
|
||||||
|
if not self.is_installed(app_name):
|
||||||
|
logging.warning(
|
||||||
|
"Skipped %s game %s (%s): not installed",
|
||||||
|
self.service,
|
||||||
|
entry["title"],
|
||||||
|
app_name,
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
# Process entry as normal
|
||||||
|
return super().process_library_entry(entry)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
"""
|
||||||
|
Iterate through the installed games with a generator
|
||||||
|
:raises InvalidLibraryFileError: on initial call if the library file is bad
|
||||||
|
:raises InvalidInstalledFileError: on initial call if the installed file is bad
|
||||||
|
"""
|
||||||
|
self.installed_app_names = self.get_installed_app_names()
|
||||||
|
yield from super().__iter__()
|
||||||
|
|
||||||
|
|
||||||
|
class SideloadIterable(SubSourceIterable):
|
||||||
|
name = "sideload"
|
||||||
|
service = "sideload"
|
||||||
|
relative_library_path = Path("sideload_apps") / "library.json"
|
||||||
|
library_json_entries_key = "games"
|
||||||
|
|
||||||
|
|
||||||
|
class LegendaryIterable(StoreSubSourceIterable):
|
||||||
|
name = "legendary"
|
||||||
|
service = "epic"
|
||||||
|
image_uri_params = "?h=400&resize=1&w=300"
|
||||||
|
relative_library_path = Path("store_cache") / "legendary_library.json"
|
||||||
|
|
||||||
|
# relative_installed_path = (
|
||||||
|
# Path("legendary") / "legendaryConfig" / "legendary" / "installed.json"
|
||||||
|
# )
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def installed_path(self) -> Path:
|
||||||
|
"""Get the right path depending on the Heroic version"""
|
||||||
|
# TODO after Heroic 2.9 has been out for a while
|
||||||
|
# We should use the commented out relative_installed_path
|
||||||
|
# and remove this property override.
|
||||||
|
|
||||||
|
heroic_config_path = self.source.locations.config.root
|
||||||
|
# Heroic >= 2.9
|
||||||
|
if (path := heroic_config_path / "legendaryConfig").is_dir():
|
||||||
|
logging.debug("Using Heroic >= 2.9 legendary file")
|
||||||
|
# Heroic <= 2.8
|
||||||
|
elif heroic_config_path.is_relative_to(shared.flatpak_dir):
|
||||||
|
# Heroic flatpak
|
||||||
|
path = shared.flatpak_dir / "com.heroicgameslauncher.hgl" / "config"
|
||||||
|
logging.debug("Using Heroic flatpak <= 2.8 legendary file")
|
||||||
|
else:
|
||||||
|
# Heroic native
|
||||||
|
logging.debug("Using Heroic native <= 2.8 legendary file")
|
||||||
|
path = shared.host_config_dir
|
||||||
|
|
||||||
|
path = path / "legendary" / "installed.json"
|
||||||
|
logging.debug("Using Heroic %s installed.json path %s", self.name, path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
def get_installed_app_names(self):
|
||||||
|
try:
|
||||||
|
return set(path_json_load(self.installed_path).keys())
|
||||||
|
except (OSError, JSONDecodeError, AttributeError) as error:
|
||||||
|
raise InvalidInstalledFileError(
|
||||||
|
f"Invalid {self.installed_path.name}"
|
||||||
|
) from error
|
||||||
|
|
||||||
|
|
||||||
|
class GogIterable(StoreSubSourceIterable):
|
||||||
|
name = "gog"
|
||||||
|
service = "gog"
|
||||||
|
library_json_entries_key = "games"
|
||||||
|
relative_library_path = Path("store_cache") / "gog_library.json"
|
||||||
|
relative_installed_path = Path("gog_store") / "installed.json"
|
||||||
|
|
||||||
|
def get_installed_app_names(self):
|
||||||
|
try:
|
||||||
|
return {
|
||||||
|
app_name
|
||||||
|
for entry in path_json_load(self.installed_path)["installed"]
|
||||||
|
if (app_name := entry.get("appName")) is not None
|
||||||
|
}
|
||||||
|
except (OSError, JSONDecodeError, KeyError, AttributeError) as error:
|
||||||
|
raise InvalidInstalledFileError(
|
||||||
|
f"Invalid {self.installed_path.name}"
|
||||||
|
) from error
|
||||||
|
|
||||||
|
|
||||||
|
class NileIterable(StoreSubSourceIterable):
|
||||||
|
name = "nile"
|
||||||
|
service = "amazon"
|
||||||
|
relative_library_path = Path("store_cache") / "nile_library.json"
|
||||||
|
relative_installed_path = Path("nile_config") / "nile" / "installed.json"
|
||||||
|
|
||||||
|
def get_installed_app_names(self):
|
||||||
|
try:
|
||||||
|
installed_json = path_json_load(self.installed_path)
|
||||||
|
return {
|
||||||
|
app_name
|
||||||
|
for entry in installed_json
|
||||||
|
if (app_name := entry.get("id")) is not None
|
||||||
|
}
|
||||||
|
except (OSError, JSONDecodeError, AttributeError) as error:
|
||||||
|
raise InvalidInstalledFileError(
|
||||||
|
f"Invalid {self.installed_path.name}"
|
||||||
|
) from error
|
||||||
|
|
||||||
|
|
||||||
|
class HeroicSourceIterable(SourceIterable):
|
||||||
|
source: "HeroicSource"
|
||||||
|
|
||||||
|
hidden_app_names: set[str] = set()
|
||||||
|
|
||||||
|
def is_hidden(self, app_name: str) -> bool:
|
||||||
|
return app_name in self.hidden_app_names
|
||||||
|
|
||||||
|
def get_hidden_app_names(self) -> set[str]:
|
||||||
|
"""Get the hidden app names from store/config.json
|
||||||
|
|
||||||
|
:raises InvalidStoreFileError: if the store is invalid for some reason
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
store = path_json_load(self.source.locations.config["store_config.json"])
|
||||||
|
self.hidden_app_names = {
|
||||||
|
app_name
|
||||||
|
for game in store["games"]["hidden"]
|
||||||
|
if (app_name := game.get("appName")) is not None
|
||||||
|
}
|
||||||
|
except KeyError:
|
||||||
|
logging.warning('No ["games"]["hidden"] key in Heroic store file')
|
||||||
|
except (OSError, JSONDecodeError, TypeError) as error:
|
||||||
|
logging.error("Invalid Heroic store file", exc_info=error)
|
||||||
|
raise InvalidStoreFileError() from error
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
"""Generator method producing games from all the Heroic sub-sources"""
|
||||||
|
|
||||||
|
self.get_hidden_app_names()
|
||||||
|
|
||||||
|
# Get games from the sub sources
|
||||||
|
for sub_source_class in (
|
||||||
|
SideloadIterable,
|
||||||
|
LegendaryIterable,
|
||||||
|
GogIterable,
|
||||||
|
NileIterable,
|
||||||
|
):
|
||||||
|
sub_source = sub_source_class(self.source, self)
|
||||||
|
|
||||||
|
if not shared.schema.get_boolean("heroic-import-" + sub_source.service):
|
||||||
|
logging.debug("Skipping Heroic %s: disabled", sub_source.service)
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
sub_source_iterable = iter(sub_source)
|
||||||
|
yield from sub_source_iterable
|
||||||
|
except (InvalidLibraryFileError, InvalidInstalledFileError) as error:
|
||||||
|
logging.error(
|
||||||
|
"Skipping bad Heroic sub-source %s",
|
||||||
|
sub_source.service,
|
||||||
|
exc_info=error,
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
class HeroicLocations(NamedTuple):
|
||||||
|
config: Location
|
||||||
|
|
||||||
|
|
||||||
|
class HeroicSource(URLExecutableSource):
|
||||||
|
"""Generic Heroic Games Launcher source"""
|
||||||
|
|
||||||
|
source_id = "heroic"
|
||||||
|
name = _("Heroic")
|
||||||
|
iterable_class = HeroicSourceIterable
|
||||||
|
url_format = "heroic://launch/{runner}/{app_name}"
|
||||||
|
available_on = {"linux", "win32"}
|
||||||
|
|
||||||
|
locations: HeroicLocations
|
||||||
|
|
||||||
|
@property
|
||||||
|
def game_id_format(self) -> str:
|
||||||
|
"""The string format used to construct game IDs"""
|
||||||
|
return self.source_id + "_{service}_{game_id}"
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.locations = HeroicLocations(
|
||||||
|
Location(
|
||||||
|
schema_key="heroic-location",
|
||||||
|
candidates=(
|
||||||
|
shared.config_dir / "heroic",
|
||||||
|
shared.host_config_dir / "heroic",
|
||||||
|
shared.flatpak_dir
|
||||||
|
/ "com.heroicgameslauncher.hgl"
|
||||||
|
/ "config"
|
||||||
|
/ "heroic",
|
||||||
|
shared.appdata_dir / "heroic",
|
||||||
|
),
|
||||||
|
paths={
|
||||||
|
"config.json": LocationSubPath("config.json"),
|
||||||
|
"store_config.json": LocationSubPath("store/config.json"),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -19,59 +19,75 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
from time import time
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
from gi.repository import Adw, GLib, Gtk
|
from gi.repository import Adw, Gio, GLib, Gtk
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.errors.error_producer import ErrorProducer
|
from cartridges.errors.error_producer import ErrorProducer
|
||||||
from src.errors.friendly_error import FriendlyError
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import UnresolvableLocationError
|
from cartridges.importer.location import UnresolvableLocationError
|
||||||
from src.importer.sources.source import Source
|
from cartridges.importer.source import Source
|
||||||
from src.store.managers.async_manager import AsyncManager
|
from cartridges.store.managers.async_manager import AsyncManager
|
||||||
from src.store.pipeline import Pipeline
|
from cartridges.store.pipeline import Pipeline
|
||||||
from src.utils.task import Task
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
# pylint: disable=too-many-instance-attributes
|
||||||
class Importer(ErrorProducer):
|
class Importer(ErrorProducer):
|
||||||
"""A class in charge of scanning sources for games"""
|
"""A class in charge of scanning sources for games"""
|
||||||
|
|
||||||
progressbar = None
|
progressbar: Gtk.ProgressBar
|
||||||
import_statuspage = None
|
import_statuspage: Adw.StatusPage
|
||||||
import_dialog = None
|
import_dialog: Adw.AlertDialog
|
||||||
summary_toast = None
|
summary_toast: Optional[Adw.Toast] = None
|
||||||
|
|
||||||
sources: set[Source] = None
|
sources: set[Source]
|
||||||
|
|
||||||
n_source_tasks_created: int = 0
|
n_source_tasks_created: int = 0
|
||||||
n_source_tasks_done: int = 0
|
n_source_tasks_done: int = 0
|
||||||
n_pipelines_done: int = 0
|
n_pipelines_done: int = 0
|
||||||
game_pipelines: set[Pipeline] = None
|
game_pipelines: set[Pipeline]
|
||||||
|
|
||||||
def __init__(self):
|
removed_game_ids: set[str]
|
||||||
|
imported_game_ids: set[str]
|
||||||
|
|
||||||
|
close_attempt_id: int
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
shared.import_time = int(time())
|
||||||
|
|
||||||
|
# TODO: make this stateful
|
||||||
|
shared.store.new_game_ids = set()
|
||||||
|
shared.store.duplicate_game_ids = set()
|
||||||
|
|
||||||
|
self.removed_game_ids = set()
|
||||||
|
self.imported_game_ids = set()
|
||||||
|
|
||||||
self.game_pipelines = set()
|
self.game_pipelines = set()
|
||||||
self.sources = set()
|
self.sources = set()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def n_games_added(self):
|
def n_games_added(self) -> int:
|
||||||
return sum(
|
return sum(
|
||||||
1 if not (pipeline.game.blacklisted or pipeline.game.removed) else 0
|
1 if not (pipeline.game.blacklisted or pipeline.game.removed) else 0
|
||||||
for pipeline in self.game_pipelines
|
for pipeline in self.game_pipelines
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pipelines_progress(self):
|
def pipelines_progress(self) -> float:
|
||||||
progress = sum(pipeline.progress for pipeline in self.game_pipelines)
|
progress = sum(pipeline.progress for pipeline in self.game_pipelines)
|
||||||
try:
|
try:
|
||||||
progress = progress / len(self.game_pipelines)
|
progress = progress / len(self.game_pipelines)
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
progress = 0
|
progress = 0
|
||||||
return progress
|
return progress # type: ignore
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sources_progress(self):
|
def sources_progress(self) -> float:
|
||||||
try:
|
try:
|
||||||
progress = self.n_source_tasks_done / self.n_source_tasks_created
|
progress = self.n_source_tasks_done / self.n_source_tasks_created
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
@@ -79,18 +95,26 @@ class Importer(ErrorProducer):
|
|||||||
return progress
|
return progress
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def finished(self):
|
def finished(self) -> bool:
|
||||||
return (
|
return (
|
||||||
self.n_source_tasks_created == self.n_source_tasks_done
|
self.n_source_tasks_created == self.n_source_tasks_done
|
||||||
and len(self.game_pipelines) == self.n_pipelines_done
|
and len(self.game_pipelines) == self.n_pipelines_done
|
||||||
)
|
)
|
||||||
|
|
||||||
def add_source(self, source):
|
def add_source(self, source: Source) -> None:
|
||||||
self.sources.add(source)
|
self.sources.add(source)
|
||||||
|
|
||||||
def run(self):
|
def run(self) -> None:
|
||||||
"""Use several Gio.Task to import games from added sources"""
|
"""Use several Gio.Task to import games from added sources"""
|
||||||
|
|
||||||
|
shared.win.get_application().state = shared.AppState.IMPORT
|
||||||
|
|
||||||
|
if self.__class__.summary_toast:
|
||||||
|
self.__class__.summary_toast.dismiss()
|
||||||
|
|
||||||
|
shared.win.get_application().lookup_action("import").set_enabled(False)
|
||||||
|
shared.win.get_application().lookup_action("add_game").set_enabled(False)
|
||||||
|
|
||||||
self.create_dialog()
|
self.create_dialog()
|
||||||
|
|
||||||
# Collect all errors and reset the cancellables for the managers
|
# Collect all errors and reset the cancellables for the managers
|
||||||
@@ -103,32 +127,37 @@ class Importer(ErrorProducer):
|
|||||||
manager.reset_cancellable()
|
manager.reset_cancellable()
|
||||||
|
|
||||||
for source in self.sources:
|
for source in self.sources:
|
||||||
logging.debug("Importing games from source %s", source.id)
|
logging.debug("Importing games from source %s", source.source_id)
|
||||||
task = Task.new(None, None, self.source_callback, (source,))
|
task = Gio.Task.new(None, None, self.source_callback, (source,))
|
||||||
self.n_source_tasks_created += 1
|
self.n_source_tasks_created += 1
|
||||||
task.set_task_data((source,))
|
task.run_in_thread(
|
||||||
task.run_in_thread(self.source_task_thread_func)
|
lambda _task, _obj, _data, _cancellable, src=source: self.source_task_thread_func(
|
||||||
|
(src,)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
self.progress_changed_callback()
|
self.progress_changed_callback()
|
||||||
|
|
||||||
def create_dialog(self):
|
def create_dialog(self) -> None:
|
||||||
"""Create the import dialog"""
|
"""Create the import dialog"""
|
||||||
self.progressbar = Gtk.ProgressBar(margin_start=12, margin_end=12)
|
self.progressbar = Gtk.ProgressBar(margin_start=12, margin_end=12)
|
||||||
self.import_statuspage = Adw.StatusPage(
|
self.import_statuspage = Adw.StatusPage(
|
||||||
title=_("Importing Games…"),
|
title=_("Importing Games…"),
|
||||||
child=self.progressbar,
|
child=self.progressbar,
|
||||||
)
|
)
|
||||||
self.import_dialog = Adw.Window(
|
self.import_dialog = Adw.Dialog(
|
||||||
content=self.import_statuspage,
|
child=self.import_statuspage,
|
||||||
modal=True,
|
content_width=350,
|
||||||
default_width=350,
|
can_close=False,
|
||||||
default_height=-1,
|
|
||||||
transient_for=shared.win,
|
|
||||||
deletable=False,
|
|
||||||
)
|
)
|
||||||
self.import_dialog.present()
|
|
||||||
|
|
||||||
def source_task_thread_func(self, _task, _obj, data, _cancellable):
|
self.close_attempt_id = self.import_dialog.connect(
|
||||||
|
"close-attempt", lambda *_: shared.win.close()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.import_dialog.present(shared.win)
|
||||||
|
|
||||||
|
def source_task_thread_func(self, data: tuple) -> None:
|
||||||
"""Source import task code"""
|
"""Source import task code"""
|
||||||
|
|
||||||
source: Source
|
source: Source
|
||||||
@@ -136,16 +165,16 @@ class Importer(ErrorProducer):
|
|||||||
|
|
||||||
# Early exit if not available or not installed
|
# Early exit if not available or not installed
|
||||||
if not source.is_available:
|
if not source.is_available:
|
||||||
logging.info("Source %s skipped, not available", source.id)
|
logging.info("Source %s skipped, not available", source.source_id)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
iterator = iter(source)
|
iterator = iter(source)
|
||||||
except UnresolvableLocationError:
|
except UnresolvableLocationError:
|
||||||
logging.info("Source %s skipped, bad location", source.id)
|
logging.info("Source %s skipped, bad location", source.source_id)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get games from source
|
# Get games from source
|
||||||
logging.info("Scanning source %s", source.id)
|
logging.info("Scanning source %s", source.source_id)
|
||||||
while True:
|
while True:
|
||||||
# Handle exceptions raised when iterating
|
# Handle exceptions raised when iterating
|
||||||
try:
|
try:
|
||||||
@@ -153,7 +182,7 @@ class Importer(ErrorProducer):
|
|||||||
except StopIteration:
|
except StopIteration:
|
||||||
break
|
break
|
||||||
except Exception as error: # pylint: disable=broad-exception-caught
|
except Exception as error: # pylint: disable=broad-exception-caught
|
||||||
logging.exception("%s in %s", type(error).__name__, source.id)
|
logging.exception("%s in %s", type(error).__name__, source.source_id)
|
||||||
self.report_error(error)
|
self.report_error(error)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -170,7 +199,7 @@ class Importer(ErrorProducer):
|
|||||||
# Should not happen on production code
|
# Should not happen on production code
|
||||||
logging.warning(
|
logging.warning(
|
||||||
"%s produced an invalid iteration return type %s",
|
"%s produced an invalid iteration return type %s",
|
||||||
source.id,
|
source.source_id,
|
||||||
type(iteration_result),
|
type(iteration_result),
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
@@ -179,30 +208,34 @@ class Importer(ErrorProducer):
|
|||||||
pipeline: Pipeline = shared.store.add_game(game, additional_data)
|
pipeline: Pipeline = shared.store.add_game(game, additional_data)
|
||||||
if pipeline is not None:
|
if pipeline is not None:
|
||||||
logging.info("Imported %s (%s)", game.name, game.game_id)
|
logging.info("Imported %s (%s)", game.name, game.game_id)
|
||||||
pipeline.connect("advanced", self.pipeline_advanced_callback)
|
pipeline.connect(
|
||||||
|
"advanced",
|
||||||
|
# I'm not sure idle_add is needed here, but a widget is updated in the callback
|
||||||
|
lambda *args: GLib.idle_add(self.pipeline_advanced_callback, *args),
|
||||||
|
)
|
||||||
self.game_pipelines.add(pipeline)
|
self.game_pipelines.add(pipeline)
|
||||||
|
|
||||||
def update_progressbar(self):
|
def update_progressbar(self) -> None:
|
||||||
"""Update the progressbar to show the overall import progress"""
|
"""Update the progressbar to show the overall import progress"""
|
||||||
# Reserve 10% for the sources discovery, the rest is the pipelines
|
# Reserve 10% for the sources discovery, the rest is the pipelines
|
||||||
self.progressbar.set_fraction(
|
self.progressbar.set_fraction(
|
||||||
(0.1 * self.sources_progress) + (0.9 * self.pipelines_progress)
|
(0.1 * self.sources_progress) + (0.9 * self.pipelines_progress)
|
||||||
)
|
)
|
||||||
|
|
||||||
def source_callback(self, _obj, _result, data):
|
def source_callback(self, _obj: Any, _result: Any, data: tuple) -> None:
|
||||||
"""Callback executed when a source is fully scanned"""
|
"""Callback executed when a source is fully scanned"""
|
||||||
source, *_rest = data
|
source, *_rest = data
|
||||||
logging.debug("Import done for source %s", source.id)
|
logging.debug("Import done for source %s", source.source_id)
|
||||||
self.n_source_tasks_done += 1
|
self.n_source_tasks_done += 1
|
||||||
self.progress_changed_callback()
|
self.progress_changed_callback()
|
||||||
|
|
||||||
def pipeline_advanced_callback(self, pipeline: Pipeline):
|
def pipeline_advanced_callback(self, pipeline: Pipeline) -> None:
|
||||||
"""Callback called when a pipeline for a game has advanced"""
|
"""Callback called when a pipeline for a game has advanced"""
|
||||||
if pipeline.is_done:
|
if pipeline.is_done:
|
||||||
self.n_pipelines_done += 1
|
self.n_pipelines_done += 1
|
||||||
self.progress_changed_callback()
|
self.progress_changed_callback()
|
||||||
|
|
||||||
def progress_changed_callback(self):
|
def progress_changed_callback(self) -> None:
|
||||||
"""
|
"""
|
||||||
Callback called when the import process has progressed
|
Callback called when the import process has progressed
|
||||||
|
|
||||||
@@ -215,18 +248,52 @@ class Importer(ErrorProducer):
|
|||||||
if self.finished:
|
if self.finished:
|
||||||
self.import_callback()
|
self.import_callback()
|
||||||
|
|
||||||
def import_callback(self):
|
def remove_games(self) -> None:
|
||||||
|
"""Set removed to True for missing games"""
|
||||||
|
if not shared.schema.get_boolean("remove-missing"):
|
||||||
|
return
|
||||||
|
|
||||||
|
for game in shared.store:
|
||||||
|
if game.removed:
|
||||||
|
continue
|
||||||
|
if game.source == "imported":
|
||||||
|
continue
|
||||||
|
if not shared.schema.get_boolean(game.base_source):
|
||||||
|
continue
|
||||||
|
if game.game_id in shared.store.duplicate_game_ids:
|
||||||
|
continue
|
||||||
|
if game.game_id in shared.store.new_game_ids:
|
||||||
|
continue
|
||||||
|
|
||||||
|
logging.debug("Removing missing game %s (%s)", game.name, game.game_id)
|
||||||
|
|
||||||
|
game.removed = True
|
||||||
|
game.save()
|
||||||
|
game.update()
|
||||||
|
self.removed_game_ids.add(game.game_id)
|
||||||
|
|
||||||
|
def import_callback(self) -> None:
|
||||||
"""Callback called when importing has finished"""
|
"""Callback called when importing has finished"""
|
||||||
logging.info("Import done")
|
logging.info("Import done")
|
||||||
self.import_dialog.close()
|
self.remove_games()
|
||||||
self.summary_toast = self.create_summary_toast()
|
self.imported_game_ids = shared.store.new_game_ids
|
||||||
|
shared.store.new_game_ids = set()
|
||||||
|
shared.store.duplicate_game_ids = set()
|
||||||
|
# Disconnect the close-attempt signal that closes the main window
|
||||||
|
self.import_dialog.disconnect(self.close_attempt_id)
|
||||||
|
self.import_dialog.force_close()
|
||||||
|
self.__class__.summary_toast = self.create_summary_toast()
|
||||||
self.create_error_dialog()
|
self.create_error_dialog()
|
||||||
|
shared.win.get_application().lookup_action("import").set_enabled(True)
|
||||||
|
shared.win.get_application().lookup_action("add_game").set_enabled(True)
|
||||||
|
shared.win.get_application().state = shared.AppState.DEFAULT
|
||||||
|
shared.win.create_source_rows()
|
||||||
|
|
||||||
def create_error_dialog(self):
|
def create_error_dialog(self) -> None:
|
||||||
"""Dialog containing all errors raised by importers"""
|
"""Dialog containing all errors raised by importers"""
|
||||||
|
|
||||||
# Collect all errors that happened in the importer and the managers
|
# Collect all errors that happened in the importer and the managers
|
||||||
errors: list[Exception] = []
|
errors = []
|
||||||
errors.extend(self.collect_errors())
|
errors.extend(self.collect_errors())
|
||||||
for manager in shared.store.managers.values():
|
for manager in shared.store.managers.values():
|
||||||
errors.extend(manager.collect_errors())
|
errors.extend(manager.collect_errors())
|
||||||
@@ -247,13 +314,12 @@ class Importer(ErrorProducer):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Create error dialog
|
# Create error dialog
|
||||||
dialog = Adw.MessageDialog()
|
dialog = Adw.AlertDialog()
|
||||||
dialog.set_heading(_("Warning"))
|
dialog.set_heading(_("Warning"))
|
||||||
dialog.add_response("close", _("Dismiss"))
|
dialog.add_response("close", _("Dismiss"))
|
||||||
dialog.add_response("open_preferences_import", _("Preferences"))
|
dialog.add_response("open_preferences_import", _("Preferences"))
|
||||||
dialog.set_default_response("open_preferences_import")
|
dialog.set_default_response("open_preferences_import")
|
||||||
dialog.connect("response", self.dialog_response_callback)
|
dialog.connect("response", self.dialog_response_callback)
|
||||||
dialog.set_transient_for(shared.win)
|
|
||||||
|
|
||||||
if len(errors) == 1:
|
if len(errors) == 1:
|
||||||
dialog.set_heading((error := next(iter(errors)))[0])
|
dialog.set_heading((error := next(iter(errors)))[0])
|
||||||
@@ -272,43 +338,82 @@ class Importer(ErrorProducer):
|
|||||||
dialog.set_body(_("The following errors occured during import:"))
|
dialog.set_body(_("The following errors occured during import:"))
|
||||||
dialog.set_extra_child(list_box)
|
dialog.set_extra_child(list_box)
|
||||||
|
|
||||||
dialog.present()
|
dialog.present(shared.win)
|
||||||
|
|
||||||
def create_summary_toast(self):
|
def undo_import(self, *_args: Any) -> None:
|
||||||
"""N games imported toast"""
|
for game_id in self.imported_game_ids:
|
||||||
|
shared.store[game_id].removed = True
|
||||||
|
shared.store[game_id].update()
|
||||||
|
shared.store[game_id].save()
|
||||||
|
|
||||||
|
for game_id in self.removed_game_ids:
|
||||||
|
shared.store[game_id].removed = False
|
||||||
|
shared.store[game_id].update()
|
||||||
|
shared.store[game_id].save()
|
||||||
|
|
||||||
|
self.imported_game_ids = set()
|
||||||
|
self.removed_game_ids = set()
|
||||||
|
if self.__class__.summary_toast:
|
||||||
|
self.__class__.summary_toast.dismiss()
|
||||||
|
|
||||||
|
logging.info("Import undone")
|
||||||
|
|
||||||
|
def create_summary_toast(self) -> Adw.Toast:
|
||||||
|
"""N games imported, removed toast"""
|
||||||
|
|
||||||
toast = Adw.Toast(timeout=0, priority=Adw.ToastPriority.HIGH)
|
toast = Adw.Toast(timeout=0, priority=Adw.ToastPriority.HIGH)
|
||||||
|
|
||||||
if self.n_games_added == 0:
|
if not self.n_games_added:
|
||||||
toast.set_title(_("No new games found"))
|
toast_title = _("No new games found")
|
||||||
toast.set_button_label(_("Preferences"))
|
|
||||||
toast.connect(
|
if not self.removed_game_ids:
|
||||||
"button-clicked",
|
toast.set_button_label(_("Preferences"))
|
||||||
self.dialog_response_callback,
|
toast.connect(
|
||||||
"open_preferences",
|
"button-clicked",
|
||||||
"import",
|
self.dialog_response_callback,
|
||||||
)
|
"open_preferences",
|
||||||
|
"import",
|
||||||
|
)
|
||||||
|
|
||||||
elif self.n_games_added == 1:
|
elif self.n_games_added == 1:
|
||||||
toast.set_title(_("1 game imported"))
|
toast_title = _("1 game imported")
|
||||||
|
|
||||||
elif self.n_games_added > 1:
|
elif self.n_games_added > 1:
|
||||||
# The variable is the number of games
|
# The variable is the number of games
|
||||||
toast.set_title(_("{} games imported").format(self.n_games_added))
|
toast_title = _("{} games imported").format(self.n_games_added)
|
||||||
|
|
||||||
|
if (removed_length := len(self.removed_game_ids)) == 1:
|
||||||
|
# A single game removed
|
||||||
|
toast_title += ", " + _("1 removed")
|
||||||
|
|
||||||
|
elif removed_length > 1:
|
||||||
|
# The variable is the number of games removed
|
||||||
|
toast_title += ", " + _("{} removed").format(removed_length)
|
||||||
|
|
||||||
|
if self.n_games_added or self.removed_game_ids:
|
||||||
|
toast.set_button_label(_("Undo"))
|
||||||
|
toast.connect("button-clicked", self.undo_import)
|
||||||
|
|
||||||
|
toast.set_title(toast_title)
|
||||||
|
|
||||||
shared.win.toast_overlay.add_toast(toast)
|
shared.win.toast_overlay.add_toast(toast)
|
||||||
return toast
|
return toast
|
||||||
|
|
||||||
def open_preferences(self, page=None, expander_row=None):
|
def open_preferences(
|
||||||
|
self,
|
||||||
|
page_name: Optional[str] = None,
|
||||||
|
expander_row: Optional[Adw.ExpanderRow] = None,
|
||||||
|
) -> Adw.PreferencesDialog:
|
||||||
return shared.win.get_application().on_preferences_action(
|
return shared.win.get_application().on_preferences_action(
|
||||||
page_name=page, expander_row=expander_row
|
page_name=page_name, expander_row=expander_row
|
||||||
)
|
)
|
||||||
|
|
||||||
def timeout_toast(self, *_args):
|
def timeout_toast(self, *_args: Any) -> None:
|
||||||
"""Manually timeout the toast after the user has dismissed all warnings"""
|
"""Manually timeout the toast after the user has dismissed all warnings"""
|
||||||
GLib.timeout_add_seconds(5, self.summary_toast.dismiss)
|
if self.__class__.summary_toast:
|
||||||
|
GLib.timeout_add_seconds(5, self.__class__.summary_toast.dismiss)
|
||||||
|
|
||||||
def dialog_response_callback(self, _widget, response, *args):
|
def dialog_response_callback(self, _widget: Any, response: str, *args: Any) -> None:
|
||||||
"""Handle after-import dialogs callback"""
|
"""Handle after-import dialogs callback"""
|
||||||
logging.debug("After-import dialog response: %s (%s)", response, str(args))
|
logging.debug("After-import dialog response: %s (%s)", response, str(args))
|
||||||
if response == "open_preferences":
|
if response == "open_preferences":
|
||||||
@@ -20,23 +20,19 @@
|
|||||||
|
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
from sqlite3 import connect
|
from sqlite3 import connect
|
||||||
from time import time
|
from typing import NamedTuple
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
from src.importer.sources.source import (
|
from cartridges.importer.source import SourceIterable, URLExecutableSource
|
||||||
SourceIterationResult,
|
from cartridges.utils.sqlite import copy_db
|
||||||
SourceIterator,
|
|
||||||
URLExecutableSource,
|
|
||||||
)
|
|
||||||
from src.utils.sqlite import copy_db
|
|
||||||
|
|
||||||
|
|
||||||
class ItchSourceIterator(SourceIterator):
|
class ItchSourceIterable(SourceIterable):
|
||||||
source: "ItchSource"
|
source: "ItchSource"
|
||||||
|
|
||||||
def generator_builder(self) -> SourceIterationResult:
|
def __iter__(self):
|
||||||
"""Generator method producing games"""
|
"""Generator method producing games"""
|
||||||
|
|
||||||
# Query the database
|
# Query the database
|
||||||
@@ -55,20 +51,18 @@ class ItchSourceIterator(SourceIterator):
|
|||||||
caves.game_id = games.id
|
caves.game_id = games.id
|
||||||
;
|
;
|
||||||
"""
|
"""
|
||||||
db_path = copy_db(self.source.config_location["butler.db"])
|
db_path = copy_db(self.source.locations.config["butler.db"])
|
||||||
connection = connect(db_path)
|
connection = connect(db_path)
|
||||||
cursor = connection.execute(db_request)
|
cursor = connection.execute(db_request)
|
||||||
|
|
||||||
added_time = int(time())
|
|
||||||
|
|
||||||
# Create games from the db results
|
# Create games from the db results
|
||||||
for row in cursor:
|
for row in cursor:
|
||||||
values = {
|
values = {
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"source": self.source.id,
|
"source": self.source.source_id,
|
||||||
"name": row[1],
|
"name": row[1],
|
||||||
"game_id": self.source.game_id_format.format(game_id=row[0]),
|
"game_id": self.source.game_id_format.format(game_id=row[0]),
|
||||||
"executable": self.source.executable_format.format(cave_id=row[4]),
|
"executable": self.source.make_executable(cave_id=row[4]),
|
||||||
}
|
}
|
||||||
additional_data = {"online_cover_url": row[3] or row[2]}
|
additional_data = {"online_cover_url": row[3] or row[2]}
|
||||||
game = Game(values)
|
game = Game(values)
|
||||||
@@ -78,19 +72,33 @@ class ItchSourceIterator(SourceIterator):
|
|||||||
rmtree(str(db_path.parent))
|
rmtree(str(db_path.parent))
|
||||||
|
|
||||||
|
|
||||||
|
class ItchLocations(NamedTuple):
|
||||||
|
config: Location
|
||||||
|
|
||||||
|
|
||||||
class ItchSource(URLExecutableSource):
|
class ItchSource(URLExecutableSource):
|
||||||
name = "Itch"
|
source_id = "itch"
|
||||||
iterator_class = ItchSourceIterator
|
name = _("itch")
|
||||||
|
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"}
|
||||||
|
|
||||||
config_location = Location(
|
locations: ItchLocations
|
||||||
schema_key="itch-location",
|
|
||||||
candidates=(
|
def __init__(self) -> None:
|
||||||
shared.flatpak_dir / "io.itch.itch" / "config" / "itch",
|
super().__init__()
|
||||||
shared.config_dir / "itch",
|
self.locations = ItchLocations(
|
||||||
shared.home / ".config" / "itch",
|
Location(
|
||||||
shared.appdata_dir / "itch",
|
schema_key="itch-location",
|
||||||
),
|
candidates=(
|
||||||
paths={"butler.db": (False, "db/butler.db")},
|
shared.flatpak_dir / "io.itch.itch" / "config" / "itch",
|
||||||
)
|
shared.config_dir / "itch",
|
||||||
|
shared.host_config_dir / "itch",
|
||||||
|
shared.appdata_dir / "itch",
|
||||||
|
),
|
||||||
|
paths={
|
||||||
|
"butler.db": LocationSubPath("db/butler.db"),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -20,21 +20,22 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from json import JSONDecodeError
|
from json import JSONDecodeError
|
||||||
from time import time
|
from typing import NamedTuple
|
||||||
from typing import Generator
|
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
from src.importer.sources.source import Source, SourceIterationResult, SourceIterator
|
from cartridges.importer.source import (
|
||||||
|
ExecutableFormatSource,
|
||||||
|
SourceIterable,
|
||||||
|
SourceIterationResult,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class LegendarySourceIterator(SourceIterator):
|
class LegendarySourceIterable(SourceIterable):
|
||||||
source: "LegendarySource"
|
source: "LegendarySource"
|
||||||
|
|
||||||
def game_from_library_entry(
|
def game_from_library_entry(self, entry: dict) -> SourceIterationResult:
|
||||||
self, entry: dict, added_time: int
|
|
||||||
) -> SourceIterationResult:
|
|
||||||
# Skip non-games
|
# Skip non-games
|
||||||
if entry["is_dlc"]:
|
if entry["is_dlc"]:
|
||||||
return None
|
return None
|
||||||
@@ -42,16 +43,16 @@ class LegendarySourceIterator(SourceIterator):
|
|||||||
# Build game
|
# Build game
|
||||||
app_name = entry["app_name"]
|
app_name = entry["app_name"]
|
||||||
values = {
|
values = {
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"source": self.source.id,
|
"source": self.source.source_id,
|
||||||
"name": entry["title"],
|
"name": entry["title"],
|
||||||
"game_id": self.source.game_id_format.format(game_id=app_name),
|
"game_id": self.source.game_id_format.format(game_id=app_name),
|
||||||
"executable": self.source.executable_format.format(app_name=app_name),
|
"executable": self.source.make_executable(app_name=app_name),
|
||||||
}
|
}
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
# Get additional metadata from file (optional)
|
# Get additional metadata from file (optional)
|
||||||
metadata_file = self.source.config_location["metadata"] / f"{app_name}.json"
|
metadata_file = self.source.locations.config["metadata"] / f"{app_name}.json"
|
||||||
try:
|
try:
|
||||||
metadata = json.load(metadata_file.open())
|
metadata = json.load(metadata_file.open())
|
||||||
values["developer"] = metadata["metadata"]["developer"]
|
values["developer"] = metadata["metadata"]["developer"]
|
||||||
@@ -65,21 +66,19 @@ class LegendarySourceIterator(SourceIterator):
|
|||||||
game = Game(values)
|
game = Game(values)
|
||||||
return (game, data)
|
return (game, data)
|
||||||
|
|
||||||
def generator_builder(self) -> Generator[SourceIterationResult, None, None]:
|
def __iter__(self):
|
||||||
# Open library
|
# Open library
|
||||||
file = self.source.config_location["installed.json"]
|
file = self.source.locations.config["installed.json"]
|
||||||
try:
|
try:
|
||||||
library: dict = json.load(file.open())
|
library: dict = json.load(file.open())
|
||||||
except (JSONDecodeError, OSError):
|
except (JSONDecodeError, OSError):
|
||||||
logging.warning("Couldn't open Legendary file: %s", str(file))
|
logging.warning("Couldn't open Legendary file: %s", str(file))
|
||||||
return
|
return
|
||||||
|
|
||||||
added_time = int(time())
|
|
||||||
|
|
||||||
# Generate games from library
|
# Generate games from library
|
||||||
for entry in library.values():
|
for entry in library.values():
|
||||||
try:
|
try:
|
||||||
result = self.game_from_library_entry(entry, added_time)
|
result = self.game_from_library_entry(entry)
|
||||||
except KeyError as error:
|
except KeyError as error:
|
||||||
# Skip invalid games
|
# Skip invalid games
|
||||||
logging.warning(
|
logging.warning(
|
||||||
@@ -89,20 +88,32 @@ class LegendarySourceIterator(SourceIterator):
|
|||||||
yield result
|
yield result
|
||||||
|
|
||||||
|
|
||||||
class LegendarySource(Source):
|
class LegendaryLocations(NamedTuple):
|
||||||
name = "Legendary"
|
config: Location
|
||||||
executable_format = "legendary launch {app_name}"
|
|
||||||
available_on = {"linux", "win32"}
|
|
||||||
|
|
||||||
iterator_class = LegendarySourceIterator
|
|
||||||
config_location: Location = Location(
|
class LegendarySource(ExecutableFormatSource):
|
||||||
schema_key="legendary-location",
|
source_id = "legendary"
|
||||||
candidates=(
|
name = _("Legendary")
|
||||||
shared.config_dir / "legendary",
|
executable_format = "legendary launch {app_name}"
|
||||||
shared.home / ".config" / "legendary",
|
available_on = {"linux"}
|
||||||
),
|
iterable_class = LegendarySourceIterable
|
||||||
paths={
|
|
||||||
"installed.json": (False, "installed.json"),
|
locations: LegendaryLocations
|
||||||
"metadata": (True, "metadata"),
|
|
||||||
},
|
def __init__(self) -> None:
|
||||||
)
|
super().__init__()
|
||||||
|
self.locations = LegendaryLocations(
|
||||||
|
Location(
|
||||||
|
schema_key="legendary-location",
|
||||||
|
candidates=(
|
||||||
|
shared.config_dir / "legendary",
|
||||||
|
shared.host_config_dir / "legendary",
|
||||||
|
),
|
||||||
|
paths={
|
||||||
|
"installed.json": LocationSubPath("installed.json"),
|
||||||
|
"metadata": LocationSubPath("metadata", True),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -1,17 +1,23 @@
|
|||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
|
||||||
from typing import Callable, Mapping, Iterable
|
|
||||||
from os import PathLike
|
from os import PathLike
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Iterable, Mapping, NamedTuple, Optional
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
|
||||||
PathSegment = str | PathLike | Path
|
PathSegment = str | PathLike | Path
|
||||||
PathSegments = Iterable[PathSegment]
|
PathSegments = Iterable[PathSegment]
|
||||||
Candidate = PathSegments | Callable[[], PathSegments]
|
Candidate = PathSegments
|
||||||
|
|
||||||
|
|
||||||
|
class LocationSubPath(NamedTuple):
|
||||||
|
segment: PathSegment
|
||||||
|
is_directory: bool = False
|
||||||
|
|
||||||
|
|
||||||
class UnresolvableLocationError(Exception):
|
class UnresolvableLocationError(Exception):
|
||||||
pass
|
def __init__(self, optional: Optional[bool] = False):
|
||||||
|
self.optional = optional
|
||||||
|
|
||||||
|
|
||||||
class Location:
|
class Location:
|
||||||
@@ -24,37 +30,50 @@ class Location:
|
|||||||
* When resolved, the schema is updated with the picked chosen
|
* When resolved, the schema is updated with the picked chosen
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# The variable is the name of the source
|
||||||
|
CACHE_INVALID_SUBTITLE = _("Select the {} cache directory.")
|
||||||
|
# The variable is the name of the source
|
||||||
|
CONFIG_INVALID_SUBTITLE = _("Select the {} configuration directory.")
|
||||||
|
# The variable is the name of the source
|
||||||
|
DATA_INVALID_SUBTITLE = _("Select the {} data directory.")
|
||||||
|
|
||||||
schema_key: str
|
schema_key: str
|
||||||
candidates: Iterable[Candidate]
|
candidates: Iterable[Candidate]
|
||||||
paths: Mapping[str, tuple[bool, PathSegments]]
|
paths: Mapping[str, LocationSubPath]
|
||||||
root: Path = None
|
invalid_subtitle: str
|
||||||
|
|
||||||
|
root: Optional[Path] = None
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
schema_key: str,
|
schema_key: str,
|
||||||
candidates: Iterable[Candidate],
|
candidates: Iterable[Candidate],
|
||||||
paths: Mapping[str, tuple[bool, PathSegments]],
|
paths: Mapping[str, LocationSubPath],
|
||||||
|
invalid_subtitle: str,
|
||||||
|
optional: Optional[bool] = False,
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.schema_key = schema_key
|
self.schema_key = schema_key
|
||||||
self.candidates = candidates
|
self.candidates = candidates
|
||||||
self.paths = paths
|
self.paths = paths
|
||||||
|
self.invalid_subtitle = invalid_subtitle
|
||||||
|
self.optional = optional
|
||||||
|
|
||||||
def check_candidate(self, candidate: Path) -> bool:
|
def check_candidate(self, candidate: Path) -> bool:
|
||||||
"""Check if a candidate root has the necessary files and directories"""
|
"""Check if a candidate root has the necessary files and directories"""
|
||||||
for type_is_dir, subpath in self.paths.values():
|
for segment, is_directory in self.paths.values():
|
||||||
subpath = Path(candidate) / Path(subpath)
|
path = Path(candidate) / segment
|
||||||
if type_is_dir:
|
if is_directory:
|
||||||
if not subpath.is_dir():
|
if not path.is_dir():
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if not subpath.is_file():
|
if not path.is_file():
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def resolve(self) -> None:
|
def resolve(self) -> None:
|
||||||
"""Choose a root path from the candidates for the location.
|
"""Choose a root path from the candidates for the location.
|
||||||
If none fits, raise a UnresolvableLocationError"""
|
If none fits, raise an UnresolvableLocationError"""
|
||||||
|
|
||||||
if self.root is not None:
|
if self.root is not None:
|
||||||
return
|
return
|
||||||
@@ -71,14 +90,22 @@ class Location:
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
# No good candidate found
|
# No good candidate found
|
||||||
raise UnresolvableLocationError()
|
raise UnresolvableLocationError(self.optional)
|
||||||
|
|
||||||
# Update the schema with the found candidate
|
# Update the schema with the found candidate
|
||||||
value = str(candidate)
|
value = str(candidate)
|
||||||
shared.schema.set_string(self.schema_key, value)
|
shared.schema.set_string(self.schema_key, value)
|
||||||
logging.debug("Resolved value for schema key %s: %s", self.schema_key, value)
|
logging.debug("Resolved value for schema key %s: %s", self.schema_key, value)
|
||||||
|
|
||||||
def __getitem__(self, key: str):
|
def __getitem__(self, key: str) -> Optional[Path]:
|
||||||
"""Get the computed path from its key for the location"""
|
"""Get the computed path from its key for the location"""
|
||||||
self.resolve()
|
try:
|
||||||
return self.root / self.paths[key][1]
|
self.resolve()
|
||||||
|
except UnresolvableLocationError as error:
|
||||||
|
if error.optional:
|
||||||
|
return None
|
||||||
|
raise UnresolvableLocationError from error
|
||||||
|
|
||||||
|
if self.root:
|
||||||
|
return self.root / self.paths[key].segment
|
||||||
|
return None
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# lutris_source.py
|
# lutris_source.py
|
||||||
#
|
#
|
||||||
# Copyright 2022-2023 kramo
|
# Copyright 2022-2024 kramo
|
||||||
# Copyright 2023 Geoffrey Coulaud
|
# Copyright 2023 Geoffrey Coulaud
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
@@ -19,23 +19,19 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
from sqlite3 import connect
|
from sqlite3 import connect
|
||||||
from time import time
|
from typing import NamedTuple
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
from src.importer.sources.source import (
|
from cartridges.importer.source import SourceIterable, URLExecutableSource
|
||||||
SourceIterationResult,
|
from cartridges.utils.sqlite import copy_db
|
||||||
SourceIterator,
|
|
||||||
URLExecutableSource,
|
|
||||||
)
|
|
||||||
from src.utils.sqlite import copy_db
|
|
||||||
|
|
||||||
|
|
||||||
class LutrisSourceIterator(SourceIterator):
|
class LutrisSourceIterable(SourceIterable):
|
||||||
source: "LutrisSource"
|
source: "LutrisSource"
|
||||||
|
|
||||||
def generator_builder(self) -> SourceIterationResult:
|
def __iter__(self):
|
||||||
"""Generator method producing games"""
|
"""Generator method producing games"""
|
||||||
|
|
||||||
# Query the database
|
# Query the database
|
||||||
@@ -55,72 +51,72 @@ class LutrisSourceIterator(SourceIterator):
|
|||||||
"import_steam": shared.schema.get_boolean("lutris-import-steam"),
|
"import_steam": shared.schema.get_boolean("lutris-import-steam"),
|
||||||
"import_flatpak": shared.schema.get_boolean("lutris-import-flatpak"),
|
"import_flatpak": shared.schema.get_boolean("lutris-import-flatpak"),
|
||||||
}
|
}
|
||||||
db_path = copy_db(self.source.data_location["pga.db"])
|
db_path = copy_db(self.source.locations.data["pga.db"])
|
||||||
connection = connect(db_path)
|
connection = connect(db_path)
|
||||||
cursor = connection.execute(request, params)
|
cursor = connection.execute(request, params)
|
||||||
|
coverart_is_dir = (
|
||||||
added_time = int(time())
|
coverart_path := self.source.locations.data.root / "coverart"
|
||||||
|
).is_dir()
|
||||||
|
|
||||||
# Create games from the DB results
|
# Create games from the DB results
|
||||||
for row in cursor:
|
for row in cursor:
|
||||||
# Create game
|
# Create game
|
||||||
values = {
|
values = {
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"hidden": row[4],
|
"hidden": row[4],
|
||||||
"name": row[1],
|
"name": row[1],
|
||||||
"source": f"{self.source.id}_{row[3]}",
|
"source": f"{self.source.source_id}_{row[3]}",
|
||||||
"game_id": self.source.game_id_format.format(
|
"game_id": self.source.game_id_format.format(
|
||||||
runner=row[3], game_id=row[0]
|
runner=row[3], game_id=row[0]
|
||||||
),
|
),
|
||||||
"executable": self.source.executable_format.format(game_id=row[0]),
|
"executable": self.source.make_executable(game_id=row[0]),
|
||||||
}
|
}
|
||||||
game = Game(values)
|
game = Game(values)
|
||||||
|
additional_data = {}
|
||||||
|
|
||||||
# Get official image path
|
# Get official image path
|
||||||
image_path = self.source.cache_location["coverart"] / f"{row[2]}.jpg"
|
if coverart_is_dir:
|
||||||
additional_data = {"local_image_path": image_path}
|
image_path = coverart_path / f"{row[2]}.jpg"
|
||||||
|
additional_data["local_image_path"] = image_path
|
||||||
|
|
||||||
# Produce game
|
|
||||||
yield (game, additional_data)
|
yield (game, additional_data)
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
rmtree(str(db_path.parent))
|
rmtree(str(db_path.parent))
|
||||||
|
|
||||||
|
|
||||||
|
class LutrisLocations(NamedTuple):
|
||||||
|
data: Location
|
||||||
|
|
||||||
|
|
||||||
class LutrisSource(URLExecutableSource):
|
class LutrisSource(URLExecutableSource):
|
||||||
"""Generic Lutris source"""
|
"""Generic Lutris source"""
|
||||||
|
|
||||||
name = "Lutris"
|
source_id = "lutris"
|
||||||
iterator_class = LutrisSourceIterator
|
name = _("Lutris")
|
||||||
|
iterable_class = LutrisSourceIterable
|
||||||
url_format = "lutris:rungameid/{game_id}"
|
url_format = "lutris:rungameid/{game_id}"
|
||||||
available_on = {"linux"}
|
available_on = {"linux"}
|
||||||
|
|
||||||
# FIXME possible bug: location picks ~/.var... and cache_lcoation picks ~/.local...
|
locations: LutrisLocations
|
||||||
|
|
||||||
data_location = Location(
|
|
||||||
schema_key="lutris-location",
|
|
||||||
candidates=(
|
|
||||||
shared.flatpak_dir / "net.lutris.Lutris" / "data" / "lutris",
|
|
||||||
shared.data_dir / "lutris",
|
|
||||||
shared.home / ".local" / "share" / "lutris",
|
|
||||||
),
|
|
||||||
paths={
|
|
||||||
"pga.db": (False, "pga.db"),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
cache_location = Location(
|
|
||||||
schema_key="lutris-cache-location",
|
|
||||||
candidates=(
|
|
||||||
shared.flatpak_dir / "net.lutris.Lutris" / "cache" / "lutris",
|
|
||||||
shared.cache_dir / "lutris",
|
|
||||||
shared.home / ".cache" / "lutris",
|
|
||||||
),
|
|
||||||
paths={
|
|
||||||
"coverart": (True, "coverart"),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def game_id_format(self):
|
def game_id_format(self):
|
||||||
return self.id + "_{runner}_{game_id}"
|
return self.source_id + "_{runner}_{game_id}"
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.locations = LutrisLocations(
|
||||||
|
Location(
|
||||||
|
schema_key="lutris-location",
|
||||||
|
candidates=(
|
||||||
|
shared.flatpak_dir / "net.lutris.Lutris" / "data" / "lutris",
|
||||||
|
shared.data_dir / "lutris",
|
||||||
|
shared.host_data_dir / "lutris",
|
||||||
|
),
|
||||||
|
paths={
|
||||||
|
"pga.db": LocationSubPath("pga.db"),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
255
cartridges/importer/retroarch_source.py
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
# retroarch_source.py
|
||||||
|
#
|
||||||
|
# Copyright 2023 Rilic
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
from hashlib import md5
|
||||||
|
from json import JSONDecodeError
|
||||||
|
from pathlib import Path
|
||||||
|
from shlex import quote as shell_quote
|
||||||
|
from typing import NamedTuple
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.importer.location import (
|
||||||
|
Location,
|
||||||
|
LocationSubPath,
|
||||||
|
UnresolvableLocationError,
|
||||||
|
)
|
||||||
|
from cartridges.importer.source import Source, SourceIterable
|
||||||
|
from cartridges.importer.steam_source import SteamSource
|
||||||
|
|
||||||
|
|
||||||
|
class RetroarchSourceIterable(SourceIterable):
|
||||||
|
source: "RetroarchSource"
|
||||||
|
|
||||||
|
def get_config_value(self, key: str, config_data: str):
|
||||||
|
for item in re.findall(f'{key}\\s*=\\s*"(.*)"\n', config_data, re.IGNORECASE):
|
||||||
|
if item.startswith(":"):
|
||||||
|
item = item.replace(":", str(self.source.locations.config.root))
|
||||||
|
|
||||||
|
logging.debug(str(item))
|
||||||
|
return item
|
||||||
|
|
||||||
|
raise KeyError(f"Key not found in RetroArch config: {key}")
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
bad_playlists = set()
|
||||||
|
|
||||||
|
config_file = self.source.locations.config["retroarch.cfg"]
|
||||||
|
with config_file.open(encoding="utf-8") as open_file:
|
||||||
|
config_data = open_file.read()
|
||||||
|
|
||||||
|
playlist_folder = Path(
|
||||||
|
self.get_config_value("playlist_directory", config_data)
|
||||||
|
).expanduser()
|
||||||
|
thumbnail_folder = Path(
|
||||||
|
self.get_config_value("thumbnails_directory", config_data)
|
||||||
|
).expanduser()
|
||||||
|
|
||||||
|
# Get all playlist files, ending in .lpl
|
||||||
|
playlist_files = playlist_folder.glob("*.lpl")
|
||||||
|
|
||||||
|
for playlist_file in playlist_files:
|
||||||
|
logging.debug(playlist_file)
|
||||||
|
try:
|
||||||
|
with playlist_file.open(
|
||||||
|
encoding="utf-8",
|
||||||
|
) as open_file:
|
||||||
|
playlist_json = json.load(open_file)
|
||||||
|
except (JSONDecodeError, OSError):
|
||||||
|
logging.warning("Cannot read playlist file: %s", str(playlist_file))
|
||||||
|
continue
|
||||||
|
|
||||||
|
for item in playlist_json["items"]:
|
||||||
|
# Select the core.
|
||||||
|
# Try the content's core first, then the playlist's default core.
|
||||||
|
# If none can be used, warn the user and continue.
|
||||||
|
for core_path in (
|
||||||
|
item["core_path"],
|
||||||
|
playlist_json["default_core_path"],
|
||||||
|
):
|
||||||
|
if core_path not in ("DETECT", ""):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
logging.warning("Cannot find core for: %s", str(item["path"]))
|
||||||
|
bad_playlists.add(playlist_file.stem)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Build game
|
||||||
|
game_id = md5(item["path"].encode("utf-8")).hexdigest()
|
||||||
|
|
||||||
|
values = {
|
||||||
|
"source": self.source.source_id,
|
||||||
|
"added": shared.import_time,
|
||||||
|
"name": item["label"],
|
||||||
|
"game_id": self.source.game_id_format.format(game_id=game_id),
|
||||||
|
"executable": self.source.make_executable(
|
||||||
|
core_path=core_path,
|
||||||
|
rom_path=item["path"],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
game = Game(values)
|
||||||
|
|
||||||
|
# Get boxart
|
||||||
|
boxart_image_name = item["label"] + ".png"
|
||||||
|
boxart_image_name = re.sub(r"[&\*\/:`<>\?\\\|]", "_", boxart_image_name)
|
||||||
|
boxart_folder_name = playlist_file.stem
|
||||||
|
image_path = (
|
||||||
|
thumbnail_folder
|
||||||
|
/ boxart_folder_name
|
||||||
|
/ "Named_Boxarts"
|
||||||
|
/ boxart_image_name
|
||||||
|
)
|
||||||
|
additional_data = {"local_image_path": image_path}
|
||||||
|
|
||||||
|
yield (game, additional_data)
|
||||||
|
|
||||||
|
if bad_playlists:
|
||||||
|
raise FriendlyError(
|
||||||
|
_("No RetroArch Core Selected"),
|
||||||
|
# The variable is a newline separated list of playlists
|
||||||
|
_("The following playlists have no default core:")
|
||||||
|
+ "\n\n{}\n\n".format("\n".join(bad_playlists))
|
||||||
|
+ _("Games with no core selected were not imported"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class RetroarchLocations(NamedTuple):
|
||||||
|
config: Location
|
||||||
|
|
||||||
|
|
||||||
|
class RetroarchSource(Source):
|
||||||
|
name = _("RetroArch")
|
||||||
|
source_id = "retroarch"
|
||||||
|
available_on = {"linux"}
|
||||||
|
iterable_class = RetroarchSourceIterable
|
||||||
|
|
||||||
|
locations: RetroarchLocations
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.locations = RetroarchLocations(
|
||||||
|
Location(
|
||||||
|
schema_key="retroarch-location",
|
||||||
|
candidates=[
|
||||||
|
shared.flatpak_dir
|
||||||
|
/ "org.libretro.RetroArch"
|
||||||
|
/ "config"
|
||||||
|
/ "retroarch",
|
||||||
|
shared.config_dir / "retroarch",
|
||||||
|
shared.host_config_dir / "retroarch",
|
||||||
|
# TODO: Windows support, waiting for executable path setting improvement
|
||||||
|
# Path("C:\\RetroArch-Win64"),
|
||||||
|
# Path("C:\\RetroArch-Win32"),
|
||||||
|
# TODO: UWP support (URL handler - https://github.com/libretro/RetroArch/pull/13563)
|
||||||
|
# shared.local_appdata_dir
|
||||||
|
# / "Packages"
|
||||||
|
# / "1e4cf179-f3c2-404f-b9f3-cb2070a5aad8_8ngdn9a6dx1ma"
|
||||||
|
# / "LocalState",
|
||||||
|
],
|
||||||
|
paths={
|
||||||
|
"retroarch.cfg": LocationSubPath("retroarch.cfg"),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# TODO enable when we get the Steam RetroArch games working
|
||||||
|
# self.add_steam_location_candidate()
|
||||||
|
|
||||||
|
def add_steam_location_candidate(self) -> None:
|
||||||
|
"""Add the Steam RetroAcrh location to the config candidates"""
|
||||||
|
try:
|
||||||
|
self.locations.config.candidates.append(self.get_steam_location())
|
||||||
|
except (OSError, KeyError, UnresolvableLocationError):
|
||||||
|
logging.debug("Steam isn't installed")
|
||||||
|
except ValueError as error:
|
||||||
|
logging.debug("RetroArch Steam location candiate not found", exc_info=error)
|
||||||
|
|
||||||
|
def get_steam_location(self) -> str:
|
||||||
|
"""
|
||||||
|
Get the RetroArch installed via Steam location
|
||||||
|
|
||||||
|
:raise UnresolvableLocationError: if Steam isn't installed
|
||||||
|
:raise KeyError: if there is no libraryfolders.vdf subpath
|
||||||
|
:raise OSError: if libraryfolders.vdf can't be opened
|
||||||
|
:raise ValueError: if RetroArch isn't installed through Steam
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Find Steam location
|
||||||
|
libraryfolders = SteamSource().locations.data["libraryfolders.vdf"]
|
||||||
|
parse_apps = False
|
||||||
|
with open(libraryfolders, "r", encoding="utf-8") as open_file:
|
||||||
|
# Search each line for a library path and store it each time a new one is found.
|
||||||
|
for line in open_file:
|
||||||
|
if '"path"' in line:
|
||||||
|
library_path = re.findall(
|
||||||
|
'"path"\\s+"(.*)"\n', line, re.IGNORECASE
|
||||||
|
)[0]
|
||||||
|
elif '"apps"' in line:
|
||||||
|
parse_apps = True
|
||||||
|
elif parse_apps and "}" in line:
|
||||||
|
parse_apps = False
|
||||||
|
# Stop searching, as the library path directly above the appid has been found.
|
||||||
|
elif parse_apps and '"1118310"' in line:
|
||||||
|
return Path(f"{library_path}/steamapps/common/RetroArch")
|
||||||
|
# Not found
|
||||||
|
raise ValueError("RetroArch not found in Steam library")
|
||||||
|
|
||||||
|
def make_executable(self, core_path: Path, rom_path: Path) -> str:
|
||||||
|
"""
|
||||||
|
Generate an executable command from the rom path and core path,
|
||||||
|
depending on the source's location.
|
||||||
|
|
||||||
|
The format depends on RetroArch's installation method,
|
||||||
|
detected from the source config location
|
||||||
|
|
||||||
|
:param Path rom_path: the game's rom path
|
||||||
|
:param Path core_path: the game's core path
|
||||||
|
:return str: an executable command
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.locations.config.resolve()
|
||||||
|
args = ("-L", core_path, rom_path)
|
||||||
|
|
||||||
|
# Steam RetroArch
|
||||||
|
# (Must check before Flatpak, because Steam itself can be installed as one)
|
||||||
|
# TODO enable when we get Steam RetroArch executable to work
|
||||||
|
# if self.locations.config.root.parent.parent.name == "steamapps":
|
||||||
|
# # steam://run exepects args to be url-encoded and separated by spaces.
|
||||||
|
# args = map(lambda s: url_quote(str(s), safe=""), args)
|
||||||
|
# args_str = " ".join(args)
|
||||||
|
# uri = f"steam://run/1118310//{args_str}/"
|
||||||
|
# return f"xdg-open {shell_quote(uri)}"
|
||||||
|
|
||||||
|
# Flatpak RetroArch
|
||||||
|
args = map(lambda s: shell_quote(str(s)), args)
|
||||||
|
args_str = " ".join(args)
|
||||||
|
if self.locations.config.root.is_relative_to(shared.flatpak_dir):
|
||||||
|
return f"flatpak run org.libretro.RetroArch {args_str}"
|
||||||
|
|
||||||
|
# TODO executable override for non-sandboxed sources
|
||||||
|
|
||||||
|
# Linux native RetroArch
|
||||||
|
return f"retroarch {args_str}"
|
||||||
|
|
||||||
|
# TODO implement for windows (needs override)
|
||||||
@@ -19,35 +19,26 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from collections.abc import Iterable, Iterator
|
from collections.abc import Iterable
|
||||||
from typing import Any, Generator, Optional
|
from typing import Any, Collection, Generator, Optional
|
||||||
|
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.location import Location
|
from cartridges.importer.location import Location, UnresolvableLocationError
|
||||||
|
|
||||||
# Type of the data returned by iterating on a Source
|
# Type of the data returned by iterating on a Source
|
||||||
SourceIterationResult = None | Game | tuple[Game, tuple[Any]]
|
SourceIterationResult = Optional[Game | tuple[Game, tuple[Any]]]
|
||||||
|
|
||||||
|
|
||||||
class SourceIterator(Iterator):
|
class SourceIterable(Iterable):
|
||||||
"""Data producer for a source of games"""
|
"""Data producer for a source of games"""
|
||||||
|
|
||||||
source: "Source" = None
|
source: "Source"
|
||||||
generator: Generator = None
|
|
||||||
|
|
||||||
def __init__(self, source: "Source") -> None:
|
def __init__(self, source: "Source") -> None:
|
||||||
super().__init__()
|
|
||||||
self.source = source
|
self.source = source
|
||||||
self.generator = self.generator_builder()
|
|
||||||
|
|
||||||
def __iter__(self) -> "SourceIterator":
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self) -> SourceIterationResult:
|
|
||||||
return next(self.generator)
|
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def generator_builder(self) -> Generator[SourceIterationResult, None, None]:
|
def __iter__(self) -> Generator[SourceIterationResult, None, None]:
|
||||||
"""
|
"""
|
||||||
Method that returns a generator that produces games
|
Method that returns a generator that produces games
|
||||||
* Should be implemented as a generator method
|
* Should be implemented as a generator method
|
||||||
@@ -60,59 +51,69 @@ class SourceIterator(Iterator):
|
|||||||
class Source(Iterable):
|
class Source(Iterable):
|
||||||
"""Source of games. E.g an installed app with a config file that lists game directories"""
|
"""Source of games. E.g an installed app with a config file that lists game directories"""
|
||||||
|
|
||||||
|
source_id: str
|
||||||
name: str
|
name: str
|
||||||
variant: str = None
|
variant: Optional[str] = None
|
||||||
available_on: set[str] = set()
|
available_on: set[str] = set()
|
||||||
data_location: Optional[Location] = None
|
iterable_class: type[SourceIterable]
|
||||||
cache_location: Optional[Location] = None
|
|
||||||
config_location: Optional[Location] = None
|
# NOTE: Locations must be set at __init__ time, not in the class definition.
|
||||||
iterator_class: type[SourceIterator]
|
# They must not be shared between source instances.
|
||||||
|
locations: Collection[Location]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def full_name(self) -> str:
|
def full_name(self) -> str:
|
||||||
"""The source's full name"""
|
"""The source's full name"""
|
||||||
full_name_ = self.name
|
full_name_ = self.name
|
||||||
if self.variant is not None:
|
if self.variant:
|
||||||
full_name_ += f" ({self.variant})"
|
full_name_ += f" ({self.variant})"
|
||||||
return full_name_
|
return full_name_
|
||||||
|
|
||||||
@property
|
|
||||||
def id(self) -> str: # pylint: disable=invalid-name
|
|
||||||
"""The source's identifier"""
|
|
||||||
id_ = self.name.lower()
|
|
||||||
if self.variant is not None:
|
|
||||||
id_ += f"_{self.variant.lower()}"
|
|
||||||
return id_
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def game_id_format(self) -> str:
|
def game_id_format(self) -> str:
|
||||||
"""The string format used to construct game IDs"""
|
"""The string format used to construct game IDs"""
|
||||||
return self.id + "_{game_id}"
|
return self.source_id + "_{game_id}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_available(self):
|
def is_available(self) -> bool:
|
||||||
return sys.platform in self.available_on
|
return sys.platform in self.available_on
|
||||||
|
|
||||||
|
def make_executable(self, *args, **kwargs) -> str:
|
||||||
|
"""
|
||||||
|
Create a game executable command.
|
||||||
|
Should be implemented by child classes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __iter__(self) -> Generator[SourceIterationResult, None, None]:
|
||||||
|
"""
|
||||||
|
Get an iterator for the source
|
||||||
|
:raises UnresolvableLocationError: Not iterable
|
||||||
|
if any of the mandatory locations are unresolvable
|
||||||
|
"""
|
||||||
|
for location in self.locations:
|
||||||
|
try:
|
||||||
|
location.resolve()
|
||||||
|
except UnresolvableLocationError as error:
|
||||||
|
if not error.optional:
|
||||||
|
raise UnresolvableLocationError from error
|
||||||
|
return iter(self.iterable_class(self))
|
||||||
|
|
||||||
|
|
||||||
|
class ExecutableFormatSource(Source):
|
||||||
|
"""Source class that uses a simple executable format to start games"""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def executable_format(self) -> str:
|
def executable_format(self) -> str:
|
||||||
"""The executable format used to construct game executables"""
|
"""The executable format used to construct game executables"""
|
||||||
|
|
||||||
def __iter__(self) -> SourceIterator:
|
def make_executable(self, *args, **kwargs) -> str:
|
||||||
"""
|
"""Use the executable format to"""
|
||||||
Get an iterator for the source
|
return self.executable_format.format(*args, **kwargs)
|
||||||
:raises UnresolvableLocationError: Not iterable if any of the locations are unresolvable
|
|
||||||
"""
|
|
||||||
for location_name in ("data", "cache", "config"):
|
|
||||||
location = getattr(self, f"{location_name}_location", None)
|
|
||||||
if location is None:
|
|
||||||
continue
|
|
||||||
location.resolve()
|
|
||||||
return self.iterator_class(self)
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=abstract-method
|
# pylint: disable=abstract-method
|
||||||
class URLExecutableSource(Source):
|
class URLExecutableSource(ExecutableFormatSource):
|
||||||
"""Source class that use custom URLs to start games"""
|
"""Source class that use custom URLs to start games"""
|
||||||
|
|
||||||
url_format: str
|
url_format: str
|
||||||
@@ -18,28 +18,24 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import logging
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import time
|
from typing import Iterable, NamedTuple
|
||||||
from typing import Iterable
|
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.importer.sources.source import (
|
from cartridges.importer.location import Location, LocationSubPath
|
||||||
SourceIterationResult,
|
from cartridges.importer.source import SourceIterable, URLExecutableSource
|
||||||
SourceIterator,
|
from cartridges.utils.steam import SteamFileHelper, SteamInvalidManifestError
|
||||||
URLExecutableSource,
|
|
||||||
)
|
|
||||||
from src.utils.steam import SteamFileHelper, SteamInvalidManifestError
|
|
||||||
from src.importer.sources.location import Location
|
|
||||||
|
|
||||||
|
|
||||||
class SteamSourceIterator(SourceIterator):
|
class SteamSourceIterable(SourceIterable):
|
||||||
source: "SteamSource"
|
source: "SteamSource"
|
||||||
|
|
||||||
def get_manifest_dirs(self) -> Iterable[Path]:
|
def get_manifest_dirs(self) -> Iterable[Path]:
|
||||||
"""Get dirs that contain steam app manifests"""
|
"""Get dirs that contain Steam app manifests"""
|
||||||
libraryfolders_path = self.source.data_location["libraryfolders.vdf"]
|
libraryfolders_path = self.source.locations.data["libraryfolders.vdf"]
|
||||||
with open(libraryfolders_path, "r", encoding="utf-8") as file:
|
with open(libraryfolders_path, "r", encoding="utf-8") as file:
|
||||||
contents = file.read()
|
contents = file.read()
|
||||||
return [
|
return [
|
||||||
@@ -62,69 +58,83 @@ class SteamSourceIterator(SourceIterator):
|
|||||||
)
|
)
|
||||||
return manifests
|
return manifests
|
||||||
|
|
||||||
def generator_builder(self) -> SourceIterationResult:
|
def __iter__(self):
|
||||||
"""Generator method producing games"""
|
"""Generator method producing games"""
|
||||||
appid_cache = set()
|
appid_cache = set()
|
||||||
manifests = self.get_manifests()
|
manifests = self.get_manifests()
|
||||||
|
|
||||||
added_time = int(time())
|
|
||||||
|
|
||||||
for manifest in manifests:
|
for manifest in manifests:
|
||||||
# Get metadata from manifest
|
# Get metadata from manifest
|
||||||
steam = SteamFileHelper()
|
steam = SteamFileHelper()
|
||||||
try:
|
try:
|
||||||
local_data = steam.get_manifest_data(manifest)
|
local_data = steam.get_manifest_data(manifest)
|
||||||
except (OSError, SteamInvalidManifestError):
|
except (OSError, SteamInvalidManifestError) as error:
|
||||||
|
logging.debug("Couldn't load appmanifest %s", manifest, exc_info=error)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Skip non installed games
|
# Skip non installed games
|
||||||
installed_mask = 4
|
installed_mask = 4
|
||||||
if not int(local_data["stateflags"]) & installed_mask:
|
if not int(local_data["stateflags"]) & installed_mask:
|
||||||
|
logging.debug("Skipped %s: not installed", manifest)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Skip duplicate appids
|
# Skip duplicate appids
|
||||||
appid = local_data["appid"]
|
appid = local_data["appid"]
|
||||||
if appid in appid_cache:
|
if appid in appid_cache:
|
||||||
|
logging.debug("Skipped %s: appid already seen during import", manifest)
|
||||||
continue
|
continue
|
||||||
appid_cache.add(appid)
|
appid_cache.add(appid)
|
||||||
|
|
||||||
# Build game from local data
|
# Build game from local data
|
||||||
values = {
|
values = {
|
||||||
"added": added_time,
|
"added": shared.import_time,
|
||||||
"name": local_data["name"],
|
"name": local_data["name"],
|
||||||
"source": self.source.id,
|
"source": self.source.source_id,
|
||||||
"game_id": self.source.game_id_format.format(game_id=appid),
|
"game_id": self.source.game_id_format.format(game_id=appid),
|
||||||
"executable": self.source.executable_format.format(game_id=appid),
|
"executable": self.source.make_executable(game_id=appid),
|
||||||
}
|
}
|
||||||
game = Game(values)
|
game = Game(values)
|
||||||
|
|
||||||
# Add official cover image
|
# Add official cover image
|
||||||
image_path = (
|
image_path = (
|
||||||
self.source.data_location["librarycache"]
|
self.source.locations.data["librarycache"]
|
||||||
/ f"{appid}_library_600x900.jpg"
|
/ f"{appid}_library_600x900.jpg"
|
||||||
)
|
)
|
||||||
additional_data = {"local_image_path": image_path, "steam_appid": appid}
|
additional_data = {"local_image_path": image_path, "steam_appid": appid}
|
||||||
|
|
||||||
# Produce game
|
|
||||||
yield (game, additional_data)
|
yield (game, additional_data)
|
||||||
|
|
||||||
|
|
||||||
|
class SteamLocations(NamedTuple):
|
||||||
|
data: Location
|
||||||
|
|
||||||
|
|
||||||
class SteamSource(URLExecutableSource):
|
class SteamSource(URLExecutableSource):
|
||||||
name = "Steam"
|
source_id = "steam"
|
||||||
|
name = _("Steam")
|
||||||
available_on = {"linux", "win32"}
|
available_on = {"linux", "win32"}
|
||||||
iterator_class = SteamSourceIterator
|
iterable_class = SteamSourceIterable
|
||||||
url_format = "steam://rungameid/{game_id}"
|
url_format = "steam://rungameid/{game_id}"
|
||||||
|
|
||||||
data_location = Location(
|
locations: SteamLocations
|
||||||
schema_key="steam-location",
|
|
||||||
candidates=(
|
def __init__(self) -> None:
|
||||||
shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam",
|
super().__init__()
|
||||||
shared.data_dir / "Steam",
|
self.locations = SteamLocations(
|
||||||
shared.home / ".steam",
|
Location(
|
||||||
shared.programfiles32_dir / "Steam",
|
schema_key="steam-location",
|
||||||
),
|
candidates=(
|
||||||
paths={
|
shared.home / ".steam" / "steam",
|
||||||
"libraryfolders.vdf": (False, "steamapps/libraryfolders.vdf"),
|
shared.data_dir / "Steam",
|
||||||
"librarycache": (True, "appcache/librarycache"),
|
shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam",
|
||||||
},
|
shared.programfiles32_dir / "Steam",
|
||||||
)
|
),
|
||||||
|
paths={
|
||||||
|
"libraryfolders.vdf": LocationSubPath(
|
||||||
|
"steamapps/libraryfolders.vdf"
|
||||||
|
),
|
||||||
|
"librarycache": LocationSubPath("appcache/librarycache", True),
|
||||||
|
},
|
||||||
|
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -29,7 +29,7 @@ class ColorLogFormatter(Formatter):
|
|||||||
RED = "\033[31m"
|
RED = "\033[31m"
|
||||||
YELLOW = "\033[33m"
|
YELLOW = "\033[33m"
|
||||||
|
|
||||||
def format(self, record: LogRecord):
|
def format(self, record: LogRecord) -> str:
|
||||||
super_format = super().format(record)
|
super_format = super().format(record)
|
||||||
match record.levelname:
|
match record.levelname:
|
||||||
case "CRITICAL":
|
case "CRITICAL":
|
||||||
@@ -18,13 +18,14 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import lzma
|
import lzma
|
||||||
from io import StringIO
|
from io import TextIOWrapper
|
||||||
from logging import StreamHandler
|
from logging import StreamHandler
|
||||||
from lzma import FORMAT_XZ, PRESET_DEFAULT
|
from lzma import FORMAT_XZ, PRESET_DEFAULT
|
||||||
from os import PathLike
|
from os import PathLike
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
|
||||||
|
|
||||||
class SessionFileHandler(StreamHandler):
|
class SessionFileHandler(StreamHandler):
|
||||||
@@ -37,7 +38,7 @@ class SessionFileHandler(StreamHandler):
|
|||||||
|
|
||||||
backup_count: int
|
backup_count: int
|
||||||
filename: Path
|
filename: Path
|
||||||
log_file: StringIO = None
|
log_file: Optional[TextIOWrapper] = None
|
||||||
|
|
||||||
def create_dir(self) -> None:
|
def create_dir(self) -> None:
|
||||||
"""Create the log dir if needed"""
|
"""Create the log dir if needed"""
|
||||||
@@ -83,23 +84,29 @@ class SessionFileHandler(StreamHandler):
|
|||||||
logfiles.sort(key=self.file_sort_key, reverse=True)
|
logfiles.sort(key=self.file_sort_key, reverse=True)
|
||||||
return logfiles
|
return logfiles
|
||||||
|
|
||||||
def rotate_file(self, path: Path):
|
def rotate_file(self, path: Path) -> None:
|
||||||
"""Rotate a file's number suffix and remove it if it's too old"""
|
"""Rotate a file's number suffix and remove it if it's too old"""
|
||||||
|
|
||||||
# If uncompressed, compress
|
# If uncompressed, compress
|
||||||
if not path.name.endswith(".xz"):
|
if not path.name.endswith(".xz"):
|
||||||
|
try:
|
||||||
|
with open(path, "r", encoding="utf-8") as original_file:
|
||||||
|
original_data = original_file.read()
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
# If the file is corrupted, throw it away
|
||||||
|
path.unlink()
|
||||||
|
return
|
||||||
|
|
||||||
|
# Compress the file
|
||||||
compressed_path = path.with_suffix(path.suffix + ".xz")
|
compressed_path = path.with_suffix(path.suffix + ".xz")
|
||||||
with (
|
with lzma.open(
|
||||||
lzma.open(
|
compressed_path,
|
||||||
compressed_path,
|
"wt",
|
||||||
"wt",
|
format=FORMAT_XZ,
|
||||||
format=FORMAT_XZ,
|
preset=PRESET_DEFAULT,
|
||||||
preset=PRESET_DEFAULT,
|
encoding="utf-8",
|
||||||
encoding="utf-8",
|
) as lzma_file:
|
||||||
) as lzma_file,
|
lzma_file.write(original_data)
|
||||||
open(path, "r", encoding="utf-8") as original_file,
|
|
||||||
):
|
|
||||||
lzma_file.write(original_file.read())
|
|
||||||
path.unlink()
|
path.unlink()
|
||||||
path = compressed_path
|
path = compressed_path
|
||||||
|
|
||||||
@@ -128,5 +135,6 @@ class SessionFileHandler(StreamHandler):
|
|||||||
super().__init__(self.log_file)
|
super().__init__(self.log_file)
|
||||||
|
|
||||||
def close(self) -> None:
|
def close(self) -> None:
|
||||||
self.log_file.close()
|
if self.log_file:
|
||||||
|
self.log_file.close()
|
||||||
super().close()
|
super().close()
|
||||||
@@ -24,10 +24,10 @@ import platform
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
|
||||||
|
|
||||||
def setup_logging():
|
def setup_logging() -> None:
|
||||||
"""Intitate the app's logging"""
|
"""Intitate the app's logging"""
|
||||||
|
|
||||||
is_dev = shared.PROFILE == "development"
|
is_dev = shared.PROFILE == "development"
|
||||||
@@ -47,12 +47,12 @@ def setup_logging():
|
|||||||
},
|
},
|
||||||
"console_formatter": {
|
"console_formatter": {
|
||||||
"format": "%(name)s %(levelname)s - %(message)s",
|
"format": "%(name)s %(levelname)s - %(message)s",
|
||||||
"class": "src.logging.color_log_formatter.ColorLogFormatter",
|
"class": "cartridges.logging.color_log_formatter.ColorLogFormatter",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"handlers": {
|
"handlers": {
|
||||||
"file_handler": {
|
"file_handler": {
|
||||||
"class": "src.logging.session_file_handler.SessionFileHandler",
|
"class": "cartridges.logging.session_file_handler.SessionFileHandler",
|
||||||
"formatter": "file_formatter",
|
"formatter": "file_formatter",
|
||||||
"level": "DEBUG",
|
"level": "DEBUG",
|
||||||
"filename": log_filename,
|
"filename": log_filename,
|
||||||
@@ -73,7 +73,7 @@ def setup_logging():
|
|||||||
"PIL": {
|
"PIL": {
|
||||||
"handlers": ["lib_console_handler", "file_handler"],
|
"handlers": ["lib_console_handler", "file_handler"],
|
||||||
"propagate": False,
|
"propagate": False,
|
||||||
"level": "NOTSET",
|
"level": "WARNING",
|
||||||
},
|
},
|
||||||
"urllib3": {
|
"urllib3": {
|
||||||
"handlers": ["lib_console_handler", "file_handler"],
|
"handlers": ["lib_console_handler", "file_handler"],
|
||||||
@@ -89,7 +89,7 @@ def setup_logging():
|
|||||||
logging_dot_config.dictConfig(config)
|
logging_dot_config.dictConfig(config)
|
||||||
|
|
||||||
|
|
||||||
def log_system_info():
|
def log_system_info() -> None:
|
||||||
"""Log system debug information"""
|
"""Log system debug information"""
|
||||||
|
|
||||||
logging.debug("Starting %s v%s (%s)", shared.APP_ID, shared.VERSION, shared.PROFILE)
|
logging.debug("Starting %s v%s (%s)", shared.APP_ID, shared.VERSION, shared.PROFILE)
|
||||||
385
cartridges/main.py
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
# main.py
|
||||||
|
#
|
||||||
|
# Copyright 2022-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
|
||||||
|
|
||||||
|
import json
|
||||||
|
import lzma
|
||||||
|
import os
|
||||||
|
import shlex
|
||||||
|
import sys
|
||||||
|
from time import time
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version("Gtk", "4.0")
|
||||||
|
gi.require_version("Adw", "1")
|
||||||
|
|
||||||
|
# pylint: disable=wrong-import-position
|
||||||
|
from gi.repository import Adw, Gio, GLib, Gtk
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.details_dialog import DetailsDialog
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.importer.bottles_source import BottlesSource
|
||||||
|
from cartridges.importer.desktop_source import DesktopSource
|
||||||
|
from cartridges.importer.flatpak_source import FlatpakSource
|
||||||
|
from cartridges.importer.heroic_source import HeroicSource
|
||||||
|
from cartridges.importer.importer import Importer
|
||||||
|
from cartridges.importer.itch_source import ItchSource
|
||||||
|
from cartridges.importer.legendary_source import LegendarySource
|
||||||
|
from cartridges.importer.lutris_source import LutrisSource
|
||||||
|
from cartridges.importer.retroarch_source import RetroarchSource
|
||||||
|
from cartridges.importer.steam_source import SteamSource
|
||||||
|
from cartridges.logging.setup import log_system_info, setup_logging
|
||||||
|
from cartridges.preferences import CartridgesPreferences
|
||||||
|
from cartridges.store.managers.cover_manager import CoverManager
|
||||||
|
from cartridges.store.managers.display_manager import DisplayManager
|
||||||
|
from cartridges.store.managers.file_manager import FileManager
|
||||||
|
from cartridges.store.managers.sgdb_manager import SgdbManager
|
||||||
|
from cartridges.store.managers.steam_api_manager import SteamAPIManager
|
||||||
|
from cartridges.store.store import Store
|
||||||
|
from cartridges.utils.migrate_files_v1_to_v2 import migrate_files_v1_to_v2
|
||||||
|
from cartridges.utils.run_executable import run_executable
|
||||||
|
from cartridges.window import CartridgesWindow
|
||||||
|
|
||||||
|
|
||||||
|
class CartridgesApplication(Adw.Application):
|
||||||
|
state = shared.AppState.DEFAULT
|
||||||
|
win: CartridgesWindow
|
||||||
|
init_search_term: Optional[str] = None
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
shared.store = Store()
|
||||||
|
super().__init__(application_id=shared.APP_ID)
|
||||||
|
|
||||||
|
search = GLib.OptionEntry()
|
||||||
|
search.long_name = "search"
|
||||||
|
search.short_name = ord("s")
|
||||||
|
search.flags = 0
|
||||||
|
search.arg = int(GLib.OptionArg.STRING)
|
||||||
|
search.arg_data = None
|
||||||
|
search.description = "Open the app with this term in the search entry"
|
||||||
|
search.arg_description = "TERM"
|
||||||
|
|
||||||
|
launch = GLib.OptionEntry()
|
||||||
|
launch.long_name = "launch"
|
||||||
|
launch.short_name = ord("l")
|
||||||
|
launch.flags = int(GLib.OptionFlags.NONE)
|
||||||
|
launch.arg = int(GLib.OptionArg.STRING)
|
||||||
|
launch.arg_data = None
|
||||||
|
launch.description = "Run a game with the given game_id"
|
||||||
|
launch.arg_description = "GAME_ID"
|
||||||
|
|
||||||
|
self.add_main_option_entries((search, launch))
|
||||||
|
|
||||||
|
def do_activate(self) -> None: # pylint: disable=arguments-differ
|
||||||
|
"""Called on app creation"""
|
||||||
|
|
||||||
|
setup_logging()
|
||||||
|
log_system_info()
|
||||||
|
|
||||||
|
if os.name == "nt":
|
||||||
|
migrate_files_v1_to_v2()
|
||||||
|
|
||||||
|
# Set fallback icon-name
|
||||||
|
Gtk.Window.set_default_icon_name(shared.APP_ID)
|
||||||
|
|
||||||
|
# Create the main window
|
||||||
|
win = self.props.active_window # pylint: disable=no-member
|
||||||
|
if not win:
|
||||||
|
shared.win = win = CartridgesWindow(application=self)
|
||||||
|
|
||||||
|
# Save window geometry
|
||||||
|
shared.state_schema.bind(
|
||||||
|
"width", shared.win, "default-width", Gio.SettingsBindFlags.DEFAULT
|
||||||
|
)
|
||||||
|
shared.state_schema.bind(
|
||||||
|
"height", shared.win, "default-height", Gio.SettingsBindFlags.DEFAULT
|
||||||
|
)
|
||||||
|
shared.state_schema.bind(
|
||||||
|
"is-maximized", shared.win, "maximized", Gio.SettingsBindFlags.DEFAULT
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load games from disk
|
||||||
|
shared.store.add_manager(FileManager(), False)
|
||||||
|
shared.store.add_manager(DisplayManager())
|
||||||
|
self.state = shared.AppState.LOAD_FROM_DISK
|
||||||
|
self.load_games_from_disk()
|
||||||
|
self.state = shared.AppState.DEFAULT
|
||||||
|
shared.win.create_source_rows()
|
||||||
|
|
||||||
|
# Add rest of the managers for game imports
|
||||||
|
shared.store.add_manager(CoverManager())
|
||||||
|
shared.store.add_manager(SteamAPIManager())
|
||||||
|
shared.store.add_manager(SgdbManager())
|
||||||
|
shared.store.toggle_manager_in_pipelines(FileManager, True)
|
||||||
|
|
||||||
|
# Create actions
|
||||||
|
self.create_actions(
|
||||||
|
{
|
||||||
|
("quit", ("<primary>q",)),
|
||||||
|
("about",),
|
||||||
|
("preferences", ("<primary>comma",)),
|
||||||
|
("launch_game",),
|
||||||
|
("hide_game",),
|
||||||
|
("edit_game",),
|
||||||
|
("add_game", ("<primary>n",)),
|
||||||
|
("import", ("<primary>i",)),
|
||||||
|
("remove_game_details_view", ("Delete",)),
|
||||||
|
("remove_game",),
|
||||||
|
("igdb_search",),
|
||||||
|
("sgdb_search",),
|
||||||
|
("protondb_search",),
|
||||||
|
("lutris_search",),
|
||||||
|
("hltb_search",),
|
||||||
|
("show_sidebar", ("F9",), shared.win),
|
||||||
|
("show_hidden", ("<primary>h",), shared.win),
|
||||||
|
("go_to_parent", ("<alt>Up",), shared.win),
|
||||||
|
("go_home", ("<alt>Home",), shared.win),
|
||||||
|
("toggle_search", ("<primary>f",), shared.win),
|
||||||
|
("undo", ("<primary>z",), shared.win),
|
||||||
|
("open_menu", ("F10",), shared.win),
|
||||||
|
("close", ("<primary>w",), shared.win),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
sort_action = Gio.SimpleAction.new_stateful(
|
||||||
|
"sort_by",
|
||||||
|
GLib.VariantType.new("s"),
|
||||||
|
sort_mode := GLib.Variant("s", shared.state_schema.get_string("sort-mode")),
|
||||||
|
)
|
||||||
|
sort_action.connect("activate", shared.win.on_sort_action)
|
||||||
|
shared.win.add_action(sort_action)
|
||||||
|
shared.win.on_sort_action(sort_action, sort_mode)
|
||||||
|
|
||||||
|
if self.init_search_term: # For command line activation
|
||||||
|
shared.win.search_bar.set_search_mode(True)
|
||||||
|
shared.win.search_entry.set_text(self.init_search_term)
|
||||||
|
shared.win.search_entry.set_position(-1)
|
||||||
|
|
||||||
|
shared.win.present()
|
||||||
|
|
||||||
|
def do_handle_local_options(self, options: GLib.VariantDict) -> int:
|
||||||
|
if search := options.lookup_value("search"):
|
||||||
|
self.init_search_term = search.get_string()
|
||||||
|
elif game_id := options.lookup_value("launch"):
|
||||||
|
try:
|
||||||
|
data = json.load(
|
||||||
|
(path := shared.games_dir / (game_id.get_string() + ".json")).open(
|
||||||
|
"r", encoding="utf-8"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
executable = (
|
||||||
|
shlex.join(data["executable"])
|
||||||
|
if isinstance(data["executable"], list)
|
||||||
|
else data["executable"]
|
||||||
|
)
|
||||||
|
name = data["name"]
|
||||||
|
|
||||||
|
run_executable(executable)
|
||||||
|
|
||||||
|
data["last_played"] = int(time())
|
||||||
|
json.dump(data, path.open("w", encoding="utf-8"))
|
||||||
|
|
||||||
|
except (IndexError, KeyError, OSError, json.decoder.JSONDecodeError):
|
||||||
|
return 1
|
||||||
|
|
||||||
|
self.register()
|
||||||
|
notification = Gio.Notification.new(_("Cartridges"))
|
||||||
|
notification.set_body(_("{} launched").format(name))
|
||||||
|
self.send_notification(
|
||||||
|
"launch",
|
||||||
|
notification,
|
||||||
|
)
|
||||||
|
return 0
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def load_games_from_disk(self) -> None:
|
||||||
|
if shared.games_dir.is_dir():
|
||||||
|
for game_file in shared.games_dir.iterdir():
|
||||||
|
try:
|
||||||
|
data = json.load(game_file.open())
|
||||||
|
except (OSError, json.decoder.JSONDecodeError):
|
||||||
|
continue
|
||||||
|
game = Game(data)
|
||||||
|
shared.store.add_game(game, {"skip_save": True})
|
||||||
|
|
||||||
|
def get_source_name(self, source_id: str) -> Any:
|
||||||
|
if source_id == "all":
|
||||||
|
name = _("All Games")
|
||||||
|
elif source_id == "imported":
|
||||||
|
name = _("Added")
|
||||||
|
else:
|
||||||
|
name = globals()[f'{source_id.split("_")[0].title()}Source'].name
|
||||||
|
return name
|
||||||
|
|
||||||
|
def on_about_action(self, *_args: Any) -> None:
|
||||||
|
# Get the debug info from the log files
|
||||||
|
debug_str = ""
|
||||||
|
for index, path in enumerate(shared.log_files):
|
||||||
|
# Add a horizontal line between runs
|
||||||
|
if index > 0:
|
||||||
|
debug_str += "─" * 37 + "\n"
|
||||||
|
# Add the run's logs
|
||||||
|
log_file = (
|
||||||
|
lzma.open(path, "rt", encoding="utf-8")
|
||||||
|
if path.name.endswith(".xz")
|
||||||
|
else open(path, "r", encoding="utf-8")
|
||||||
|
)
|
||||||
|
debug_str += log_file.read()
|
||||||
|
log_file.close()
|
||||||
|
|
||||||
|
about = Adw.AboutDialog.new_from_appdata(
|
||||||
|
shared.PREFIX + "/" + shared.APP_ID + ".metainfo.xml", shared.VERSION
|
||||||
|
)
|
||||||
|
about.set_developers(
|
||||||
|
(
|
||||||
|
"kramo https://kramo.page",
|
||||||
|
"Geoffrey Coulaud https://geoffrey-coulaud.fr",
|
||||||
|
"Rilic https://rilic.red",
|
||||||
|
"Arcitec https://github.com/Arcitec",
|
||||||
|
"Paweł Lidwin https://github.com/imLinguin",
|
||||||
|
"Domenico https://github.com/Domefemia",
|
||||||
|
"Rafael Mardojai CM https://mardojai.com",
|
||||||
|
"Clara Hobbs https://github.com/Ratfink",
|
||||||
|
"Sabri Ünal https://github.com/sabriunal",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
about.set_designers(("kramo https://kramo.page",))
|
||||||
|
about.set_copyright("© 2022-2024 kramo")
|
||||||
|
# Translators: Replace this with your name for it to show up in the about window
|
||||||
|
about.set_translator_credits = (_("translator_credits"),)
|
||||||
|
about.set_debug_info(debug_str)
|
||||||
|
about.set_debug_info_filename("cartridges.log")
|
||||||
|
about.add_legal_section(
|
||||||
|
"Steam Branding",
|
||||||
|
"© 2023 Valve Corporation",
|
||||||
|
Gtk.License.CUSTOM,
|
||||||
|
"Steam and the Steam logo are trademarks and/or registered trademarks of Valve Corporation in the U.S. and/or other countries.", # pylint: disable=line-too-long
|
||||||
|
)
|
||||||
|
about.present(shared.win)
|
||||||
|
|
||||||
|
def on_preferences_action(
|
||||||
|
self,
|
||||||
|
_action: Any = None,
|
||||||
|
_parameter: Any = None,
|
||||||
|
page_name: Optional[str] = None,
|
||||||
|
expander_row: Optional[str] = None,
|
||||||
|
) -> CartridgesWindow:
|
||||||
|
win = CartridgesPreferences()
|
||||||
|
if page_name:
|
||||||
|
win.set_visible_page_name(page_name)
|
||||||
|
if expander_row:
|
||||||
|
getattr(win, expander_row).set_expanded(True)
|
||||||
|
win.present(shared.win)
|
||||||
|
|
||||||
|
return win
|
||||||
|
|
||||||
|
def on_launch_game_action(self, *_args: Any) -> None:
|
||||||
|
shared.win.active_game.launch()
|
||||||
|
|
||||||
|
def on_hide_game_action(self, *_args: Any) -> None:
|
||||||
|
shared.win.active_game.toggle_hidden()
|
||||||
|
|
||||||
|
def on_edit_game_action(self, *_args: Any) -> None:
|
||||||
|
DetailsDialog(shared.win.active_game).present(shared.win)
|
||||||
|
|
||||||
|
def on_add_game_action(self, *_args: Any) -> None:
|
||||||
|
DetailsDialog().present(shared.win)
|
||||||
|
|
||||||
|
def on_import_action(self, *_args: Any) -> None:
|
||||||
|
shared.importer = Importer()
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("lutris"):
|
||||||
|
shared.importer.add_source(LutrisSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("steam"):
|
||||||
|
shared.importer.add_source(SteamSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("heroic"):
|
||||||
|
shared.importer.add_source(HeroicSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("bottles"):
|
||||||
|
shared.importer.add_source(BottlesSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("flatpak"):
|
||||||
|
shared.importer.add_source(FlatpakSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("desktop"):
|
||||||
|
shared.importer.add_source(DesktopSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("itch"):
|
||||||
|
shared.importer.add_source(ItchSource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("legendary"):
|
||||||
|
shared.importer.add_source(LegendarySource())
|
||||||
|
|
||||||
|
if shared.schema.get_boolean("retroarch"):
|
||||||
|
shared.importer.add_source(RetroarchSource())
|
||||||
|
|
||||||
|
shared.importer.run()
|
||||||
|
|
||||||
|
def on_remove_game_action(self, *_args: Any) -> None:
|
||||||
|
shared.win.active_game.remove_game()
|
||||||
|
|
||||||
|
def on_remove_game_details_view_action(self, *_args: Any) -> None:
|
||||||
|
if shared.win.navigation_view.get_visible_page() == shared.win.details_page:
|
||||||
|
self.on_remove_game_action()
|
||||||
|
|
||||||
|
def search(self, uri: str) -> None:
|
||||||
|
Gio.AppInfo.launch_default_for_uri(f"{uri}{shared.win.active_game.name}")
|
||||||
|
|
||||||
|
def on_igdb_search_action(self, *_args: Any) -> None:
|
||||||
|
self.search("https://www.igdb.com/search?type=1&q=")
|
||||||
|
|
||||||
|
def on_sgdb_search_action(self, *_args: Any) -> None:
|
||||||
|
self.search("https://www.steamgriddb.com/search/grids?term=")
|
||||||
|
|
||||||
|
def on_protondb_search_action(self, *_args: Any) -> None:
|
||||||
|
self.search("https://www.protondb.com/search?q=")
|
||||||
|
|
||||||
|
def on_lutris_search_action(self, *_args: Any) -> None:
|
||||||
|
self.search("https://lutris.net/games?q=")
|
||||||
|
|
||||||
|
def on_hltb_search_action(self, *_args: Any) -> None:
|
||||||
|
self.search("https://howlongtobeat.com/?q=")
|
||||||
|
|
||||||
|
def on_quit_action(self, *_args: Any) -> None:
|
||||||
|
self.quit()
|
||||||
|
|
||||||
|
def create_actions(self, actions: set) -> None:
|
||||||
|
for action in actions:
|
||||||
|
simple_action = Gio.SimpleAction.new(action[0], None)
|
||||||
|
|
||||||
|
scope = action[2] if action[2:3] else self
|
||||||
|
simple_action.connect("activate", getattr(scope, f"on_{action[0]}_action"))
|
||||||
|
|
||||||
|
if action[1:2]:
|
||||||
|
self.set_accels_for_action(
|
||||||
|
f"app.{action[0]}" if scope == self else f"win.{action[0]}",
|
||||||
|
action[1],
|
||||||
|
)
|
||||||
|
|
||||||
|
scope.add_action(simple_action)
|
||||||
|
|
||||||
|
|
||||||
|
def main(_version: int) -> Any:
|
||||||
|
"""App entry point"""
|
||||||
|
app = CartridgesApplication()
|
||||||
|
return app.run(sys.argv)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
moduledir = join_paths(pkgdatadir, 'src')
|
moduledir = join_paths(python_dir, 'cartridges')
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
input: 'cartridges.in',
|
input: 'cartridges.in',
|
||||||
@@ -18,7 +18,7 @@ install_data(
|
|||||||
'main.py',
|
'main.py',
|
||||||
'window.py',
|
'window.py',
|
||||||
'preferences.py',
|
'preferences.py',
|
||||||
'details_window.py',
|
'details_dialog.py',
|
||||||
'game.py',
|
'game.py',
|
||||||
'game_cover.py',
|
'game_cover.py',
|
||||||
configure_file(
|
configure_file(
|
||||||
@@ -28,4 +28,4 @@ install_data(
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
install_dir: moduledir
|
install_dir: moduledir
|
||||||
)
|
)
|
||||||
@@ -21,25 +21,30 @@ import logging
|
|||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
|
from typing import Any, Callable, Optional
|
||||||
|
|
||||||
from gi.repository import Adw, Gio, GLib, Gtk
|
from gi.repository import Adw, Gio, GLib, Gtk
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.importer.sources.bottles_source import BottlesSource
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
from src.importer.sources.flatpak_source import FlatpakSource
|
from cartridges.game import Game
|
||||||
from src.importer.sources.heroic_source import HeroicSource
|
from cartridges.importer.bottles_source import BottlesSource
|
||||||
from src.importer.sources.itch_source import ItchSource
|
from cartridges.importer.flatpak_source import FlatpakSource
|
||||||
from src.importer.sources.legendary_source import LegendarySource
|
from cartridges.importer.heroic_source import HeroicSource
|
||||||
from src.importer.sources.location import UnresolvableLocationError
|
from cartridges.importer.itch_source import ItchSource
|
||||||
from src.importer.sources.lutris_source import LutrisSource
|
from cartridges.importer.legendary_source import LegendarySource
|
||||||
from src.importer.sources.source import Source
|
from cartridges.importer.location import UnresolvableLocationError
|
||||||
from src.importer.sources.steam_source import SteamSource
|
from cartridges.importer.lutris_source import LutrisSource
|
||||||
from src.utils.create_dialog import create_dialog
|
from cartridges.importer.retroarch_source import RetroarchSource
|
||||||
|
from cartridges.importer.source import Source
|
||||||
|
from cartridges.importer.steam_source import SteamSource
|
||||||
|
from cartridges.store.managers.sgdb_manager import SgdbManager
|
||||||
|
from cartridges.utils.create_dialog import create_dialog
|
||||||
|
|
||||||
|
|
||||||
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/preferences.ui")
|
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/preferences.ui")
|
||||||
class PreferencesWindow(Adw.PreferencesWindow):
|
class CartridgesPreferences(Adw.PreferencesDialog):
|
||||||
__gtype_name__ = "PreferencesWindow"
|
__gtype_name__ = "CartridgesPreferences"
|
||||||
|
|
||||||
general_page = Gtk.Template.Child()
|
general_page = Gtk.Template.Child()
|
||||||
import_page = Gtk.Template.Child()
|
import_page = Gtk.Template.Child()
|
||||||
@@ -51,6 +56,8 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
cover_launches_game_switch = Gtk.Template.Child()
|
cover_launches_game_switch = Gtk.Template.Child()
|
||||||
high_quality_images_switch = Gtk.Template.Child()
|
high_quality_images_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
|
remove_missing_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
steam_expander_row = Gtk.Template.Child()
|
steam_expander_row = Gtk.Template.Child()
|
||||||
steam_data_action_row = Gtk.Template.Child()
|
steam_data_action_row = Gtk.Template.Child()
|
||||||
steam_data_file_chooser_button = Gtk.Template.Child()
|
steam_data_file_chooser_button = Gtk.Template.Child()
|
||||||
@@ -58,8 +65,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
lutris_expander_row = Gtk.Template.Child()
|
lutris_expander_row = Gtk.Template.Child()
|
||||||
lutris_data_action_row = Gtk.Template.Child()
|
lutris_data_action_row = Gtk.Template.Child()
|
||||||
lutris_data_file_chooser_button = Gtk.Template.Child()
|
lutris_data_file_chooser_button = Gtk.Template.Child()
|
||||||
lutris_cache_action_row = Gtk.Template.Child()
|
|
||||||
lutris_cache_file_chooser_button = Gtk.Template.Child()
|
|
||||||
lutris_import_steam_switch = Gtk.Template.Child()
|
lutris_import_steam_switch = Gtk.Template.Child()
|
||||||
lutris_import_flatpak_switch = Gtk.Template.Child()
|
lutris_import_flatpak_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
@@ -68,6 +73,7 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
heroic_config_file_chooser_button = Gtk.Template.Child()
|
heroic_config_file_chooser_button = Gtk.Template.Child()
|
||||||
heroic_import_epic_switch = Gtk.Template.Child()
|
heroic_import_epic_switch = Gtk.Template.Child()
|
||||||
heroic_import_gog_switch = Gtk.Template.Child()
|
heroic_import_gog_switch = Gtk.Template.Child()
|
||||||
|
heroic_import_amazon_switch = Gtk.Template.Child()
|
||||||
heroic_import_sideload_switch = Gtk.Template.Child()
|
heroic_import_sideload_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
bottles_expander_row = Gtk.Template.Child()
|
bottles_expander_row = Gtk.Template.Child()
|
||||||
@@ -82,31 +88,39 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
legendary_config_action_row = Gtk.Template.Child()
|
legendary_config_action_row = Gtk.Template.Child()
|
||||||
legendary_config_file_chooser_button = Gtk.Template.Child()
|
legendary_config_file_chooser_button = Gtk.Template.Child()
|
||||||
|
|
||||||
|
retroarch_expander_row = Gtk.Template.Child()
|
||||||
|
retroarch_config_action_row = Gtk.Template.Child()
|
||||||
|
retroarch_config_file_chooser_button = Gtk.Template.Child()
|
||||||
|
|
||||||
flatpak_expander_row = Gtk.Template.Child()
|
flatpak_expander_row = Gtk.Template.Child()
|
||||||
flatpak_data_action_row = Gtk.Template.Child()
|
flatpak_system_data_action_row = Gtk.Template.Child()
|
||||||
flatpak_data_file_chooser_button = Gtk.Template.Child()
|
flatpak_system_data_file_chooser_button = Gtk.Template.Child()
|
||||||
|
flatpak_user_data_action_row = Gtk.Template.Child()
|
||||||
|
flatpak_user_data_file_chooser_button = Gtk.Template.Child()
|
||||||
flatpak_import_launchers_switch = Gtk.Template.Child()
|
flatpak_import_launchers_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
|
desktop_switch = Gtk.Template.Child()
|
||||||
|
|
||||||
sgdb_key_group = Gtk.Template.Child()
|
sgdb_key_group = Gtk.Template.Child()
|
||||||
sgdb_key_entry_row = Gtk.Template.Child()
|
sgdb_key_entry_row = Gtk.Template.Child()
|
||||||
sgdb_switch = Gtk.Template.Child()
|
sgdb_switch = Gtk.Template.Child()
|
||||||
sgdb_switch_row = Gtk.Template.Child()
|
|
||||||
sgdb_prefer_switch = Gtk.Template.Child()
|
sgdb_prefer_switch = Gtk.Template.Child()
|
||||||
sgdb_animated_switch = Gtk.Template.Child()
|
sgdb_animated_switch = Gtk.Template.Child()
|
||||||
|
sgdb_fetch_button = Gtk.Template.Child()
|
||||||
|
sgdb_stack = Gtk.Template.Child()
|
||||||
|
sgdb_spinner = Gtk.Template.Child()
|
||||||
|
|
||||||
danger_zone_group = Gtk.Template.Child()
|
danger_zone_group = Gtk.Template.Child()
|
||||||
reset_action_row = Gtk.Template.Child()
|
remove_all_games_list_box = Gtk.Template.Child()
|
||||||
reset_button = Gtk.Template.Child()
|
reset_list_box = Gtk.Template.Child()
|
||||||
remove_all_games_button = Gtk.Template.Child()
|
reset_group = Gtk.Template.Child()
|
||||||
|
|
||||||
removed_games = set()
|
removed_games: set[Game] = set()
|
||||||
warning_menu_buttons = {}
|
warning_menu_buttons: dict = {}
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs: Any) -> None:
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.win = shared.win
|
|
||||||
self.file_chooser = Gtk.FileDialog()
|
self.file_chooser = Gtk.FileDialog()
|
||||||
self.set_transient_for(self.win)
|
|
||||||
|
|
||||||
self.toast = Adw.Toast.new(_("All games removed"))
|
self.toast = Adw.Toast.new(_("All games removed"))
|
||||||
self.toast.set_button_label(_("Undo"))
|
self.toast.set_button_label(_("Undo"))
|
||||||
@@ -122,13 +136,12 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
self.add_controller(shortcut_controller)
|
self.add_controller(shortcut_controller)
|
||||||
|
|
||||||
# General
|
# General
|
||||||
self.remove_all_games_button.connect("clicked", self.remove_all_games)
|
self.remove_all_games_list_box.connect("row-activated", self.remove_all_games)
|
||||||
|
|
||||||
# Debug
|
# Debug
|
||||||
if shared.PROFILE == "development":
|
if shared.PROFILE == "development":
|
||||||
self.reset_action_row.set_visible(True)
|
self.reset_group.set_visible(True)
|
||||||
self.reset_button.connect("clicked", self.reset_app)
|
self.reset_list_box.connect("row-activated", self.reset_app)
|
||||||
self.set_default_size(-1, 560)
|
|
||||||
|
|
||||||
# Sources settings
|
# Sources settings
|
||||||
for source_class in (
|
for source_class in (
|
||||||
@@ -138,17 +151,18 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
ItchSource,
|
ItchSource,
|
||||||
LegendarySource,
|
LegendarySource,
|
||||||
LutrisSource,
|
LutrisSource,
|
||||||
|
RetroarchSource,
|
||||||
SteamSource,
|
SteamSource,
|
||||||
):
|
):
|
||||||
source = source_class()
|
source = source_class()
|
||||||
if not source.is_available:
|
if not source.is_available:
|
||||||
expander_row = getattr(self, f"{source.id}_expander_row")
|
expander_row = getattr(self, f"{source.source_id}_expander_row")
|
||||||
expander_row.set_visible(False)
|
expander_row.set_visible(False)
|
||||||
else:
|
else:
|
||||||
self.init_source_row(source)
|
self.init_source_row(source)
|
||||||
|
|
||||||
# SteamGridDB
|
# SteamGridDB
|
||||||
def sgdb_key_changed(*_args):
|
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())
|
||||||
|
|
||||||
self.sgdb_key_entry_row.set_text(shared.schema.get_string("sgdb-key"))
|
self.sgdb_key_entry_row.set_text(shared.schema.get_string("sgdb-key"))
|
||||||
@@ -162,37 +176,81 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def set_sgdb_sensitive(widget):
|
def update_sgdb(*_args: Any) -> None:
|
||||||
if not widget.get_text():
|
counter = 0
|
||||||
shared.schema.set_boolean("sgdb", False)
|
games_len = len(shared.store)
|
||||||
|
sgdb_manager = shared.store.managers[SgdbManager]
|
||||||
|
sgdb_manager.reset_cancellable()
|
||||||
|
|
||||||
self.sgdb_switch_row.set_sensitive(widget.get_text())
|
self.sgdb_spinner.set_spinning(True)
|
||||||
|
self.sgdb_stack.set_visible_child(self.sgdb_spinner)
|
||||||
|
|
||||||
self.sgdb_key_entry_row.connect("changed", set_sgdb_sensitive)
|
self.add_toast(download_toast := Adw.Toast.new(_("Downloading covers…")))
|
||||||
set_sgdb_sensitive(self.sgdb_key_entry_row)
|
|
||||||
|
def update_cover_callback(manager: SgdbManager) -> None:
|
||||||
|
nonlocal counter
|
||||||
|
nonlocal games_len
|
||||||
|
nonlocal download_toast
|
||||||
|
|
||||||
|
counter += 1
|
||||||
|
if counter != games_len:
|
||||||
|
return
|
||||||
|
|
||||||
|
for error in manager.collect_errors():
|
||||||
|
if isinstance(error, FriendlyError):
|
||||||
|
create_dialog(self, error.title, error.subtitle)
|
||||||
|
break
|
||||||
|
|
||||||
|
for game in shared.store:
|
||||||
|
game.update()
|
||||||
|
|
||||||
|
toast = Adw.Toast.new(_("Covers updated"))
|
||||||
|
toast.set_priority(Adw.ToastPriority.HIGH)
|
||||||
|
download_toast.dismiss()
|
||||||
|
self.add_toast(toast)
|
||||||
|
|
||||||
|
self.sgdb_spinner.set_spinning(False)
|
||||||
|
self.sgdb_stack.set_visible_child(self.sgdb_fetch_button)
|
||||||
|
|
||||||
|
for game in shared.store:
|
||||||
|
sgdb_manager.process_game(game, {}, update_cover_callback)
|
||||||
|
|
||||||
|
self.sgdb_fetch_button.connect("clicked", update_sgdb)
|
||||||
|
|
||||||
# Switches
|
# Switches
|
||||||
self.bind_switches(
|
self.bind_switches(
|
||||||
(
|
{
|
||||||
"exit-after-launch",
|
"exit-after-launch",
|
||||||
"cover-launches-game",
|
"cover-launches-game",
|
||||||
"high-quality-images",
|
"high-quality-images",
|
||||||
|
"remove-missing",
|
||||||
"lutris-import-steam",
|
"lutris-import-steam",
|
||||||
"lutris-import-flatpak",
|
"lutris-import-flatpak",
|
||||||
"heroic-import-epic",
|
"heroic-import-epic",
|
||||||
"heroic-import-gog",
|
"heroic-import-gog",
|
||||||
|
"heroic-import-amazon",
|
||||||
"heroic-import-sideload",
|
"heroic-import-sideload",
|
||||||
"flatpak-import-launchers",
|
"flatpak-import-launchers",
|
||||||
"sgdb",
|
"sgdb",
|
||||||
"sgdb-prefer",
|
"sgdb-prefer",
|
||||||
"sgdb-animated",
|
"sgdb-animated",
|
||||||
)
|
"desktop",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_switch(self, setting):
|
def set_sgdb_sensitive(widget: Adw.EntryRow) -> None:
|
||||||
|
if not widget.get_text():
|
||||||
|
shared.schema.set_boolean("sgdb", False)
|
||||||
|
|
||||||
|
self.sgdb_switch.set_sensitive(widget.get_text())
|
||||||
|
|
||||||
|
self.sgdb_key_entry_row.connect("changed", set_sgdb_sensitive)
|
||||||
|
set_sgdb_sensitive(self.sgdb_key_entry_row)
|
||||||
|
|
||||||
|
def get_switch(self, setting: str) -> Any:
|
||||||
return getattr(self, f'{setting.replace("-", "_")}_switch')
|
return getattr(self, f'{setting.replace("-", "_")}_switch')
|
||||||
|
|
||||||
def bind_switches(self, settings):
|
def bind_switches(self, settings: set[str]) -> None:
|
||||||
for setting in settings:
|
for setting in settings:
|
||||||
shared.schema.bind(
|
shared.schema.bind(
|
||||||
setting,
|
setting,
|
||||||
@@ -201,10 +259,13 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
Gio.SettingsBindFlags.DEFAULT,
|
Gio.SettingsBindFlags.DEFAULT,
|
||||||
)
|
)
|
||||||
|
|
||||||
def choose_folder(self, _widget, callback, callback_data=None):
|
def choose_folder(
|
||||||
self.file_chooser.select_folder(self.win, None, callback, callback_data)
|
self, _widget: Any, callback: Callable, callback_data: Optional[str] = None
|
||||||
|
) -> None:
|
||||||
|
self.file_chooser.select_folder(shared.win, None, callback, callback_data)
|
||||||
|
|
||||||
def undo_remove_all(self, *_args):
|
def undo_remove_all(self, *_args: Any) -> None:
|
||||||
|
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
|
||||||
game.save()
|
game.save()
|
||||||
@@ -212,22 +273,27 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
|
|
||||||
self.removed_games = set()
|
self.removed_games = set()
|
||||||
self.toast.dismiss()
|
self.toast.dismiss()
|
||||||
|
shared.win.get_application().state = shared.AppState.DEFAULT
|
||||||
|
shared.win.create_source_rows()
|
||||||
|
|
||||||
def remove_all_games(self, *_args):
|
def remove_all_games(self, *_args: Any) -> None:
|
||||||
for game in shared.store.games.values():
|
shared.win.get_application().state = shared.AppState.REMOVE_ALL_GAMES
|
||||||
|
shared.win.row_selected(None, shared.win.all_games_row_box.get_parent())
|
||||||
|
for game in shared.store:
|
||||||
if not game.removed:
|
if not game.removed:
|
||||||
self.removed_games.add(game)
|
self.removed_games.add(game)
|
||||||
|
|
||||||
game.removed = True
|
game.removed = True
|
||||||
game.save()
|
game.save()
|
||||||
game.update()
|
game.update()
|
||||||
|
|
||||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
if shared.win.navigation_view.get_visible_page() == shared.win.details_page:
|
||||||
self.win.on_go_back_action()
|
shared.win.navigation_view.pop()
|
||||||
|
|
||||||
self.add_toast(self.toast)
|
self.add_toast(self.toast)
|
||||||
|
shared.win.get_application().state = shared.AppState.DEFAULT
|
||||||
|
shared.win.create_source_rows()
|
||||||
|
|
||||||
def reset_app(self, *_args):
|
def reset_app(self, *_args: Any) -> None:
|
||||||
rmtree(shared.data_dir / "cartridges", True)
|
rmtree(shared.data_dir / "cartridges", True)
|
||||||
rmtree(shared.config_dir / "cartridges", True)
|
rmtree(shared.config_dir / "cartridges", True)
|
||||||
rmtree(shared.cache_dir / "cartridges", True)
|
rmtree(shared.cache_dir / "cartridges", True)
|
||||||
@@ -245,46 +311,44 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
|
|
||||||
shared.win.get_application().quit()
|
shared.win.get_application().quit()
|
||||||
|
|
||||||
def update_source_action_row_paths(self, source):
|
def update_source_action_row_paths(self, source: Source) -> None:
|
||||||
"""Set the dir subtitle for a source's action rows"""
|
"""Set the dir subtitle for a source's action rows"""
|
||||||
for location in ("data", "config", "cache"):
|
for location_name, location in source.locations._asdict().items():
|
||||||
# Get the action row to subtitle
|
# Get the action row to subtitle
|
||||||
action_row = getattr(self, f"{source.id}_{location}_action_row", None)
|
action_row = getattr(
|
||||||
|
self, f"{source.source_id}_{location_name}_action_row", None
|
||||||
|
)
|
||||||
if not action_row:
|
if not action_row:
|
||||||
continue
|
continue
|
||||||
|
path = Path(shared.schema.get_string(location.schema_key)).expanduser()
|
||||||
infix = "-cache" if location == "cache" else ""
|
|
||||||
key = f"{source.id}{infix}-location"
|
|
||||||
path = Path(shared.schema.get_string(key)).expanduser()
|
|
||||||
|
|
||||||
# Remove the path prefix if picked via Flatpak portal
|
# Remove the path prefix if picked via Flatpak portal
|
||||||
subtitle = re.sub("/run/user/\\d*/doc/.*/", "", str(path))
|
subtitle = re.sub("/run/user/\\d*/doc/.*/", "", str(path))
|
||||||
action_row.set_subtitle(subtitle)
|
action_row.set_subtitle(subtitle)
|
||||||
|
|
||||||
def resolve_locations(self, source):
|
def resolve_locations(self, source: Source) -> None:
|
||||||
"""Resolve locations and add a warning if location cannot be found"""
|
"""Resolve locations and add a warning if location cannot be found"""
|
||||||
|
|
||||||
def clear_warning_selection(_widget, label):
|
for location_name, location in source.locations._asdict().items():
|
||||||
label.select_region(-1, -1)
|
action_row = getattr(
|
||||||
|
self, f"{source.source_id}_{location_name}_action_row", None
|
||||||
for location_name in ("data", "config", "cache"):
|
)
|
||||||
action_row = getattr(self, f"{source.id}_{location_name}_action_row", None)
|
|
||||||
if not action_row:
|
if not action_row:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
getattr(source, f"{location_name}_location", None).resolve()
|
location.resolve()
|
||||||
|
|
||||||
except UnresolvableLocationError:
|
except UnresolvableLocationError:
|
||||||
|
title = _("Installation Not Found")
|
||||||
|
description = _("Select a valid directory.")
|
||||||
|
format_start = '<span rise="12pt"><b><big>'
|
||||||
|
format_end = "</big></b></span>\n"
|
||||||
|
|
||||||
popover = Gtk.Popover(
|
popover = Gtk.Popover(
|
||||||
|
focusable=True,
|
||||||
child=(
|
child=(
|
||||||
label := Gtk.Label(
|
Gtk.Label(
|
||||||
label=(
|
label=format_start + title + format_end + description,
|
||||||
'<span rise="12pt"><b><big>'
|
|
||||||
+ _("Installation Not Found")
|
|
||||||
+ "</big></b></span>\n"
|
|
||||||
+ _("Select a valid directory.")
|
|
||||||
),
|
|
||||||
use_markup=True,
|
use_markup=True,
|
||||||
wrap=True,
|
wrap=True,
|
||||||
max_width_chars=50,
|
max_width_chars=50,
|
||||||
@@ -295,95 +359,88 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
|||||||
margin_bottom=9,
|
margin_bottom=9,
|
||||||
margin_start=12,
|
margin_start=12,
|
||||||
margin_end=12,
|
margin_end=12,
|
||||||
selectable=True,
|
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
popover.connect("show", clear_warning_selection, label)
|
popover.update_property(
|
||||||
|
(Gtk.AccessibleProperty.LABEL,), (title + description,)
|
||||||
|
)
|
||||||
|
|
||||||
|
def set_a11y_label(widget: Gtk.Popover) -> None:
|
||||||
|
self.set_focus(widget)
|
||||||
|
|
||||||
|
popover.connect("show", set_a11y_label)
|
||||||
|
|
||||||
menu_button = Gtk.MenuButton(
|
menu_button = Gtk.MenuButton(
|
||||||
icon_name="dialog-warning-symbolic",
|
icon_name="dialog-warning-symbolic",
|
||||||
valign=Gtk.Align.CENTER,
|
valign=Gtk.Align.CENTER,
|
||||||
popover=popover,
|
popover=popover,
|
||||||
|
tooltip_text=_("Warning"),
|
||||||
)
|
)
|
||||||
menu_button.add_css_class("warning")
|
menu_button.add_css_class("warning")
|
||||||
|
|
||||||
action_row.add_prefix(menu_button)
|
action_row.add_prefix(menu_button)
|
||||||
self.warning_menu_buttons[source.id] = menu_button
|
self.warning_menu_buttons[source.source_id] = menu_button
|
||||||
|
|
||||||
def init_source_row(self, source: Source):
|
def init_source_row(self, source: Source) -> None:
|
||||||
"""Initialize a preference row for a source class"""
|
"""Initialize a preference row for a source class"""
|
||||||
|
|
||||||
def set_dir(_widget, result, location_name):
|
def set_dir(_widget: Any, result: Gio.Task, location_name: str) -> None:
|
||||||
"""Callback called when a dir picker button is clicked"""
|
"""Callback called when a dir picker button is clicked"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
path = Path(self.file_chooser.select_folder_finish(result).get_path())
|
path = Path(self.file_chooser.select_folder_finish(result).get_path())
|
||||||
except GLib.GError:
|
except GLib.Error:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Good picked location
|
# Good picked location
|
||||||
location = getattr(source, f"{location_name}_location")
|
location = source.locations._asdict()[location_name]
|
||||||
if location.check_candidate(path):
|
if location.check_candidate(path):
|
||||||
# Set the schema
|
shared.schema.set_string(location.schema_key, str(path))
|
||||||
infix = "-cache" if location_name == "cache" else ""
|
|
||||||
key = f"{source.id}{infix}-location"
|
|
||||||
value = str(path)
|
|
||||||
shared.schema.set_string(key, value)
|
|
||||||
# Update the row
|
|
||||||
self.update_source_action_row_paths(source)
|
self.update_source_action_row_paths(source)
|
||||||
|
if self.warning_menu_buttons.get(source.source_id):
|
||||||
if self.warning_menu_buttons.get(source.id):
|
|
||||||
action_row = getattr(
|
action_row = getattr(
|
||||||
self, f"{source.id}_{location_name}_action_row", None
|
self, f"{source.source_id}_{location_name}_action_row", None
|
||||||
)
|
)
|
||||||
action_row.remove(self.warning_menu_buttons[source.id])
|
action_row.remove( # type: ignore
|
||||||
self.warning_menu_buttons.pop(source.id)
|
self.warning_menu_buttons[source.source_id]
|
||||||
|
)
|
||||||
logging.debug("User-set value for schema key %s: %s", key, value)
|
self.warning_menu_buttons.pop(source.source_id)
|
||||||
|
logging.debug("User-set value for %s is %s", location.schema_key, path)
|
||||||
|
|
||||||
# Bad picked location, inform user
|
# Bad picked location, inform user
|
||||||
else:
|
else:
|
||||||
title = _("Invalid Directory")
|
title = _("Invalid Directory")
|
||||||
match location_name:
|
|
||||||
case "cache":
|
|
||||||
# The variable is the name of the source
|
|
||||||
subtitle_format = _("Select the {} cache directory.")
|
|
||||||
case "config":
|
|
||||||
# The variable is the name of the source
|
|
||||||
subtitle_format = _("Select the {} configuration directory.")
|
|
||||||
case "data":
|
|
||||||
# The variable is the name of the source
|
|
||||||
subtitle_format = _("Select the {} data directory.")
|
|
||||||
dialog = create_dialog(
|
dialog = create_dialog(
|
||||||
self,
|
self,
|
||||||
title,
|
title,
|
||||||
subtitle_format.format(source.name),
|
location.invalid_subtitle.format(source.name),
|
||||||
"choose_folder",
|
"choose_folder",
|
||||||
_("Set Location"),
|
_("Set Location"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_response(widget, response):
|
def on_response(widget: Any, response: str) -> None:
|
||||||
if response == "choose_folder":
|
if response == "choose_folder":
|
||||||
self.choose_folder(widget, set_dir, location_name)
|
self.choose_folder(widget, set_dir, location_name)
|
||||||
|
|
||||||
dialog.connect("response", on_response)
|
dialog.connect("response", on_response)
|
||||||
|
|
||||||
# Bind expander row activation to source being enabled
|
# Bind expander row activation to source being enabled
|
||||||
expander_row = getattr(self, f"{source.id}_expander_row")
|
expander_row = getattr(self, f"{source.source_id}_expander_row")
|
||||||
shared.schema.bind(
|
shared.schema.bind(
|
||||||
source.id,
|
source.source_id,
|
||||||
expander_row,
|
expander_row,
|
||||||
"enable-expansion",
|
"enable-expansion",
|
||||||
Gio.SettingsBindFlags.DEFAULT,
|
Gio.SettingsBindFlags.DEFAULT,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Connect dir picker buttons
|
# Connect dir picker buttons
|
||||||
for location in ("data", "config", "cache"):
|
for location_name in source.locations._asdict():
|
||||||
button = getattr(self, f"{source.id}_{location}_file_chooser_button", None)
|
button = getattr(
|
||||||
|
self, f"{source.source_id}_{location_name}_file_chooser_button", None
|
||||||
|
)
|
||||||
if button is not None:
|
if button is not None:
|
||||||
button.connect("clicked", self.choose_folder, set_dir, location)
|
button.connect("clicked", self.choose_folder, set_dir, location_name)
|
||||||
|
|
||||||
# Set the source row subtitles
|
# Set the source row subtitles
|
||||||
self.resolve_locations(source)
|
self.resolve_locations(source)
|
||||||
@@ -17,39 +17,66 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import os
|
from enum import IntEnum, auto
|
||||||
|
from os import getenv
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from gi.repository import Gdk, Gio, GLib
|
from gi.repository import Gdk, Gio, GLib
|
||||||
|
|
||||||
|
|
||||||
|
class AppState(IntEnum):
|
||||||
|
DEFAULT = auto()
|
||||||
|
LOAD_FROM_DISK = auto()
|
||||||
|
IMPORT = auto()
|
||||||
|
REMOVE_ALL_GAMES = auto()
|
||||||
|
UNDO_REMOVE_ALL_GAMES = auto()
|
||||||
|
|
||||||
|
|
||||||
APP_ID = "@APP_ID@"
|
APP_ID = "@APP_ID@"
|
||||||
VERSION = "@VERSION@"
|
VERSION = "@VERSION@"
|
||||||
PREFIX = "@PREFIX@"
|
PREFIX = "@PREFIX@"
|
||||||
PROFILE = "@PROFILE@"
|
PROFILE = "@PROFILE@"
|
||||||
|
TIFF_COMPRESSION = "@TIFF_COMPRESSION@"
|
||||||
SPEC_VERSION = 1.5 # The version of the game_id.json spec
|
SPEC_VERSION = 1.5 # The version of the game_id.json spec
|
||||||
|
|
||||||
schema = Gio.Settings.new(APP_ID)
|
schema = Gio.Settings.new(APP_ID)
|
||||||
state_schema = Gio.Settings.new(APP_ID + ".State")
|
state_schema = Gio.Settings.new(APP_ID + ".State")
|
||||||
|
|
||||||
home = Path.home()
|
home = Path.home()
|
||||||
|
|
||||||
data_dir = Path(GLib.get_user_data_dir())
|
data_dir = Path(GLib.get_user_data_dir())
|
||||||
|
host_data_dir = Path(getenv("HOST_XDG_DATA_HOME", Path.home() / ".local" / "share"))
|
||||||
|
|
||||||
config_dir = Path(GLib.get_user_config_dir())
|
config_dir = Path(GLib.get_user_config_dir())
|
||||||
cache_dir = Path(GLib.get_user_config_dir())
|
host_config_dir = Path(getenv("HOST_XDG_CONFIG_HOME", Path.home() / ".config"))
|
||||||
|
|
||||||
|
cache_dir = Path(GLib.get_user_cache_dir())
|
||||||
|
host_cache_dir = Path(getenv("HOST_XDG_CACHE_HOME", Path.home() / ".cache"))
|
||||||
|
|
||||||
flatpak_dir = home / ".var" / "app"
|
flatpak_dir = home / ".var" / "app"
|
||||||
|
|
||||||
games_dir = data_dir / "cartridges" / "games"
|
games_dir = data_dir / "cartridges" / "games"
|
||||||
covers_dir = data_dir / "cartridges" / "covers"
|
covers_dir = data_dir / "cartridges" / "covers"
|
||||||
|
|
||||||
appdata_dir = Path(os.getenv("appdata") or "C:\\Users\\Default\\AppData\\Roaming")
|
appdata_dir = Path(getenv("appdata") or r"C:\Users\Default\AppData\Roaming")
|
||||||
programfiles32_dir = Path(os.getenv("programfiles(x86)") or "C:\\Program Files (x86)")
|
local_appdata_dir = Path(
|
||||||
|
getenv("csidl_local_appdata") or r"C:\Users\Default\AppData\Local"
|
||||||
scale_factor = max(
|
|
||||||
monitor.get_scale_factor() for monitor in Gdk.Display.get_default().get_monitors()
|
|
||||||
)
|
)
|
||||||
image_size = (200 * scale_factor, 300 * scale_factor)
|
programfiles32_dir = Path(getenv("programfiles(x86)") or r"C:\Program Files (x86)")
|
||||||
|
|
||||||
|
try:
|
||||||
|
scale_factor = max(
|
||||||
|
monitor.get_scale_factor()
|
||||||
|
for monitor in Gdk.Display.get_default().get_monitors()
|
||||||
|
)
|
||||||
|
except AttributeError: # If shared.py is imported by the search provider
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
image_size = (200 * scale_factor, 300 * scale_factor)
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
win = None
|
win = None
|
||||||
importer = None
|
importer = None
|
||||||
|
import_time = None
|
||||||
store = None
|
store = None
|
||||||
log_files = None
|
log_files = None
|
||||||
@@ -17,13 +17,12 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from typing import Callable, Any
|
from typing import Any, Callable
|
||||||
|
|
||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.store.managers.manager import Manager
|
from cartridges.store.managers.manager import Manager
|
||||||
from src.utils.task import Task
|
|
||||||
|
|
||||||
|
|
||||||
class AsyncManager(Manager):
|
class AsyncManager(Manager):
|
||||||
@@ -49,14 +48,13 @@ class AsyncManager(Manager):
|
|||||||
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Create a task to process the game in a separate thread"""
|
"""Create a task to process the game in a separate thread"""
|
||||||
task = Task.new(None, self.cancellable, self._task_callback, (callback,))
|
task = Gio.Task.new(None, self.cancellable, self._task_callback, (callback,))
|
||||||
task.set_task_data((game, additional_data))
|
task.run_in_thread(lambda *_: self._task_thread_func((game, additional_data)))
|
||||||
task.run_in_thread(self._task_thread_func)
|
|
||||||
|
|
||||||
def _task_thread_func(self, _task, _source_object, data, _cancellable):
|
def _task_thread_func(self, data):
|
||||||
"""Task thread entry point"""
|
"""Task thread entry point"""
|
||||||
game, additional_data, *_rest = data
|
game, additional_data, *_rest = data
|
||||||
self.execute_resilient_manager_logic(game, additional_data)
|
self.run(game, additional_data)
|
||||||
|
|
||||||
def _task_callback(self, _source_object, _result, data):
|
def _task_callback(self, _source_object, _result, data):
|
||||||
"""Method run after the task is done"""
|
"""Method run after the task is done"""
|
||||||
198
cartridges/store/managers/cover_manager.py
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
# local_cover_manager.py
|
||||||
|
#
|
||||||
|
# Copyright 2023 Geoffrey Coulaud
|
||||||
|
# Copyright 2023 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 NamedTuple
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from gi.repository import GdkPixbuf, Gio
|
||||||
|
from requests.exceptions import HTTPError, SSLError
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.store.managers.manager import Manager
|
||||||
|
from cartridges.store.managers.steam_api_manager import SteamAPIManager
|
||||||
|
from cartridges.utils.save_cover import convert_cover, save_cover
|
||||||
|
|
||||||
|
|
||||||
|
class ImageSize(NamedTuple):
|
||||||
|
width: float = 0
|
||||||
|
height: float = 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def aspect_ratio(self) -> float:
|
||||||
|
return self.width / self.height
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.width}x{self.height}"
|
||||||
|
|
||||||
|
def __mul__(self, scale: float | int) -> "ImageSize":
|
||||||
|
return ImageSize(
|
||||||
|
self.width * scale,
|
||||||
|
self.height * scale,
|
||||||
|
)
|
||||||
|
|
||||||
|
def __truediv__(self, divisor: float | int) -> "ImageSize":
|
||||||
|
return self * (1 / divisor)
|
||||||
|
|
||||||
|
def __add__(self, other_size: "ImageSize") -> "ImageSize":
|
||||||
|
return ImageSize(
|
||||||
|
self.width + other_size.width,
|
||||||
|
self.height + other_size.height,
|
||||||
|
)
|
||||||
|
|
||||||
|
def __sub__(self, other_size: "ImageSize") -> "ImageSize":
|
||||||
|
return self + (other_size * -1)
|
||||||
|
|
||||||
|
def element_wise_div(self, other_size: "ImageSize") -> "ImageSize":
|
||||||
|
"""Divide every element of self by the equivalent in the other size"""
|
||||||
|
return ImageSize(
|
||||||
|
self.width / other_size.width,
|
||||||
|
self.height / other_size.height,
|
||||||
|
)
|
||||||
|
|
||||||
|
def element_wise_mul(self, other_size: "ImageSize") -> "ImageSize":
|
||||||
|
"""Multiply every element of self by the equivalent in the other size"""
|
||||||
|
return ImageSize(
|
||||||
|
self.width * other_size.width,
|
||||||
|
self.height * other_size.height,
|
||||||
|
)
|
||||||
|
|
||||||
|
def invert(self) -> "ImageSize":
|
||||||
|
"""Invert the element of self"""
|
||||||
|
return ImageSize(1, 1).element_wise_div(self)
|
||||||
|
|
||||||
|
|
||||||
|
class CoverManager(Manager):
|
||||||
|
"""
|
||||||
|
Manager in charge of adding the cover image of the game
|
||||||
|
|
||||||
|
Order of priority is:
|
||||||
|
1. local cover
|
||||||
|
2. icon cover
|
||||||
|
3. online cover
|
||||||
|
"""
|
||||||
|
|
||||||
|
run_after = (SteamAPIManager,)
|
||||||
|
retryable_on = (HTTPError, SSLError, ConnectionError)
|
||||||
|
|
||||||
|
def download_image(self, url: str) -> Path:
|
||||||
|
image_file = Gio.File.new_tmp()[0]
|
||||||
|
path = Path(image_file.get_path())
|
||||||
|
with requests.get(url, timeout=5) as cover:
|
||||||
|
cover.raise_for_status()
|
||||||
|
path.write_bytes(cover.content)
|
||||||
|
return path
|
||||||
|
|
||||||
|
def is_stretchable(self, source_size: ImageSize, cover_size: ImageSize) -> bool:
|
||||||
|
is_taller = source_size.aspect_ratio < cover_size.aspect_ratio
|
||||||
|
if is_taller:
|
||||||
|
return True
|
||||||
|
max_stretch = 0.12
|
||||||
|
resized_height = (1 / source_size.aspect_ratio) * cover_size.width
|
||||||
|
stretch = 1 - (resized_height / cover_size.height)
|
||||||
|
return stretch <= max_stretch
|
||||||
|
|
||||||
|
def composite_cover(
|
||||||
|
self,
|
||||||
|
image_path: Path,
|
||||||
|
scale: float = 1,
|
||||||
|
blur_size: ImageSize = ImageSize(2, 2),
|
||||||
|
) -> GdkPixbuf.Pixbuf:
|
||||||
|
"""
|
||||||
|
Return the image composited with a background blur.
|
||||||
|
If the image is stretchable, just stretch it.
|
||||||
|
|
||||||
|
:param path: Path where the source image is located
|
||||||
|
:param scale:
|
||||||
|
Scale of the smalled image side
|
||||||
|
compared to the corresponding side in the cover
|
||||||
|
:param blur_size: Size of the downscaled image used for the blur
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Load source image
|
||||||
|
source = GdkPixbuf.Pixbuf.new_from_file(
|
||||||
|
str(convert_cover(image_path, resize=False))
|
||||||
|
)
|
||||||
|
source_size = ImageSize(source.get_width(), source.get_height())
|
||||||
|
cover_size = ImageSize._make(shared.image_size)
|
||||||
|
|
||||||
|
# Stretch if possible
|
||||||
|
if scale == 1 and self.is_stretchable(source_size, cover_size):
|
||||||
|
return source
|
||||||
|
|
||||||
|
# Create the blurred cover background
|
||||||
|
# fmt: off
|
||||||
|
cover = (
|
||||||
|
source
|
||||||
|
.scale_simple(*blur_size, GdkPixbuf.InterpType.BILINEAR)
|
||||||
|
.scale_simple(*cover_size, GdkPixbuf.InterpType.BILINEAR)
|
||||||
|
)
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
# Scale to fit, apply scaling, then center
|
||||||
|
uniform_scale = scale * min(cover_size.element_wise_div(source_size))
|
||||||
|
source_in_cover_size = source_size * uniform_scale
|
||||||
|
source_in_cover_position = (cover_size - source_in_cover_size) / 2
|
||||||
|
|
||||||
|
# Center the scaled source image in the cover
|
||||||
|
source.composite(
|
||||||
|
cover,
|
||||||
|
*source_in_cover_position,
|
||||||
|
*source_in_cover_size,
|
||||||
|
*source_in_cover_position,
|
||||||
|
uniform_scale,
|
||||||
|
uniform_scale,
|
||||||
|
GdkPixbuf.InterpType.BILINEAR,
|
||||||
|
255,
|
||||||
|
)
|
||||||
|
return cover
|
||||||
|
|
||||||
|
def main(self, game: Game, additional_data: dict) -> None:
|
||||||
|
if game.blacklisted:
|
||||||
|
return
|
||||||
|
for key in (
|
||||||
|
"local_image_path",
|
||||||
|
"local_icon_path",
|
||||||
|
"online_cover_url",
|
||||||
|
):
|
||||||
|
# Get an image path
|
||||||
|
if not (value := additional_data.get(key)):
|
||||||
|
continue
|
||||||
|
if key == "online_cover_url":
|
||||||
|
image_path = self.download_image(value)
|
||||||
|
else:
|
||||||
|
image_path = Path(value)
|
||||||
|
if not image_path.is_file():
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Icon cover
|
||||||
|
composite_kwargs = {}
|
||||||
|
|
||||||
|
if key == "local_icon_path":
|
||||||
|
composite_kwargs["scale"] = 0.7
|
||||||
|
composite_kwargs["blur_size"] = ImageSize(1, 2)
|
||||||
|
|
||||||
|
save_cover(
|
||||||
|
game.game_id,
|
||||||
|
convert_cover(
|
||||||
|
pixbuf=self.composite_cover(image_path, **composite_kwargs)
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -17,20 +17,21 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from src.game import Game
|
from cartridges import shared
|
||||||
from src.game_cover import GameCover
|
from cartridges.game import Game
|
||||||
from src.store.managers.manager import Manager
|
from cartridges.game_cover import GameCover
|
||||||
from src.store.managers.sgdb_manager import SGDBManager
|
from cartridges.store.managers.manager import Manager
|
||||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
from cartridges.store.managers.sgdb_manager import SgdbManager
|
||||||
|
from cartridges.store.managers.steam_api_manager import SteamAPIManager
|
||||||
|
|
||||||
|
|
||||||
class DisplayManager(Manager):
|
class DisplayManager(Manager):
|
||||||
"""Manager in charge of adding a game to the UI"""
|
"""Manager in charge of adding a game to the UI"""
|
||||||
|
|
||||||
run_after = (SteamAPIManager, SGDBManager)
|
run_after = (SteamAPIManager, SgdbManager)
|
||||||
signals = {"update-ready"}
|
signals = {"update-ready"}
|
||||||
|
|
||||||
def manager_logic(self, game: Game, _additional_data: dict) -> None:
|
def main(self, game: Game, _additional_data: dict) -> None:
|
||||||
if game.get_parent():
|
if game.get_parent():
|
||||||
game.get_parent().get_parent().remove(game)
|
game.get_parent().get_parent().remove(game)
|
||||||
if game.get_parent():
|
if game.get_parent():
|
||||||
@@ -46,27 +47,30 @@ class DisplayManager(Manager):
|
|||||||
"notify::visible", game.toggle_play, None
|
"notify::visible", game.toggle_play, None
|
||||||
)
|
)
|
||||||
game.menu_button.get_popover().connect(
|
game.menu_button.get_popover().connect(
|
||||||
"notify::visible", game.win.set_active_game, game
|
"notify::visible", shared.win.set_active_game, game
|
||||||
)
|
)
|
||||||
|
|
||||||
if game.game_id in game.win.game_covers:
|
if game.game_id in shared.win.game_covers:
|
||||||
game.game_cover = game.win.game_covers[game.game_id]
|
game.game_cover = shared.win.game_covers[game.game_id]
|
||||||
game.game_cover.add_picture(game.cover)
|
game.game_cover.add_picture(game.cover)
|
||||||
else:
|
else:
|
||||||
game.game_cover = GameCover({game.cover}, game.get_cover_path())
|
game.game_cover = GameCover({game.cover}, game.get_cover_path())
|
||||||
game.win.game_covers[game.game_id] = game.game_cover
|
shared.win.game_covers[game.game_id] = game.game_cover
|
||||||
|
|
||||||
if (
|
if (
|
||||||
game.win.stack.get_visible_child() == game.win.details_view
|
shared.win.navigation_view.get_visible_page() == shared.win.details_page
|
||||||
and game.win.active_game == game
|
and shared.win.active_game == game
|
||||||
):
|
):
|
||||||
game.win.show_details_view(game)
|
shared.win.show_details_page(game)
|
||||||
|
|
||||||
if not game.removed and not game.blacklisted:
|
if not game.removed and not game.blacklisted:
|
||||||
if game.hidden:
|
if game.hidden:
|
||||||
game.win.hidden_library.append(game)
|
shared.win.hidden_library.append(game)
|
||||||
else:
|
else:
|
||||||
game.win.library.append(game)
|
shared.win.library.append(game)
|
||||||
game.get_parent().set_focusable(False)
|
game.get_parent().set_focusable(False)
|
||||||
|
|
||||||
game.win.set_library_child()
|
shared.win.set_library_child()
|
||||||
|
|
||||||
|
if shared.win.get_application().state == shared.AppState.DEFAULT:
|
||||||
|
shared.win.create_source_rows()
|
||||||
@@ -19,10 +19,10 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.store.managers.async_manager import AsyncManager
|
from cartridges.store.managers.async_manager import AsyncManager
|
||||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
from cartridges.store.managers.steam_api_manager import SteamAPIManager
|
||||||
|
|
||||||
|
|
||||||
class FileManager(AsyncManager):
|
class FileManager(AsyncManager):
|
||||||
@@ -31,7 +31,7 @@ class FileManager(AsyncManager):
|
|||||||
run_after = (SteamAPIManager,)
|
run_after = (SteamAPIManager,)
|
||||||
signals = {"save-ready"}
|
signals = {"save-ready"}
|
||||||
|
|
||||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
def main(self, game: Game, additional_data: dict) -> None:
|
||||||
if additional_data.get("skip_save"): # Skip saving when loading games from disk
|
if additional_data.get("skip_save"): # Skip saving when loading games from disk
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class FileManager(AsyncManager):
|
|||||||
|
|
||||||
json.dump(
|
json.dump(
|
||||||
{attr: getattr(game, attr) for attr in attrs if attr},
|
{attr: getattr(game, attr) for attr in attrs if attr},
|
||||||
(shared.games_dir / f"{game.game_id}.json").open("w"),
|
(shared.games_dir / f"{game.game_id}.json").open("w", encoding="utf-8"),
|
||||||
indent=4,
|
indent=4,
|
||||||
sort_keys=True,
|
sort_keys=True,
|
||||||
)
|
)
|
||||||
@@ -22,9 +22,9 @@ from abc import abstractmethod
|
|||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import Any, Callable, Container
|
from typing import Any, Callable, Container
|
||||||
|
|
||||||
from src.errors.error_producer import ErrorProducer
|
from cartridges.errors.error_producer import ErrorProducer
|
||||||
from src.errors.friendly_error import FriendlyError
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
|
|
||||||
|
|
||||||
class Manager(ErrorProducer):
|
class Manager(ErrorProducer):
|
||||||
@@ -46,11 +46,11 @@ class Manager(ErrorProducer):
|
|||||||
max_tries: int = 3
|
max_tries: int = 3
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self) -> str:
|
||||||
return type(self).__name__
|
return type(self).__name__
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
def main(self, game: Game, additional_data: dict) -> None:
|
||||||
"""
|
"""
|
||||||
Manager specific logic triggered by the run method
|
Manager specific logic triggered by the run method
|
||||||
* Implemented by final child classes
|
* Implemented by final child classes
|
||||||
@@ -59,13 +59,13 @@ class Manager(ErrorProducer):
|
|||||||
* May raise other exceptions that will be reported
|
* May raise other exceptions that will be reported
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def execute_resilient_manager_logic(self, game: Game, additional_data: dict):
|
def run(self, game: Game, additional_data: dict) -> None:
|
||||||
"""Handle errors (retry, ignore or raise) that occur in the manager logic"""
|
"""Handle errors (retry, ignore or raise) that occur in the manager logic"""
|
||||||
|
|
||||||
# Keep track of the number of tries
|
# Keep track of the number of tries
|
||||||
tries = 1
|
tries = 1
|
||||||
|
|
||||||
def handle_error(error: Exception):
|
def handle_error(error: Exception) -> None:
|
||||||
nonlocal tries
|
nonlocal tries
|
||||||
|
|
||||||
# If FriendlyError, handle its cause instead
|
# If FriendlyError, handle its cause instead
|
||||||
@@ -83,11 +83,11 @@ class Manager(ErrorProducer):
|
|||||||
retrying_format = "Retrying %s in %s for %s"
|
retrying_format = "Retrying %s in %s for %s"
|
||||||
unretryable_format = "Unretryable %s in %s for %s"
|
unretryable_format = "Unretryable %s in %s for %s"
|
||||||
|
|
||||||
if error in self.continue_on:
|
if type(error) in self.continue_on:
|
||||||
# Handle skippable errors (skip silently)
|
# Handle skippable errors (skip silently)
|
||||||
return
|
return
|
||||||
|
|
||||||
if error in self.retryable_on:
|
if type(error) in self.retryable_on:
|
||||||
if tries > self.max_tries:
|
if tries > self.max_tries:
|
||||||
# Handle being out of retries
|
# Handle being out of retries
|
||||||
logging.error(out_of_retries_format, *log_args)
|
logging.error(out_of_retries_format, *log_args)
|
||||||
@@ -104,9 +104,9 @@ class Manager(ErrorProducer):
|
|||||||
logging.error(unretryable_format, *log_args, exc_info=error)
|
logging.error(unretryable_format, *log_args, exc_info=error)
|
||||||
self.report_error(base_error)
|
self.report_error(base_error)
|
||||||
|
|
||||||
def try_manager_logic():
|
def try_manager_logic() -> None:
|
||||||
try:
|
try:
|
||||||
self.manager_logic(game, additional_data)
|
self.main(game, additional_data)
|
||||||
except Exception as error: # pylint: disable=broad-exception-caught
|
except Exception as error: # pylint: disable=broad-exception-caught
|
||||||
handle_error(error)
|
handle_error(error)
|
||||||
|
|
||||||
@@ -116,5 +116,5 @@ class Manager(ErrorProducer):
|
|||||||
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Pass the game through the manager"""
|
"""Pass the game through the manager"""
|
||||||
self.execute_resilient_manager_logic(game, additional_data)
|
self.run(game, additional_data)
|
||||||
callback(self)
|
callback(self)
|
||||||
@@ -21,26 +21,25 @@ from json import JSONDecodeError
|
|||||||
|
|
||||||
from requests.exceptions import HTTPError, SSLError
|
from requests.exceptions import HTTPError, SSLError
|
||||||
|
|
||||||
from src.errors.friendly_error import FriendlyError
|
from cartridges.errors.friendly_error import FriendlyError
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.store.managers.async_manager import AsyncManager
|
from cartridges.store.managers.async_manager import AsyncManager
|
||||||
from src.store.managers.local_cover_manager import LocalCoverManager
|
from cartridges.store.managers.cover_manager import CoverManager
|
||||||
from src.store.managers.online_cover_manager import OnlineCoverManager
|
from cartridges.store.managers.steam_api_manager import SteamAPIManager
|
||||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
from cartridges.utils.steamgriddb import SgdbAuthError, SgdbHelper
|
||||||
from src.utils.steamgriddb import SGDBAuthError, SGDBHelper
|
|
||||||
|
|
||||||
|
|
||||||
class SGDBManager(AsyncManager):
|
class SgdbManager(AsyncManager):
|
||||||
"""Manager in charge of downloading a game's cover from steamgriddb"""
|
"""Manager in charge of downloading a game's cover from SteamGridDB"""
|
||||||
|
|
||||||
run_after = (SteamAPIManager, LocalCoverManager, OnlineCoverManager)
|
run_after = (SteamAPIManager, CoverManager)
|
||||||
retryable_on = (HTTPError, SSLError, ConnectionError, JSONDecodeError)
|
retryable_on = (HTTPError, SSLError, ConnectionError, JSONDecodeError)
|
||||||
|
|
||||||
def manager_logic(self, game: Game, _additional_data: dict) -> None:
|
def main(self, game: Game, _additional_data: dict) -> None:
|
||||||
try:
|
try:
|
||||||
sgdb = SGDBHelper()
|
sgdb = SgdbHelper()
|
||||||
sgdb.conditionaly_update_cover(game)
|
sgdb.conditionaly_update_cover(game)
|
||||||
except SGDBAuthError as error:
|
except SgdbAuthError as error:
|
||||||
# If invalid auth, cancel all SGDBManager tasks
|
# If invalid auth, cancel all SGDBManager tasks
|
||||||
self.cancellable.cancel()
|
self.cancellable.cancel()
|
||||||
raise FriendlyError(
|
raise FriendlyError(
|
||||||
@@ -18,12 +18,13 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from requests.exceptions import HTTPError, SSLError
|
from requests.exceptions import HTTPError, SSLError
|
||||||
|
from urllib3.exceptions import ConnectionError as Urllib3ConnectionError
|
||||||
|
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.store.managers.async_manager import AsyncManager
|
from cartridges.store.managers.async_manager import AsyncManager
|
||||||
from src.utils.steam import (
|
from cartridges.utils.steam import (
|
||||||
SteamGameNotFoundError,
|
|
||||||
SteamAPIHelper,
|
SteamAPIHelper,
|
||||||
|
SteamGameNotFoundError,
|
||||||
SteamNotAGameError,
|
SteamNotAGameError,
|
||||||
SteamRateLimiter,
|
SteamRateLimiter,
|
||||||
)
|
)
|
||||||
@@ -32,7 +33,7 @@ from src.utils.steam import (
|
|||||||
class SteamAPIManager(AsyncManager):
|
class SteamAPIManager(AsyncManager):
|
||||||
"""Manager in charge of completing a game's data from the Steam API"""
|
"""Manager in charge of completing a game's data from the Steam API"""
|
||||||
|
|
||||||
retryable_on = (HTTPError, SSLError, ConnectionError)
|
retryable_on = (HTTPError, SSLError, Urllib3ConnectionError)
|
||||||
|
|
||||||
steam_api_helper: SteamAPIHelper = None
|
steam_api_helper: SteamAPIHelper = None
|
||||||
steam_rate_limiter: SteamRateLimiter = None
|
steam_rate_limiter: SteamRateLimiter = None
|
||||||
@@ -42,15 +43,21 @@ class SteamAPIManager(AsyncManager):
|
|||||||
self.steam_rate_limiter = SteamRateLimiter()
|
self.steam_rate_limiter = SteamRateLimiter()
|
||||||
self.steam_api_helper = SteamAPIHelper(self.steam_rate_limiter)
|
self.steam_api_helper = SteamAPIHelper(self.steam_rate_limiter)
|
||||||
|
|
||||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
def main(self, game: Game, additional_data: dict) -> None:
|
||||||
# Skip non-steam games
|
# Skip non-Steam games
|
||||||
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)
|
||||||
@@ -22,8 +22,8 @@ from typing import Iterable
|
|||||||
|
|
||||||
from gi.repository import GObject
|
from gi.repository import GObject
|
||||||
|
|
||||||
from src.game import Game
|
from cartridges.game import Game
|
||||||
from src.store.managers.manager import Manager
|
from cartridges.store.managers.manager import Manager
|
||||||
|
|
||||||
|
|
||||||
class Pipeline(GObject.Object):
|
class Pipeline(GObject.Object):
|
||||||
@@ -83,7 +83,7 @@ class Pipeline(GObject.Object):
|
|||||||
progress = 1
|
progress = 1
|
||||||
return progress
|
return progress
|
||||||
|
|
||||||
def advance(self):
|
def advance(self) -> None:
|
||||||
"""Spawn tasks for managers that are able to run for a game"""
|
"""Spawn tasks for managers that are able to run for a game"""
|
||||||
|
|
||||||
# Separate blocking / async managers
|
# Separate blocking / async managers
|
||||||
@@ -106,5 +106,5 @@ class Pipeline(GObject.Object):
|
|||||||
self.advance()
|
self.advance()
|
||||||
|
|
||||||
@GObject.Signal(name="advanced")
|
@GObject.Signal(name="advanced")
|
||||||
def advanced(self) -> None:
|
def advanced(self): # type: ignore
|
||||||
"""Signal emitted when the pipeline has advanced"""
|
"""Signal emitted when the pipeline has advanced"""
|
||||||
163
cartridges/store/store.py
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
# store.py
|
||||||
|
#
|
||||||
|
# Copyright 2023 Geoffrey Coulaud
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import Any, Generator, MutableMapping, Optional
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.store.managers.manager import Manager
|
||||||
|
from cartridges.store.pipeline import Pipeline
|
||||||
|
|
||||||
|
|
||||||
|
class Store:
|
||||||
|
"""Class in charge of handling games being added to the app."""
|
||||||
|
|
||||||
|
managers: dict[type[Manager], Manager]
|
||||||
|
pipeline_managers: set[Manager]
|
||||||
|
pipelines: dict[str, Pipeline]
|
||||||
|
source_games: MutableMapping[str, MutableMapping[str, Game]]
|
||||||
|
new_game_ids: set[str]
|
||||||
|
duplicate_game_ids: set[str]
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.managers = {}
|
||||||
|
self.pipeline_managers = set()
|
||||||
|
self.pipelines = {}
|
||||||
|
self.source_games = {}
|
||||||
|
self.new_game_ids = set()
|
||||||
|
self.duplicate_game_ids = set()
|
||||||
|
|
||||||
|
def __contains__(self, obj: object) -> bool:
|
||||||
|
"""Check if the game is present in the store with the `in` keyword"""
|
||||||
|
if not isinstance(obj, Game):
|
||||||
|
return False
|
||||||
|
if not (source_mapping := self.source_games.get(obj.base_source)):
|
||||||
|
return False
|
||||||
|
return obj.game_id in source_mapping
|
||||||
|
|
||||||
|
def __iter__(self) -> Generator[Game, None, None]:
|
||||||
|
"""Iterate through the games in the store with `for ... in`"""
|
||||||
|
for _source_id, games_mapping in self.source_games.items():
|
||||||
|
for _game_id, game in games_mapping.items():
|
||||||
|
yield game
|
||||||
|
|
||||||
|
def __len__(self) -> int:
|
||||||
|
"""Get the number of games in the store with the `len` builtin"""
|
||||||
|
return sum(len(source_mapping) for source_mapping in self.source_games.values())
|
||||||
|
|
||||||
|
def __getitem__(self, game_id: str) -> Game:
|
||||||
|
"""Get a game by its id with `store["game_id_goes_here"]`"""
|
||||||
|
for game in iter(self):
|
||||||
|
if game.game_id == game_id:
|
||||||
|
return game
|
||||||
|
raise KeyError("Game not found in store")
|
||||||
|
|
||||||
|
def get(self, game_id: str, default: Any = None) -> Game | Any:
|
||||||
|
"""Get a game by its ID, with a fallback if not found"""
|
||||||
|
try:
|
||||||
|
game = self[game_id]
|
||||||
|
return game
|
||||||
|
except KeyError:
|
||||||
|
return default
|
||||||
|
|
||||||
|
def add_manager(self, manager: Manager, in_pipeline: bool = True) -> None:
|
||||||
|
"""Add a manager to the store"""
|
||||||
|
manager_type = type(manager)
|
||||||
|
self.managers[manager_type] = manager
|
||||||
|
self.toggle_manager_in_pipelines(manager_type, in_pipeline)
|
||||||
|
|
||||||
|
def toggle_manager_in_pipelines(
|
||||||
|
self, manager_type: type[Manager], enable: bool
|
||||||
|
) -> None:
|
||||||
|
"""Change if a manager should run in new pipelines"""
|
||||||
|
if enable:
|
||||||
|
self.pipeline_managers.add(self.managers[manager_type])
|
||||||
|
else:
|
||||||
|
self.pipeline_managers.discard(self.managers[manager_type])
|
||||||
|
|
||||||
|
def cleanup_game(self, game: Game) -> None:
|
||||||
|
"""Remove a game's files, dismiss any loose toasts"""
|
||||||
|
for path in (
|
||||||
|
shared.games_dir / f"{game.game_id}.json",
|
||||||
|
shared.covers_dir / f"{game.game_id}.tiff",
|
||||||
|
shared.covers_dir / f"{game.game_id}.gif",
|
||||||
|
):
|
||||||
|
path.unlink(missing_ok=True)
|
||||||
|
|
||||||
|
# TODO: don't run this if the state is startup
|
||||||
|
for undo in ("remove", "hide"):
|
||||||
|
try:
|
||||||
|
shared.win.toasts[(game, undo)].dismiss()
|
||||||
|
shared.win.toasts.pop((game, undo))
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def add_game(
|
||||||
|
self, game: Game, additional_data: dict, run_pipeline: bool = True
|
||||||
|
) -> Optional[Pipeline]:
|
||||||
|
"""Add a game to the app"""
|
||||||
|
|
||||||
|
# Ignore games from a newer spec version
|
||||||
|
if game.version > shared.SPEC_VERSION:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Scanned game is already removed, just clean it up
|
||||||
|
if game.removed:
|
||||||
|
self.cleanup_game(game)
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Handle game duplicates
|
||||||
|
stored_game = self.get(game.game_id)
|
||||||
|
if not stored_game:
|
||||||
|
# New game, do as normal
|
||||||
|
logging.debug("New store game %s (%s)", game.name, game.game_id)
|
||||||
|
self.new_game_ids.add(game.game_id)
|
||||||
|
elif stored_game.removed:
|
||||||
|
# Will replace a removed game, cleanup its remains
|
||||||
|
logging.debug(
|
||||||
|
"New store game %s (%s) (replacing a removed one)",
|
||||||
|
game.name,
|
||||||
|
game.game_id,
|
||||||
|
)
|
||||||
|
self.cleanup_game(stored_game)
|
||||||
|
self.new_game_ids.add(game.game_id)
|
||||||
|
else:
|
||||||
|
# Duplicate game, ignore it
|
||||||
|
logging.debug("Duplicate store game %s (%s)", game.name, game.game_id)
|
||||||
|
self.duplicate_game_ids.add(game.game_id)
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Connect signals
|
||||||
|
for manager in self.managers.values():
|
||||||
|
for signal in manager.signals:
|
||||||
|
game.connect(signal, manager.run)
|
||||||
|
|
||||||
|
# Add the game to the store
|
||||||
|
if not game.base_source in self.source_games:
|
||||||
|
self.source_games[game.base_source] = {}
|
||||||
|
self.source_games[game.base_source][game.game_id] = game
|
||||||
|
|
||||||
|
# Run the pipeline for the game
|
||||||
|
if not run_pipeline:
|
||||||
|
return None
|
||||||
|
pipeline = Pipeline(game, additional_data, self.pipeline_managers)
|
||||||
|
self.pipelines[game.game_id] = pipeline
|
||||||
|
pipeline.advance()
|
||||||
|
return pipeline
|
||||||
@@ -17,15 +17,23 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from gi.repository import Adw
|
from typing import Optional
|
||||||
|
|
||||||
|
from gi.repository import Adw, Gtk
|
||||||
|
|
||||||
|
|
||||||
def create_dialog(win, heading, body, extra_option=None, extra_label=None):
|
def create_dialog(
|
||||||
dialog = Adw.MessageDialog.new(win, heading, body)
|
win: Gtk.Window,
|
||||||
|
heading: str,
|
||||||
|
body: str,
|
||||||
|
extra_option: Optional[str] = None,
|
||||||
|
extra_label: Optional[str] = None,
|
||||||
|
) -> Adw.AlertDialog:
|
||||||
|
dialog = Adw.AlertDialog.new(heading, body)
|
||||||
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))
|
||||||
|
|
||||||
dialog.present()
|
dialog.choose(win)
|
||||||
return dialog
|
return dialog
|
||||||
128
cartridges/utils/migrate_files_v1_to_v2.py
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# migrate_files_v1_to_v2.py
|
||||||
|
#
|
||||||
|
# Copyright 2023 Geoffrey Coulaud
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
|
||||||
|
old_data_dir = shared.home / ".local" / "share"
|
||||||
|
old_cartridges_data_dir = old_data_dir / "cartridges"
|
||||||
|
migrated_file_path = old_cartridges_data_dir / ".migrated"
|
||||||
|
old_games_dir = old_cartridges_data_dir / "games"
|
||||||
|
old_covers_dir = old_cartridges_data_dir / "covers"
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_game_covers(game_path: Path) -> None:
|
||||||
|
"""Migrate a game covers from a source game path to the current dir"""
|
||||||
|
for suffix in (".tiff", ".gif"):
|
||||||
|
cover_path = old_covers_dir / game_path.with_suffix(suffix).name
|
||||||
|
if not cover_path.is_file():
|
||||||
|
continue
|
||||||
|
destination_cover_path = shared.covers_dir / cover_path.name
|
||||||
|
logging.info("Moving %s -> %s", str(cover_path), str(destination_cover_path))
|
||||||
|
cover_path.rename(destination_cover_path)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_files_v1_to_v2() -> None:
|
||||||
|
"""
|
||||||
|
Migrate user data from the v1.X locations to the latest location.
|
||||||
|
|
||||||
|
Fix for commit 4a204442b5d8ba2e918f8c2605d72e483bf35efd
|
||||||
|
where the windows directories for data, config and cache changed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Skip if there is no old dir
|
||||||
|
# Skip if old == current
|
||||||
|
# Skip if already migrated
|
||||||
|
if (
|
||||||
|
not old_data_dir.is_dir()
|
||||||
|
or str(old_data_dir) == str(shared.data_dir)
|
||||||
|
or migrated_file_path.is_file()
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
logging.info("Migrating data dir %s", str(old_data_dir))
|
||||||
|
|
||||||
|
# Create new directories
|
||||||
|
shared.games_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
shared.covers_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
old_game_paths = set(old_games_dir.glob("*.json"))
|
||||||
|
old_imported_game_paths = set(
|
||||||
|
filter(lambda path: path.name.startswith("imported_"), old_game_paths)
|
||||||
|
)
|
||||||
|
old_other_game_paths = old_game_paths - old_imported_game_paths
|
||||||
|
|
||||||
|
# Discover current imported games
|
||||||
|
imported_game_number = 0
|
||||||
|
imported_execs = set()
|
||||||
|
for game_path in shared.games_dir.glob("imported_*.json"):
|
||||||
|
try:
|
||||||
|
game_data = json.load(game_path.open("r", encoding="utf-8"))
|
||||||
|
except (OSError, json.JSONDecodeError):
|
||||||
|
continue
|
||||||
|
number = int(game_data["game_id"].replace("imported_", ""))
|
||||||
|
imported_game_number = max(number, imported_game_number)
|
||||||
|
imported_execs.add(game_data["executable"])
|
||||||
|
|
||||||
|
# Migrate imported game files
|
||||||
|
for game_path in old_imported_game_paths:
|
||||||
|
try:
|
||||||
|
game_data = json.load(game_path.open("r", encoding="utf-8"))
|
||||||
|
except (OSError, json.JSONDecodeError):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Don't migrate if there's a game with the same exec
|
||||||
|
if game_data["executable"] in imported_execs:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Migrate with updated index
|
||||||
|
imported_game_number += 1
|
||||||
|
game_id = f"imported_{imported_game_number}"
|
||||||
|
game_data["game_id"] = game_id
|
||||||
|
destination_game_path = shared.games_dir / f"{game_id}.json"
|
||||||
|
logging.info(
|
||||||
|
"Moving (updated id) %s -> %s", str(game_path), str(destination_game_path)
|
||||||
|
)
|
||||||
|
json.dump(
|
||||||
|
game_data,
|
||||||
|
destination_game_path.open("w", encoding="utf-8"),
|
||||||
|
indent=4,
|
||||||
|
sort_keys=True,
|
||||||
|
)
|
||||||
|
game_path.unlink()
|
||||||
|
migrate_game_covers(game_path)
|
||||||
|
|
||||||
|
# Migrate all other games
|
||||||
|
for game_path in old_other_game_paths:
|
||||||
|
# Do nothing if already in games dir
|
||||||
|
destination_game_path = shared.games_dir / game_path.name
|
||||||
|
if destination_game_path.exists():
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Else, migrate the game
|
||||||
|
logging.info("Moving %s -> %s", str(game_path), str(destination_game_path))
|
||||||
|
game_path.rename(destination_game_path)
|
||||||
|
migrate_game_covers(game_path)
|
||||||
|
|
||||||
|
# Signal that this dir is migrated
|
||||||
|
migrated_file_path.touch()
|
||||||
|
logging.info("Migration done")
|
||||||
@@ -17,11 +17,11 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from typing import Optional, Sized
|
|
||||||
from threading import Lock, Thread, BoundedSemaphore
|
|
||||||
from time import sleep, time
|
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from contextlib import AbstractContextManager
|
from contextlib import AbstractContextManager
|
||||||
|
from threading import BoundedSemaphore, Lock, Thread
|
||||||
|
from time import sleep, time
|
||||||
|
from typing import Any, Sized
|
||||||
|
|
||||||
|
|
||||||
class PickHistory(Sized):
|
class PickHistory(Sized):
|
||||||
@@ -30,22 +30,22 @@ class PickHistory(Sized):
|
|||||||
|
|
||||||
period: int
|
period: int
|
||||||
|
|
||||||
timestamps: list[int] = None
|
timestamps: list[float]
|
||||||
timestamps_lock: Lock = None
|
timestamps_lock: Lock
|
||||||
|
|
||||||
def __init__(self, period: int) -> None:
|
def __init__(self, period: int) -> None:
|
||||||
self.period = period
|
self.period = period
|
||||||
self.timestamps = []
|
self.timestamps = []
|
||||||
self.timestamps_lock = Lock()
|
self.timestamps_lock = Lock()
|
||||||
|
|
||||||
def remove_old_entries(self):
|
def remove_old_entries(self) -> None:
|
||||||
"""Remove history entries older than the period"""
|
"""Remove history entries older than the period"""
|
||||||
now = time()
|
now = time()
|
||||||
cutoff = now - self.period
|
cutoff = now - self.period
|
||||||
with self.timestamps_lock:
|
with self.timestamps_lock:
|
||||||
self.timestamps = [entry for entry in self.timestamps if entry > cutoff]
|
self.timestamps = [entry for entry in self.timestamps if entry > cutoff]
|
||||||
|
|
||||||
def add(self, *new_timestamps: Optional[int]):
|
def add(self, *new_timestamps: float) -> None:
|
||||||
"""Add timestamps to the history.
|
"""Add timestamps to the history.
|
||||||
If none given, will add the current timestamp"""
|
If none given, will add the current timestamp"""
|
||||||
if len(new_timestamps) == 0:
|
if len(new_timestamps) == 0:
|
||||||
@@ -60,7 +60,7 @@ class PickHistory(Sized):
|
|||||||
return len(self.timestamps)
|
return len(self.timestamps)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def start(self) -> int:
|
def start(self) -> float:
|
||||||
"""Get the time at which the history started"""
|
"""Get the time at which the history started"""
|
||||||
self.remove_old_entries()
|
self.remove_old_entries()
|
||||||
with self.timestamps_lock:
|
with self.timestamps_lock:
|
||||||
@@ -70,7 +70,7 @@ class PickHistory(Sized):
|
|||||||
entry = time()
|
entry = time()
|
||||||
return entry
|
return entry
|
||||||
|
|
||||||
def copy_timestamps(self) -> str:
|
def copy_timestamps(self) -> list[float]:
|
||||||
"""Get a copy of the timestamps history"""
|
"""Get a copy of the timestamps history"""
|
||||||
self.remove_old_entries()
|
self.remove_old_entries()
|
||||||
with self.timestamps_lock:
|
with self.timestamps_lock:
|
||||||
@@ -79,51 +79,55 @@ class PickHistory(Sized):
|
|||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
# pylint: disable=too-many-instance-attributes
|
||||||
class RateLimiter(AbstractContextManager):
|
class RateLimiter(AbstractContextManager):
|
||||||
"""Rate limiter implementing the token bucket algorithm"""
|
"""
|
||||||
|
Base rate limiter implementing the token bucket algorithm.
|
||||||
|
|
||||||
|
Do not use directly, create a child class to tailor the rate limiting to the
|
||||||
|
underlying service's limits.
|
||||||
|
|
||||||
|
Subclasses must provide values to the following attributes:
|
||||||
|
* refill_period_seconds - Period in which we have a max amount of tokens
|
||||||
|
* refill_period_tokens - Number of tokens allowed in this period
|
||||||
|
* burst_tokens - Max number of tokens that can be consumed instantly
|
||||||
|
"""
|
||||||
|
|
||||||
# Period in which we have a max amount of tokens
|
|
||||||
refill_period_seconds: int
|
refill_period_seconds: int
|
||||||
# Number of tokens allowed in this period
|
|
||||||
refill_period_tokens: int
|
refill_period_tokens: int
|
||||||
# Max number of tokens that can be consumed instantly
|
|
||||||
burst_tokens: int
|
burst_tokens: int
|
||||||
|
|
||||||
pick_history: PickHistory = None
|
pick_history: PickHistory
|
||||||
bucket: BoundedSemaphore = None
|
bucket: BoundedSemaphore
|
||||||
queue: deque[Lock] = None
|
queue: deque[Lock]
|
||||||
queue_lock: Lock = None
|
queue_lock: Lock
|
||||||
|
|
||||||
# Protect the number of tokens behind a lock
|
# Protect the number of tokens behind a lock
|
||||||
__n_tokens_lock: Lock = None
|
__n_tokens_lock: Lock
|
||||||
__n_tokens = 0
|
__n_tokens = 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def n_tokens(self):
|
def n_tokens(self) -> int:
|
||||||
with self.__n_tokens_lock:
|
with self.__n_tokens_lock:
|
||||||
return self.__n_tokens
|
return self.__n_tokens
|
||||||
|
|
||||||
@n_tokens.setter
|
@n_tokens.setter
|
||||||
def n_tokens(self, value: int):
|
def n_tokens(self, value: int) -> None:
|
||||||
with self.__n_tokens_lock:
|
with self.__n_tokens_lock:
|
||||||
self.__n_tokens = value
|
self.__n_tokens = value
|
||||||
|
|
||||||
def __init__(
|
def _init_pick_history(self) -> None:
|
||||||
self,
|
"""
|
||||||
refill_period_seconds: Optional[int] = None,
|
Initialize the tocken pick history
|
||||||
refill_period_tokens: Optional[int] = None,
|
(only for use in this class and its children)
|
||||||
burst_tokens: Optional[int] = None,
|
|
||||||
) -> None:
|
By default, creates an empty pick history.
|
||||||
|
Should be overriden or extended by subclasses.
|
||||||
|
"""
|
||||||
|
self.pick_history = PickHistory(self.refill_period_seconds)
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
"""Initialize the limiter"""
|
"""Initialize the limiter"""
|
||||||
|
|
||||||
# Initialize default values
|
self._init_pick_history()
|
||||||
if refill_period_seconds is not None:
|
|
||||||
self.refill_period_seconds = refill_period_seconds
|
|
||||||
if refill_period_tokens is not None:
|
|
||||||
self.refill_period_tokens = refill_period_tokens
|
|
||||||
if burst_tokens is not None:
|
|
||||||
self.burst_tokens = burst_tokens
|
|
||||||
if self.pick_history is None:
|
|
||||||
self.pick_history = PickHistory(self.refill_period_seconds)
|
|
||||||
|
|
||||||
# Create synchronization data
|
# Create synchronization data
|
||||||
self.__n_tokens_lock = Lock()
|
self.__n_tokens_lock = Lock()
|
||||||
@@ -147,8 +151,8 @@ class RateLimiter(AbstractContextManager):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Compute ideal spacing
|
# Compute ideal spacing
|
||||||
tokens_left = self.refill_period_tokens - len(self.pick_history)
|
tokens_left = self.refill_period_tokens - len(self.pick_history) # type: ignore
|
||||||
seconds_left = self.pick_history.start + self.refill_period_seconds - time()
|
seconds_left = self.pick_history.start + self.refill_period_seconds - time() # type: ignore
|
||||||
try:
|
try:
|
||||||
spacing_seconds = seconds_left / tokens_left
|
spacing_seconds = seconds_left / tokens_left
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
@@ -159,7 +163,7 @@ class RateLimiter(AbstractContextManager):
|
|||||||
natural_spacing = self.refill_period_seconds / self.refill_period_tokens
|
natural_spacing = self.refill_period_seconds / self.refill_period_tokens
|
||||||
return max(natural_spacing, spacing_seconds)
|
return max(natural_spacing, spacing_seconds)
|
||||||
|
|
||||||
def refill(self):
|
def refill(self) -> None:
|
||||||
"""Add a token back in the bucket"""
|
"""Add a token back in the bucket"""
|
||||||
sleep(self.refill_spacing)
|
sleep(self.refill_spacing)
|
||||||
try:
|
try:
|
||||||
@@ -170,7 +174,7 @@ class RateLimiter(AbstractContextManager):
|
|||||||
else:
|
else:
|
||||||
self.n_tokens += 1
|
self.n_tokens += 1
|
||||||
|
|
||||||
def refill_thread_func(self):
|
def refill_thread_func(self) -> None:
|
||||||
"""Entry point for the daemon thread that is refilling the bucket"""
|
"""Entry point for the daemon thread that is refilling the bucket"""
|
||||||
while True:
|
while True:
|
||||||
self.refill()
|
self.refill()
|
||||||
@@ -200,18 +204,18 @@ class RateLimiter(AbstractContextManager):
|
|||||||
self.queue.appendleft(lock)
|
self.queue.appendleft(lock)
|
||||||
return lock
|
return lock
|
||||||
|
|
||||||
def acquire(self):
|
def acquire(self) -> None:
|
||||||
"""Acquires a token from the bucket when it's your turn in queue"""
|
"""Acquires a token from the bucket when it's your turn in queue"""
|
||||||
lock = self.add_to_queue()
|
lock = self.add_to_queue()
|
||||||
self.update_queue()
|
self.update_queue()
|
||||||
# Wait until our turn in queue
|
# Wait until our turn in queue
|
||||||
lock.acquire() # pylint: disable=consider-using-with
|
lock.acquire() # pylint: disable=consider-using-with
|
||||||
self.pick_history.add()
|
self.pick_history.add() # type: ignore
|
||||||
|
|
||||||
# --- Support for use in with statements
|
# --- Support for use in with statements
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self) -> None:
|
||||||
self.acquire()
|
self.acquire()
|
||||||
|
|
||||||
def __exit__(self, *_args):
|
def __exit__(self, *_args: Any) -> None:
|
||||||
pass
|
pass
|
||||||
@@ -18,11 +18,12 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from gi.repository import GLib
|
from gi.repository import GLib
|
||||||
|
|
||||||
|
|
||||||
def relative_date(timestamp): # pylint: disable=too-many-return-statements
|
def relative_date(timestamp: int) -> Any: # pylint: disable=too-many-return-statements
|
||||||
days_no = ((today := datetime.today()) - datetime.fromtimestamp(timestamp)).days
|
days_no = ((today := datetime.today()) - datetime.fromtimestamp(timestamp)).days
|
||||||
|
|
||||||
if days_no == 0:
|
if days_no == 0:
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# check_install.py
|
# run_executable.py
|
||||||
#
|
#
|
||||||
# Copyright 2022-2023 kramo
|
# Copyright 2023 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
|
||||||
@@ -17,16 +17,27 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from pathlib import Path
|
import logging
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from shlex import quote
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
|
||||||
|
|
||||||
# TODO delegate to the sources
|
def run_executable(executable) -> None:
|
||||||
def check_install(check, locations, setting=None, subdirs=(Path(),)):
|
args = (
|
||||||
for location in locations:
|
"flatpak-spawn --host /bin/sh -c " + quote(executable) # Flatpak
|
||||||
for subdir in (Path(),) + subdirs:
|
if os.getenv("FLATPAK_ID") == shared.APP_ID
|
||||||
if (location / subdir / check).exists():
|
else executable # Others
|
||||||
if setting:
|
)
|
||||||
setting[0].set_string(setting[1], str(location / subdir))
|
|
||||||
return location / subdir
|
|
||||||
|
|
||||||
return False
|
logging.info("Launching `%s`", str(args))
|
||||||
|
# pylint: disable=consider-using-with
|
||||||
|
subprocess.Popen(
|
||||||
|
args,
|
||||||
|
cwd=shared.home,
|
||||||
|
shell=True,
|
||||||
|
start_new_session=True,
|
||||||
|
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0, # type: ignore
|
||||||
|
)
|
||||||
@@ -20,17 +20,30 @@
|
|||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from gi.repository import Gdk, Gio, GLib
|
from gi.repository import Gdk, GdkPixbuf, Gio, GLib
|
||||||
from PIL import Image, ImageSequence, UnidentifiedImageError
|
from PIL import Image, ImageSequence, UnidentifiedImageError
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
|
|
||||||
|
|
||||||
def resize_cover(cover_path=None, pixbuf=None):
|
def convert_cover(
|
||||||
|
cover_path: Optional[Path] = None,
|
||||||
|
pixbuf: Optional[GdkPixbuf.Pixbuf] = None,
|
||||||
|
resize: bool = True,
|
||||||
|
) -> Optional[Path]:
|
||||||
if not cover_path and not pixbuf:
|
if not cover_path and not pixbuf:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
pixbuf_extensions = set()
|
||||||
|
for pixbuf_format in GdkPixbuf.Pixbuf.get_formats():
|
||||||
|
for pixbuf_extension in pixbuf_format.get_extensions():
|
||||||
|
pixbuf_extensions.add(pixbuf_extension)
|
||||||
|
|
||||||
|
if not resize and cover_path and cover_path.suffix.lower()[1:] in pixbuf_extensions:
|
||||||
|
return cover_path
|
||||||
|
|
||||||
if pixbuf:
|
if pixbuf:
|
||||||
cover_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
cover_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
||||||
pixbuf.savev(str(cover_path), "tiff", ["compression"], ["1"])
|
pixbuf.savev(str(cover_path), "tiff", ["compression"], ["1"])
|
||||||
@@ -39,7 +52,8 @@ def resize_cover(cover_path=None, pixbuf=None):
|
|||||||
with Image.open(cover_path) as image:
|
with Image.open(cover_path) as image:
|
||||||
if getattr(image, "is_animated", False):
|
if getattr(image, "is_animated", False):
|
||||||
frames = tuple(
|
frames = tuple(
|
||||||
frame.resize((200, 300)) for frame in ImageSequence.Iterator(image)
|
frame.resize((200, 300)) if resize else frame
|
||||||
|
for frame in ImageSequence.Iterator(image)
|
||||||
)
|
)
|
||||||
|
|
||||||
tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())
|
tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())
|
||||||
@@ -56,25 +70,25 @@ def resize_cover(cover_path=None, pixbuf=None):
|
|||||||
image = image.convert("RGBA")
|
image = image.convert("RGBA")
|
||||||
|
|
||||||
tmp_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
tmp_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
||||||
image.resize(shared.image_size).save(
|
(image.resize(shared.image_size) if resize else image).save(
|
||||||
tmp_path,
|
tmp_path,
|
||||||
compression="tiff_adobe_deflate"
|
compression="tiff_adobe_deflate"
|
||||||
if shared.schema.get_boolean("high-quality-images")
|
if shared.schema.get_boolean("high-quality-images")
|
||||||
else "webp",
|
else shared.TIFF_COMPRESSION,
|
||||||
)
|
)
|
||||||
except UnidentifiedImageError:
|
except UnidentifiedImageError:
|
||||||
try:
|
try:
|
||||||
Gdk.Texture.new_from_filename(str(cover_path)).save_to_tiff(
|
Gdk.Texture.new_from_filename(str(cover_path)).save_to_tiff(
|
||||||
tmp_path := Gio.File.new_tmp("XXXXXX.tiff")[0].get_path()
|
tmp_path := Gio.File.new_tmp("XXXXXX.tiff")[0].get_path()
|
||||||
)
|
)
|
||||||
return resize_cover(tmp_path)
|
return convert_cover(tmp_path)
|
||||||
except GLib.GError:
|
except GLib.Error:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return tmp_path
|
return tmp_path
|
||||||
|
|
||||||
|
|
||||||
def save_cover(game_id, cover_path):
|
def save_cover(game_id: str, cover_path: Path) -> None:
|
||||||
shared.covers_dir.mkdir(parents=True, exist_ok=True)
|
shared.covers_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
animated_path = shared.covers_dir / f"{game_id}.gif"
|
animated_path = shared.covers_dir / f"{game_id}.gif"
|
||||||
@@ -21,13 +21,14 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
from pathlib import Path
|
||||||
from typing import TypedDict
|
from typing import TypedDict
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.exceptions import HTTPError
|
from requests.exceptions import HTTPError
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.utils.rate_limiter import PickHistory, RateLimiter
|
from cartridges.utils.rate_limiter import RateLimiter
|
||||||
|
|
||||||
|
|
||||||
class SteamError(Exception):
|
class SteamError(Exception):
|
||||||
@@ -71,16 +72,18 @@ class SteamRateLimiter(RateLimiter):
|
|||||||
refill_period_tokens = 200
|
refill_period_tokens = 200
|
||||||
burst_tokens = 100
|
burst_tokens = 100
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def _init_pick_history(self) -> None:
|
||||||
# Load pick history from schema
|
"""
|
||||||
# (Remember API limits through restarts of Cartridges)
|
Load the pick history from schema.
|
||||||
|
|
||||||
|
Allows remembering API limits through restarts of Cartridges.
|
||||||
|
"""
|
||||||
|
super()._init_pick_history()
|
||||||
timestamps_str = shared.state_schema.get_string("steam-limiter-tokens-history")
|
timestamps_str = shared.state_schema.get_string("steam-limiter-tokens-history")
|
||||||
self.pick_history = PickHistory(self.refill_period_seconds)
|
|
||||||
self.pick_history.add(*json.loads(timestamps_str))
|
self.pick_history.add(*json.loads(timestamps_str))
|
||||||
self.pick_history.remove_old_entries()
|
self.pick_history.remove_old_entries()
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
def acquire(self):
|
def acquire(self) -> None:
|
||||||
"""Get a token from the bucket and store the pick history in the schema"""
|
"""Get a token from the bucket and store the pick history in the schema"""
|
||||||
super().acquire()
|
super().acquire()
|
||||||
timestamps_str = json.dumps(self.pick_history.copy_timestamps())
|
timestamps_str = json.dumps(self.pick_history.copy_timestamps())
|
||||||
@@ -88,9 +91,9 @@ class SteamRateLimiter(RateLimiter):
|
|||||||
|
|
||||||
|
|
||||||
class SteamFileHelper:
|
class SteamFileHelper:
|
||||||
"""Helper for steam file formats"""
|
"""Helper for Steam file formats"""
|
||||||
|
|
||||||
def get_manifest_data(self, manifest_path) -> SteamManifestData:
|
def get_manifest_data(self, manifest_path: Path) -> SteamManifestData:
|
||||||
"""Get local data for a game from its manifest"""
|
"""Get local data for a game from its manifest"""
|
||||||
|
|
||||||
with open(manifest_path, "r", encoding="utf-8") as file:
|
with open(manifest_path, "r", encoding="utf-8") as file:
|
||||||
@@ -104,7 +107,11 @@ class SteamFileHelper:
|
|||||||
raise SteamInvalidManifestError()
|
raise SteamInvalidManifestError()
|
||||||
data[key] = match.group(1)
|
data[key] = match.group(1)
|
||||||
|
|
||||||
return SteamManifestData(**data)
|
return SteamManifestData(
|
||||||
|
name=data["name"],
|
||||||
|
appid=data["appid"],
|
||||||
|
stateflags=data["stateflags"],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class SteamAPIHelper:
|
class SteamAPIHelper:
|
||||||
@@ -116,7 +123,7 @@ class SteamAPIHelper:
|
|||||||
def __init__(self, rate_limiter: RateLimiter) -> None:
|
def __init__(self, rate_limiter: RateLimiter) -> None:
|
||||||
self.rate_limiter = rate_limiter
|
self.rate_limiter = rate_limiter
|
||||||
|
|
||||||
def get_api_data(self, appid) -> SteamAPIData:
|
def get_api_data(self, appid: str) -> SteamAPIData:
|
||||||
"""
|
"""
|
||||||
Get online data for a game from its appid.
|
Get online data for a game from its appid.
|
||||||
May block to satisfy the Steam web API limitations.
|
May block to satisfy the Steam web API limitations.
|
||||||
@@ -142,8 +149,7 @@ class SteamAPIHelper:
|
|||||||
raise SteamGameNotFoundError()
|
raise SteamGameNotFoundError()
|
||||||
|
|
||||||
# Handle appid is not a game
|
# Handle appid is not a game
|
||||||
game_types = ("game", "demo")
|
if data["data"]["type"] not in {"game", "demo", "mod"}:
|
||||||
if data["data"]["type"] not in game_types:
|
|
||||||
logging.debug("Appid %s is not a game", appid)
|
logging.debug("Appid %s is not a game", appid)
|
||||||
raise SteamNotAGameError()
|
raise SteamNotAGameError()
|
||||||
|
|
||||||
@@ -20,47 +20,49 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
from requests.exceptions import HTTPError
|
from requests.exceptions import HTTPError
|
||||||
|
|
||||||
from src import shared
|
from cartridges import shared
|
||||||
from src.utils.save_cover import resize_cover, save_cover
|
from cartridges.game import Game
|
||||||
|
from cartridges.utils.save_cover import convert_cover, save_cover
|
||||||
|
|
||||||
|
|
||||||
class SGDBError(Exception):
|
class SgdbError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SGDBAuthError(SGDBError):
|
class SgdbAuthError(SgdbError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SGDBGameNotFoundError(SGDBError):
|
class SgdbGameNotFound(SgdbError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SGDBBadRequestError(SGDBError):
|
class SgdbBadRequest(SgdbError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SGDBNoImageFoundError(SGDBError):
|
class SgdbNoImageFound(SgdbError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SGDBHelper:
|
class SgdbHelper:
|
||||||
"""Helper class to make queries to SteamGridDB"""
|
"""Helper class to make queries to SteamGridDB"""
|
||||||
|
|
||||||
base_url = "https://www.steamgriddb.com/api/v2/"
|
base_url = "https://www.steamgriddb.com/api/v2/"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def auth_headers(self):
|
def auth_headers(self) -> dict[str, str]:
|
||||||
key = shared.schema.get_string("sgdb-key")
|
key = shared.schema.get_string("sgdb-key")
|
||||||
headers = {"Authorization": f"Bearer {key}"}
|
headers = {"Authorization": f"Bearer {key}"}
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
def get_game_id(self, game):
|
def get_game_id(self, game: Game) -> Any:
|
||||||
"""Get grid results for a game. Can raise an exception."""
|
"""Get grid results for a game. Can raise an exception."""
|
||||||
uri = f"{self.base_url}search/autocomplete/{game.name}"
|
uri = f"{self.base_url}search/autocomplete/{game.name}"
|
||||||
res = requests.get(uri, headers=self.auth_headers, timeout=5)
|
res = requests.get(uri, headers=self.auth_headers, timeout=5)
|
||||||
@@ -68,13 +70,13 @@ class SGDBHelper:
|
|||||||
case 200:
|
case 200:
|
||||||
return res.json()["data"][0]["id"]
|
return res.json()["data"][0]["id"]
|
||||||
case 401:
|
case 401:
|
||||||
raise SGDBAuthError(res.json()["errors"][0])
|
raise SgdbAuthError(res.json()["errors"][0])
|
||||||
case 404:
|
case 404:
|
||||||
raise SGDBGameNotFoundError(res.status_code)
|
raise SgdbGameNotFound(res.status_code)
|
||||||
case _:
|
case _:
|
||||||
res.raise_for_status()
|
res.raise_for_status()
|
||||||
|
|
||||||
def get_image_uri(self, game_id, animated=False):
|
def get_image_uri(self, game_id: str, animated: bool = False) -> Any:
|
||||||
"""Get the image for a SGDB game id"""
|
"""Get the image for a SGDB game id"""
|
||||||
uri = f"{self.base_url}grids/game/{game_id}?dimensions=600x900"
|
uri = f"{self.base_url}grids/game/{game_id}?dimensions=600x900"
|
||||||
if animated:
|
if animated:
|
||||||
@@ -84,16 +86,16 @@ class SGDBHelper:
|
|||||||
case 200:
|
case 200:
|
||||||
data = res.json()["data"]
|
data = res.json()["data"]
|
||||||
if len(data) == 0:
|
if len(data) == 0:
|
||||||
raise SGDBNoImageFoundError()
|
raise SgdbNoImageFound()
|
||||||
return data[0]["url"]
|
return data[0]["url"]
|
||||||
case 401:
|
case 401:
|
||||||
raise SGDBAuthError(res.json()["errors"][0])
|
raise SgdbAuthError(res.json()["errors"][0])
|
||||||
case 404:
|
case 404:
|
||||||
raise SGDBGameNotFoundError(res.status_code)
|
raise SgdbGameNotFound(res.status_code)
|
||||||
case _:
|
case _:
|
||||||
res.raise_for_status()
|
res.raise_for_status()
|
||||||
|
|
||||||
def conditionaly_update_cover(self, game):
|
def conditionaly_update_cover(self, game: Game) -> None:
|
||||||
"""Update the game's cover if appropriate"""
|
"""Update the game's cover if appropriate"""
|
||||||
|
|
||||||
# Obvious skips
|
# Obvious skips
|
||||||
@@ -103,17 +105,17 @@ class SGDBHelper:
|
|||||||
|
|
||||||
image_trunk = shared.covers_dir / game.game_id
|
image_trunk = shared.covers_dir / game.game_id
|
||||||
still = image_trunk.with_suffix(".tiff")
|
still = image_trunk.with_suffix(".tiff")
|
||||||
uri_kwargs = image_trunk.with_suffix(".gif")
|
animated = image_trunk.with_suffix(".gif")
|
||||||
prefer_sgdb = shared.schema.get_boolean("sgdb-prefer")
|
prefer_sgdb = shared.schema.get_boolean("sgdb-prefer")
|
||||||
|
|
||||||
# Do nothing if file present and not prefer SGDB
|
# Do nothing if file present and not prefer SGDB
|
||||||
if not prefer_sgdb and (still.is_file() or uri_kwargs.is_file()):
|
if not prefer_sgdb and (still.is_file() or animated.is_file()):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get ID for the game
|
# Get ID for the game
|
||||||
try:
|
try:
|
||||||
sgdb_id = self.get_game_id(game)
|
sgdb_id = self.get_game_id(game)
|
||||||
except (HTTPError, SGDBError) as error:
|
except (HTTPError, SgdbError) as error:
|
||||||
logging.warning(
|
logging.warning(
|
||||||
"%s while getting SGDB ID for %s", type(error).__name__, game.name
|
"%s while getting SGDB ID for %s", type(error).__name__, game.name
|
||||||
)
|
)
|
||||||
@@ -132,11 +134,11 @@ class SGDBHelper:
|
|||||||
tmp_file = Gio.File.new_tmp()[0]
|
tmp_file = Gio.File.new_tmp()[0]
|
||||||
tmp_file_path = tmp_file.get_path()
|
tmp_file_path = tmp_file.get_path()
|
||||||
Path(tmp_file_path).write_bytes(response.content)
|
Path(tmp_file_path).write_bytes(response.content)
|
||||||
save_cover(game.game_id, resize_cover(tmp_file_path))
|
save_cover(game.game_id, convert_cover(tmp_file_path))
|
||||||
except SGDBAuthError as error:
|
except SgdbAuthError as error:
|
||||||
# Let caller handle auth errors
|
# Let caller handle auth errors
|
||||||
raise error
|
raise error
|
||||||
except (HTTPError, SGDBError) as error:
|
except (HTTPError, SgdbError) as error:
|
||||||
logging.warning(
|
logging.warning(
|
||||||
"%s while getting image for %s kwargs=%s",
|
"%s while getting image for %s kwargs=%s",
|
||||||
type(error).__name__,
|
type(error).__name__,
|
||||||
@@ -154,4 +156,4 @@ class SGDBHelper:
|
|||||||
game.name,
|
game.name,
|
||||||
sgdb_id,
|
sgdb_id,
|
||||||
)
|
)
|
||||||
raise SGDBNoImageFoundError()
|
raise SgdbNoImageFound()
|
||||||
523
cartridges/window.py
Normal file
@@ -0,0 +1,523 @@
|
|||||||
|
# window.py
|
||||||
|
#
|
||||||
|
# Copyright 2022-2023 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 typing import Any, Optional
|
||||||
|
|
||||||
|
from gi.repository import Adw, Gio, GLib, Gtk
|
||||||
|
|
||||||
|
from cartridges import shared
|
||||||
|
from cartridges.game import Game
|
||||||
|
from cartridges.game_cover import GameCover
|
||||||
|
from cartridges.utils.relative_date import relative_date
|
||||||
|
|
||||||
|
|
||||||
|
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/window.ui")
|
||||||
|
class CartridgesWindow(Adw.ApplicationWindow):
|
||||||
|
__gtype_name__ = "CartridgesWindow"
|
||||||
|
|
||||||
|
overlay_split_view = Gtk.Template.Child()
|
||||||
|
navigation_view = Gtk.Template.Child()
|
||||||
|
sidebar = Gtk.Template.Child()
|
||||||
|
all_games_row_box = Gtk.Template.Child()
|
||||||
|
all_games_no_label = Gtk.Template.Child()
|
||||||
|
added_row_box = Gtk.Template.Child()
|
||||||
|
added_games_no_label = Gtk.Template.Child()
|
||||||
|
toast_overlay = Gtk.Template.Child()
|
||||||
|
primary_menu_button = Gtk.Template.Child()
|
||||||
|
show_sidebar_button = Gtk.Template.Child()
|
||||||
|
details_view = Gtk.Template.Child()
|
||||||
|
library_page = Gtk.Template.Child()
|
||||||
|
library_view = Gtk.Template.Child()
|
||||||
|
library = Gtk.Template.Child()
|
||||||
|
scrolledwindow = Gtk.Template.Child()
|
||||||
|
library_overlay = Gtk.Template.Child()
|
||||||
|
notice_empty = Gtk.Template.Child()
|
||||||
|
notice_no_results = Gtk.Template.Child()
|
||||||
|
search_bar = Gtk.Template.Child()
|
||||||
|
search_entry = Gtk.Template.Child()
|
||||||
|
search_button = Gtk.Template.Child()
|
||||||
|
|
||||||
|
details_page = Gtk.Template.Child()
|
||||||
|
details_view_toolbar_view = Gtk.Template.Child()
|
||||||
|
details_view_cover = Gtk.Template.Child()
|
||||||
|
details_view_spinner = Gtk.Template.Child()
|
||||||
|
details_view_title = Gtk.Template.Child()
|
||||||
|
details_view_blurred_cover = Gtk.Template.Child()
|
||||||
|
details_view_play_button = Gtk.Template.Child()
|
||||||
|
details_view_developer = Gtk.Template.Child()
|
||||||
|
details_view_added = Gtk.Template.Child()
|
||||||
|
details_view_last_played = Gtk.Template.Child()
|
||||||
|
details_view_hide_button = Gtk.Template.Child()
|
||||||
|
|
||||||
|
hidden_library_page = Gtk.Template.Child()
|
||||||
|
hidden_primary_menu_button = Gtk.Template.Child()
|
||||||
|
hidden_library = Gtk.Template.Child()
|
||||||
|
hidden_library_view = Gtk.Template.Child()
|
||||||
|
hidden_scrolledwindow = Gtk.Template.Child()
|
||||||
|
hidden_library_overlay = Gtk.Template.Child()
|
||||||
|
hidden_notice_empty = Gtk.Template.Child()
|
||||||
|
hidden_notice_no_results = Gtk.Template.Child()
|
||||||
|
hidden_search_bar = Gtk.Template.Child()
|
||||||
|
hidden_search_entry = Gtk.Template.Child()
|
||||||
|
hidden_search_button = Gtk.Template.Child()
|
||||||
|
|
||||||
|
game_covers: dict = {}
|
||||||
|
toasts: dict = {}
|
||||||
|
active_game: Game
|
||||||
|
details_view_game_cover: Optional[GameCover] = None
|
||||||
|
sort_state: str = "last_played"
|
||||||
|
filter_state: str = "all"
|
||||||
|
source_rows: dict = {}
|
||||||
|
|
||||||
|
def create_source_rows(self) -> None:
|
||||||
|
def get_removed(source_id: str) -> Any:
|
||||||
|
removed = tuple(
|
||||||
|
game.removed or game.hidden or game.blacklisted
|
||||||
|
for game in shared.store.source_games[source_id].values()
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
(count,) if (count := sum(removed)) != len(removed) else False
|
||||||
|
) # Return a tuple because 0 == False and 1 == True
|
||||||
|
|
||||||
|
total_games_no = 0
|
||||||
|
restored = False
|
||||||
|
|
||||||
|
selected_id = (
|
||||||
|
self.source_rows[selected_row][0]
|
||||||
|
if (selected_row := self.sidebar.get_selected_row()) in self.source_rows
|
||||||
|
else None
|
||||||
|
)
|
||||||
|
|
||||||
|
if selected_row == self.added_row_box.get_parent():
|
||||||
|
self.sidebar.select_row(self.added_row_box.get_parent())
|
||||||
|
restored = True
|
||||||
|
|
||||||
|
if added_missing := (
|
||||||
|
not shared.store.source_games.get("imported")
|
||||||
|
or not (removed := get_removed("imported"))
|
||||||
|
):
|
||||||
|
self.sidebar.select_row(self.all_games_row_box.get_parent())
|
||||||
|
else:
|
||||||
|
games_no = len(shared.store.source_games["imported"]) - removed[0]
|
||||||
|
self.added_games_no_label.set_label(str(games_no))
|
||||||
|
total_games_no += games_no
|
||||||
|
self.added_row_box.get_parent().set_visible(not added_missing)
|
||||||
|
|
||||||
|
self.sidebar.get_row_at_index(2).set_visible(False)
|
||||||
|
|
||||||
|
while row := self.sidebar.get_row_at_index(3):
|
||||||
|
self.sidebar.remove(row)
|
||||||
|
|
||||||
|
for source_id in shared.store.source_games:
|
||||||
|
if source_id == "imported":
|
||||||
|
continue
|
||||||
|
if not (removed := get_removed(source_id)):
|
||||||
|
continue
|
||||||
|
|
||||||
|
row = Gtk.Box(
|
||||||
|
margin_top=12,
|
||||||
|
margin_bottom=12,
|
||||||
|
margin_start=6,
|
||||||
|
margin_end=6,
|
||||||
|
spacing=12,
|
||||||
|
)
|
||||||
|
games_no = len(shared.store.source_games[source_id]) - removed[0]
|
||||||
|
total_games_no += games_no
|
||||||
|
|
||||||
|
row.append(
|
||||||
|
Gtk.Image.new_from_icon_name(
|
||||||
|
"user-desktop-symbolic"
|
||||||
|
if (split_id := source_id.split("_")[0]) == "desktop"
|
||||||
|
else f"{split_id}-source-symbolic"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
row.append(
|
||||||
|
Gtk.Label(
|
||||||
|
label=self.get_application().get_source_name(source_id),
|
||||||
|
halign=Gtk.Align.START,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
row.append(
|
||||||
|
games_no_label := Gtk.Label(
|
||||||
|
label=games_no,
|
||||||
|
hexpand=True,
|
||||||
|
halign=Gtk.Align.END,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
games_no_label.add_css_class("dim-label")
|
||||||
|
|
||||||
|
# Order rows based on the number of games in them
|
||||||
|
index = 3
|
||||||
|
while source_row := self.sidebar.get_row_at_index(index):
|
||||||
|
if self.source_rows[source_row][1] < games_no:
|
||||||
|
self.sidebar.insert(row, index)
|
||||||
|
break
|
||||||
|
index += 1
|
||||||
|
if not row.get_parent():
|
||||||
|
self.sidebar.append(row)
|
||||||
|
|
||||||
|
self.source_rows[row.get_parent()] = (
|
||||||
|
source_id,
|
||||||
|
games_no,
|
||||||
|
)
|
||||||
|
|
||||||
|
if source_id == selected_id:
|
||||||
|
self.sidebar.select_row(row.get_parent())
|
||||||
|
restored = True
|
||||||
|
|
||||||
|
self.sidebar.get_row_at_index(2).set_visible(True)
|
||||||
|
|
||||||
|
self.all_games_no_label.set_label(str(total_games_no))
|
||||||
|
|
||||||
|
if not restored:
|
||||||
|
self.sidebar.select_row(self.all_games_row_box.get_parent())
|
||||||
|
|
||||||
|
def row_selected(self, _widget: Any, row: Gtk.ListBoxRow | None) -> None:
|
||||||
|
if not row:
|
||||||
|
return
|
||||||
|
match row.get_child():
|
||||||
|
case self.all_games_row_box:
|
||||||
|
value = "all"
|
||||||
|
case self.added_row_box:
|
||||||
|
value = "imported"
|
||||||
|
case _:
|
||||||
|
value = self.source_rows[row][0]
|
||||||
|
|
||||||
|
self.library_page.set_title(self.get_application().get_source_name(value))
|
||||||
|
|
||||||
|
self.filter_state = value
|
||||||
|
self.library.invalidate_filter()
|
||||||
|
|
||||||
|
if self.overlay_split_view.get_collapsed():
|
||||||
|
self.overlay_split_view.set_show_sidebar(False)
|
||||||
|
|
||||||
|
def __init__(self, **kwargs: Any) -> None:
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
|
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.library.set_filter_func(self.filter_func)
|
||||||
|
self.hidden_library.set_filter_func(self.filter_func)
|
||||||
|
|
||||||
|
self.library.set_sort_func(self.sort_func)
|
||||||
|
self.hidden_library.set_sort_func(self.sort_func)
|
||||||
|
|
||||||
|
self.set_library_child()
|
||||||
|
|
||||||
|
self.notice_empty.set_icon_name(shared.APP_ID + "-symbolic")
|
||||||
|
|
||||||
|
self.overlay_split_view.set_show_sidebar(
|
||||||
|
shared.state_schema.get_boolean("show-sidebar")
|
||||||
|
)
|
||||||
|
|
||||||
|
self.sidebar.select_row(self.all_games_row_box.get_parent())
|
||||||
|
|
||||||
|
if shared.PROFILE == "development":
|
||||||
|
self.add_css_class("devel")
|
||||||
|
|
||||||
|
# Connect search entries
|
||||||
|
self.search_bar.connect_entry(self.search_entry)
|
||||||
|
self.hidden_search_bar.connect_entry(self.hidden_search_entry)
|
||||||
|
|
||||||
|
# Connect signals
|
||||||
|
self.search_entry.connect("search-changed", self.search_changed, False)
|
||||||
|
self.hidden_search_entry.connect("search-changed", self.search_changed, True)
|
||||||
|
|
||||||
|
self.search_entry.connect("activate", self.show_details_page_search)
|
||||||
|
self.hidden_search_entry.connect("activate", self.show_details_page_search)
|
||||||
|
|
||||||
|
self.navigation_view.connect("popped", self.set_show_hidden)
|
||||||
|
self.navigation_view.connect("pushed", self.set_show_hidden)
|
||||||
|
|
||||||
|
self.sidebar.connect("row-selected", self.row_selected)
|
||||||
|
|
||||||
|
style_manager = Adw.StyleManager.get_default()
|
||||||
|
style_manager.connect("notify::dark", self.set_details_view_opacity)
|
||||||
|
style_manager.connect("notify::high-contrast", self.set_details_view_opacity)
|
||||||
|
|
||||||
|
# Allow for a custom number of rows for the library
|
||||||
|
if shared.schema.get_uint("library-rows"):
|
||||||
|
shared.schema.bind(
|
||||||
|
"library-rows",
|
||||||
|
self.library,
|
||||||
|
"max-children-per-line",
|
||||||
|
Gio.SettingsBindFlags.DEFAULT,
|
||||||
|
)
|
||||||
|
shared.schema.bind(
|
||||||
|
"library-rows",
|
||||||
|
self.hidden_library,
|
||||||
|
"max-children-per-line",
|
||||||
|
Gio.SettingsBindFlags.DEFAULT,
|
||||||
|
)
|
||||||
|
|
||||||
|
def search_changed(self, _widget: Any, hidden: bool) -> None:
|
||||||
|
# Refresh search filter on keystroke in search box
|
||||||
|
(self.hidden_library if hidden else self.library).invalidate_filter()
|
||||||
|
|
||||||
|
def set_library_child(self) -> None:
|
||||||
|
child, hidden_child = self.notice_empty, self.hidden_notice_empty
|
||||||
|
|
||||||
|
for game in shared.store:
|
||||||
|
if game.removed or game.blacklisted:
|
||||||
|
continue
|
||||||
|
if game.hidden:
|
||||||
|
if game.filtered and hidden_child:
|
||||||
|
hidden_child = self.hidden_notice_no_results
|
||||||
|
continue
|
||||||
|
hidden_child = None
|
||||||
|
else:
|
||||||
|
if game.filtered and child:
|
||||||
|
child = self.notice_no_results
|
||||||
|
continue
|
||||||
|
child = None
|
||||||
|
|
||||||
|
def remove_from_overlay(widget: Gtk.Widget) -> None:
|
||||||
|
if isinstance(widget.get_parent(), Gtk.Overlay):
|
||||||
|
widget.get_parent().remove_overlay(widget)
|
||||||
|
|
||||||
|
if child:
|
||||||
|
self.library_overlay.add_overlay(child)
|
||||||
|
else:
|
||||||
|
remove_from_overlay(self.notice_empty)
|
||||||
|
remove_from_overlay(self.notice_no_results)
|
||||||
|
|
||||||
|
if hidden_child:
|
||||||
|
self.hidden_library_overlay.add_overlay(hidden_child)
|
||||||
|
else:
|
||||||
|
remove_from_overlay(self.hidden_notice_empty)
|
||||||
|
remove_from_overlay(self.hidden_notice_no_results)
|
||||||
|
|
||||||
|
def filter_func(self, child: Gtk.Widget) -> bool:
|
||||||
|
game = child.get_child()
|
||||||
|
text = (
|
||||||
|
(
|
||||||
|
self.hidden_search_entry
|
||||||
|
if self.navigation_view.get_visible_page() == self.hidden_library_page
|
||||||
|
else self.search_entry
|
||||||
|
)
|
||||||
|
.get_text()
|
||||||
|
.lower()
|
||||||
|
)
|
||||||
|
|
||||||
|
filtered = text != "" and not (
|
||||||
|
text in game.name.lower()
|
||||||
|
or (text in game.developer.lower() if game.developer else False)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not filtered:
|
||||||
|
if self.filter_state == "all":
|
||||||
|
pass
|
||||||
|
elif game.base_source != self.filter_state:
|
||||||
|
filtered = True
|
||||||
|
|
||||||
|
game.filtered = filtered
|
||||||
|
self.set_library_child()
|
||||||
|
|
||||||
|
return not filtered
|
||||||
|
|
||||||
|
def set_active_game(self, _widget: Any, _pspec: Any, game: Game) -> None:
|
||||||
|
self.active_game = game
|
||||||
|
|
||||||
|
def show_details_page(self, game: Game) -> None:
|
||||||
|
self.active_game = game
|
||||||
|
|
||||||
|
self.details_view_cover.set_opacity(int(not game.loading))
|
||||||
|
self.details_view_spinner.set_spinning(game.loading)
|
||||||
|
|
||||||
|
self.details_view_developer.set_label(game.developer or "")
|
||||||
|
self.details_view_developer.set_visible(bool(game.developer))
|
||||||
|
|
||||||
|
icon, text = "view-conceal-symbolic", _("Hide")
|
||||||
|
if game.hidden:
|
||||||
|
icon, text = "view-reveal-symbolic", _("Unhide")
|
||||||
|
|
||||||
|
self.details_view_hide_button.set_icon_name(icon)
|
||||||
|
self.details_view_hide_button.set_tooltip_text(text)
|
||||||
|
|
||||||
|
if self.details_view_game_cover:
|
||||||
|
self.details_view_game_cover.pictures.remove(self.details_view_cover)
|
||||||
|
|
||||||
|
self.details_view_game_cover = game.game_cover
|
||||||
|
self.details_view_game_cover.add_picture(self.details_view_cover)
|
||||||
|
|
||||||
|
self.details_view_blurred_cover.set_paintable(
|
||||||
|
self.details_view_game_cover.get_blurred()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.details_view_title.set_label(game.name)
|
||||||
|
self.details_page.set_title(game.name)
|
||||||
|
|
||||||
|
date = relative_date(game.added)
|
||||||
|
self.details_view_added.set_label(
|
||||||
|
# The variable is the date when the game was added
|
||||||
|
_("Added: {}").format(date)
|
||||||
|
)
|
||||||
|
last_played_date = (
|
||||||
|
relative_date(game.last_played) if game.last_played else _("Never")
|
||||||
|
)
|
||||||
|
self.details_view_last_played.set_label(
|
||||||
|
# The variable is the date when the game was last played
|
||||||
|
_("Last played: {}").format(last_played_date)
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.navigation_view.get_visible_page() != self.details_page:
|
||||||
|
self.navigation_view.push(self.details_page)
|
||||||
|
self.set_focus(self.details_view_play_button)
|
||||||
|
|
||||||
|
self.set_details_view_opacity()
|
||||||
|
|
||||||
|
def set_details_view_opacity(self, *_args: Any) -> None:
|
||||||
|
if self.navigation_view.get_visible_page() != self.details_page:
|
||||||
|
return
|
||||||
|
|
||||||
|
if (
|
||||||
|
style_manager := Adw.StyleManager.get_default()
|
||||||
|
).get_high_contrast() or not style_manager.get_system_supports_color_schemes():
|
||||||
|
self.details_view_blurred_cover.set_opacity(0.3)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.details_view_blurred_cover.set_opacity(
|
||||||
|
1 - self.details_view_game_cover.luminance[0] # type: ignore
|
||||||
|
if style_manager.get_dark()
|
||||||
|
else self.details_view_game_cover.luminance[1] # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
def sort_func(self, child1: Gtk.Widget, child2: Gtk.Widget) -> int:
|
||||||
|
var, order = "name", True
|
||||||
|
|
||||||
|
if self.sort_state in ("newest", "oldest"):
|
||||||
|
var, order = "added", self.sort_state == "newest"
|
||||||
|
elif self.sort_state == "last_played":
|
||||||
|
var = "last_played"
|
||||||
|
elif self.sort_state == "a-z":
|
||||||
|
order = False
|
||||||
|
|
||||||
|
def get_value(index: int) -> str:
|
||||||
|
return (
|
||||||
|
str(getattr((child1.get_child(), child2.get_child())[index], var))
|
||||||
|
.lower()
|
||||||
|
.removeprefix("the ")
|
||||||
|
)
|
||||||
|
|
||||||
|
if var != "name" and get_value(0) == get_value(1):
|
||||||
|
var, order = "name", False
|
||||||
|
|
||||||
|
return ((get_value(0) > get_value(1)) ^ order) * 2 - 1
|
||||||
|
|
||||||
|
def set_show_hidden(self, navigation_view: Adw.NavigationView, *_args: Any) -> None:
|
||||||
|
self.lookup_action("show_hidden").set_enabled(
|
||||||
|
navigation_view.get_visible_page() == self.library_page
|
||||||
|
)
|
||||||
|
|
||||||
|
def on_show_sidebar_action(self, *_args: Any) -> None:
|
||||||
|
shared.state_schema.set_boolean(
|
||||||
|
"show-sidebar", (value := not self.overlay_split_view.get_show_sidebar())
|
||||||
|
)
|
||||||
|
self.overlay_split_view.set_show_sidebar(value)
|
||||||
|
|
||||||
|
def on_go_to_parent_action(self, *_args: Any) -> None:
|
||||||
|
if self.navigation_view.get_visible_page() == self.details_page:
|
||||||
|
self.navigation_view.pop()
|
||||||
|
|
||||||
|
def on_go_home_action(self, *_args: Any) -> None:
|
||||||
|
self.navigation_view.pop_to_page(self.library_page)
|
||||||
|
|
||||||
|
def on_show_hidden_action(self, *_args: Any) -> None:
|
||||||
|
self.navigation_view.push(self.hidden_library_page)
|
||||||
|
|
||||||
|
def on_sort_action(self, action: Gio.SimpleAction, state: GLib.Variant) -> None:
|
||||||
|
action.set_state(state)
|
||||||
|
self.sort_state = str(state).strip("'")
|
||||||
|
self.library.invalidate_sort()
|
||||||
|
|
||||||
|
shared.state_schema.set_string("sort-mode", self.sort_state)
|
||||||
|
|
||||||
|
def on_toggle_search_action(self, *_args: Any) -> None:
|
||||||
|
if self.navigation_view.get_visible_page() == self.library_page:
|
||||||
|
search_bar = self.search_bar
|
||||||
|
search_entry = self.search_entry
|
||||||
|
elif self.navigation_view.get_visible_page() == self.hidden_library_page:
|
||||||
|
search_bar = self.hidden_search_bar
|
||||||
|
search_entry = self.hidden_search_entry
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
search_bar.set_search_mode(not (search_mode := search_bar.get_search_mode()))
|
||||||
|
|
||||||
|
if not search_mode:
|
||||||
|
self.set_focus(search_entry)
|
||||||
|
|
||||||
|
search_entry.set_text("")
|
||||||
|
|
||||||
|
def show_details_page_search(self, widget: Gtk.Widget) -> None:
|
||||||
|
library = (
|
||||||
|
self.hidden_library if widget == self.hidden_search_entry else self.library
|
||||||
|
)
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
while True:
|
||||||
|
if not (child := library.get_child_at_index(index)):
|
||||||
|
break
|
||||||
|
|
||||||
|
if self.filter_func(child):
|
||||||
|
self.show_details_page(child.get_child())
|
||||||
|
break
|
||||||
|
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
def on_undo_action(
|
||||||
|
self, _widget: Any, game: Optional[Game] = None, undo: Optional[str] = None
|
||||||
|
) -> None:
|
||||||
|
if not game: # If the action was activated via Ctrl + Z
|
||||||
|
if shared.importer and (
|
||||||
|
shared.importer.imported_game_ids or shared.importer.removed_game_ids
|
||||||
|
):
|
||||||
|
shared.importer.undo_import()
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
game = tuple(self.toasts.keys())[-1][0]
|
||||||
|
undo = tuple(self.toasts.keys())[-1][1]
|
||||||
|
except IndexError:
|
||||||
|
return
|
||||||
|
|
||||||
|
if game:
|
||||||
|
if undo == "hide":
|
||||||
|
game.toggle_hidden(False)
|
||||||
|
|
||||||
|
elif undo == "remove":
|
||||||
|
game.removed = False
|
||||||
|
game.save()
|
||||||
|
game.update()
|
||||||
|
|
||||||
|
self.toasts[(game, undo)].dismiss()
|
||||||
|
self.toasts.pop((game, undo))
|
||||||
|
|
||||||
|
def on_open_menu_action(self, *_args: Any) -> None:
|
||||||
|
if self.navigation_view.get_visible_page() == self.library_page:
|
||||||
|
self.primary_menu_button.popup()
|
||||||
|
elif self.navigation_view.get_visible_page() == self.hidden_library_page:
|
||||||
|
self.hidden_primary_menu_button.popup()
|
||||||
|
|
||||||
|
def on_close_action(self, *_args: Any) -> None:
|
||||||
|
self.close()
|
||||||
@@ -1,14 +1,25 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<gresources>
|
<gresources>
|
||||||
<gresource prefix="@PREFIX@">
|
<gresource prefix="@PREFIX@">
|
||||||
|
<file preprocess="xml-stripblanks">@APP_ID@.metainfo.xml</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/window.ui</file>
|
<file preprocess="xml-stripblanks">gtk/window.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/game.ui</file>
|
<file preprocess="xml-stripblanks">gtk/game.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/preferences.ui</file>
|
<file preprocess="xml-stripblanks">gtk/preferences.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/details-window.ui</file>
|
<file preprocess="xml-stripblanks">gtk/details-dialog.ui</file>
|
||||||
<file alias="style.css">gtk/style.css</file>
|
<file alias="style.css">gtk/style.css</file>
|
||||||
<file alias="style-dark.css">gtk/style-dark.css</file>
|
<file alias="style-dark.css">gtk/style-dark.css</file>
|
||||||
<file>library_placeholder.svg</file>
|
<file>library_placeholder.svg</file>
|
||||||
<file>library_placeholder_small.svg</file>
|
<file>library_placeholder_small.svg</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
<gresource prefix="@PREFIX@/icons/scalable/categories/">
|
||||||
|
<file alias="bottles-source-symbolic.svg">icons/sources/bottles-source-symbolic.svg</file>
|
||||||
|
<file alias="flatpak-source-symbolic.svg">icons/sources/flatpak-source-symbolic.svg</file>
|
||||||
|
<file alias="heroic-source-symbolic.svg">icons/sources/heroic-source-symbolic.svg</file>
|
||||||
|
<file alias="itch-source-symbolic.svg">icons/sources/itch-source-symbolic.svg</file>
|
||||||
|
<file alias="legendary-source-symbolic.svg">icons/sources/legendary-source-symbolic.svg</file>
|
||||||
|
<file alias="lutris-source-symbolic.svg">icons/sources/lutris-source-symbolic.svg</file>
|
||||||
|
<file alias="retroarch-source-symbolic.svg">icons/sources/retroarch-source-symbolic.svg</file>
|
||||||
|
<file alias="steam-source-symbolic.svg">icons/sources/steam-source-symbolic.svg</file>
|
||||||
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|||||||
@@ -1,21 +1,12 @@
|
|||||||
using Gtk 4.0;
|
using Gtk 4.0;
|
||||||
using Adw 1;
|
using Adw 1;
|
||||||
|
|
||||||
template $DetailsWindow : Adw.Window {
|
template $DetailsDialog : Adw.Dialog {
|
||||||
default-width: 500;
|
content-width: 480;
|
||||||
default-height: -1;
|
|
||||||
modal: true;
|
|
||||||
|
|
||||||
ShortcutController {
|
Adw.ToolbarView {
|
||||||
Shortcut {
|
|
||||||
trigger: "Escape";
|
|
||||||
action: "action(window.close)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Box {
|
|
||||||
orientation: vertical;
|
|
||||||
|
|
||||||
|
[top]
|
||||||
Adw.HeaderBar HeaderBar {
|
Adw.HeaderBar HeaderBar {
|
||||||
show-start-title-buttons: false;
|
show-start-title-buttons: false;
|
||||||
show-end-title-buttons: false;
|
show-end-title-buttons: false;
|
||||||
@@ -35,8 +26,6 @@ template $DetailsWindow : Adw.Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Adw.PreferencesPage {
|
Adw.PreferencesPage {
|
||||||
vexpand: true;
|
|
||||||
|
|
||||||
Adw.PreferencesGroup cover_group {
|
Adw.PreferencesGroup cover_group {
|
||||||
Adw.Clamp cover_clamp {
|
Adw.Clamp cover_clamp {
|
||||||
maximum-size: 200;
|
maximum-size: 200;
|
||||||
@@ -87,7 +76,7 @@ template $DetailsWindow : Adw.Window {
|
|||||||
Picture cover {
|
Picture cover {
|
||||||
width-request: 200;
|
width-request: 200;
|
||||||
height-request: 300;
|
height-request: 300;
|
||||||
|
|
||||||
styles [
|
styles [
|
||||||
"card"
|
"card"
|
||||||
]
|
]
|
||||||
@@ -97,39 +86,37 @@ template $DetailsWindow : Adw.Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.PreferencesGroup title_group {
|
Adw.PreferencesGroup {
|
||||||
title: _("Title");
|
Adw.EntryRow name {
|
||||||
description: _("The title of the game");
|
title: _("Title");
|
||||||
|
}
|
||||||
Entry name {
|
Adw.EntryRow developer {
|
||||||
accessibility {
|
title: _("Developer (optional)");
|
||||||
label: _("Title");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Adw.PreferencesGroup {
|
||||||
|
Adw.EntryRow executable {
|
||||||
|
title: _("Executable");
|
||||||
|
|
||||||
Adw.PreferencesGroup developer_group {
|
[suffix]
|
||||||
title: _("Developer");
|
Button file_chooser_button {
|
||||||
description: _("The developer or publisher (optional)");
|
valign: center;
|
||||||
|
icon-name: "document-open-symbolic";
|
||||||
|
tooltip-text: _("Select File");
|
||||||
|
|
||||||
Entry developer {
|
styles [
|
||||||
accessibility {
|
"flat",
|
||||||
label: _("Developer");
|
]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Adw.PreferencesGroup exec_group {
|
[suffix]
|
||||||
title: _("Executable");
|
MenuButton exec_info_button {
|
||||||
description: _("File to open or command to run when launching the game");
|
|
||||||
|
|
||||||
[header-suffix]
|
|
||||||
Gtk.MenuButton exec_info_button {
|
|
||||||
valign: center;
|
valign: center;
|
||||||
icon-name: "help-about-symbolic";
|
icon-name: "help-about-symbolic";
|
||||||
tooltip-text: _("More Info");
|
tooltip-text: _("More Info");
|
||||||
|
|
||||||
popover: Popover exec_info_popover {
|
popover: Popover exec_info_popover {
|
||||||
|
focusable: true;
|
||||||
|
|
||||||
Label exec_info_label {
|
Label exec_info_label {
|
||||||
use-markup: true;
|
use-markup: true;
|
||||||
@@ -141,7 +128,6 @@ template $DetailsWindow : Adw.Window {
|
|||||||
margin-bottom: 6;
|
margin-bottom: 6;
|
||||||
margin-start: 6;
|
margin-start: 6;
|
||||||
margin-end: 6;
|
margin-end: 6;
|
||||||
selectable: true;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -150,12 +136,8 @@ template $DetailsWindow : Adw.Window {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry executable {
|
|
||||||
accessibility {
|
|
||||||
label: _("Executable");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ template $Game : Box {
|
|||||||
|
|
||||||
Adw.Clamp {
|
Adw.Clamp {
|
||||||
maximum-size: 200;
|
maximum-size: 200;
|
||||||
|
unit: px;
|
||||||
|
|
||||||
Overlay {
|
Overlay {
|
||||||
[overlay]
|
[overlay]
|
||||||
@@ -98,38 +99,16 @@ template $Game : Box {
|
|||||||
|
|
||||||
menu game_options {
|
menu game_options {
|
||||||
section {
|
section {
|
||||||
item {
|
item (_("Edit"), "app.edit_game")
|
||||||
label: _("Edit");
|
item (_("Hide"), "app.hide_game")
|
||||||
action: "app.edit_game";
|
item (_("Remove"), "app.remove_game")
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("Hide");
|
|
||||||
action: "app.hide_game";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("Remove");
|
|
||||||
action: "app.remove_game";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu hidden_game_options {
|
menu hidden_game_options {
|
||||||
section {
|
section {
|
||||||
item {
|
item (_("Edit"), "app.edit_game")
|
||||||
label: _("Edit");
|
item (_("Unhide"), "app.hide_game")
|
||||||
action: "app.edit_game";
|
item (_("Remove"), "app.remove_game")
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("Unhide");
|
|
||||||
action: "app.hide_game";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("Remove");
|
|
||||||
action: "app.remove_game";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,23 +10,18 @@ ShortcutsWindow help_overlay {
|
|||||||
ShortcutsGroup {
|
ShortcutsGroup {
|
||||||
title: _("General");
|
title: _("General");
|
||||||
|
|
||||||
ShortcutsShortcut {
|
|
||||||
title: _("Quit");
|
|
||||||
action-name: "app.quit";
|
|
||||||
}
|
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Search");
|
title: _("Search");
|
||||||
action-name: "win.toggle_search";
|
action-name: "win.toggle_search";
|
||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Show preferences");
|
title: _("Preferences");
|
||||||
action-name: "app.preferences";
|
action-name: "app.preferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Shortcuts");
|
title: _("Keyboard Shortcuts");
|
||||||
action-name: "win.show-help-overlay";
|
action-name: "win.show-help-overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +31,17 @@ ShortcutsWindow help_overlay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Open menu");
|
title: _("Quit");
|
||||||
|
action-name: "app.quit";
|
||||||
|
}
|
||||||
|
|
||||||
|
ShortcutsShortcut {
|
||||||
|
title: _("Toggle Sidebar");
|
||||||
|
action-name: "win.show_sidebar";
|
||||||
|
}
|
||||||
|
|
||||||
|
ShortcutsShortcut {
|
||||||
|
title: _("Main Menu");
|
||||||
action-name: "win.open_menu";
|
action-name: "win.open_menu";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -45,22 +50,22 @@ ShortcutsWindow help_overlay {
|
|||||||
title: _("Games");
|
title: _("Games");
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Add new game");
|
title: _("Add Game");
|
||||||
action-name: "app.add_game";
|
action-name: "app.add_game";
|
||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Import games");
|
title: _("Import");
|
||||||
action-name: "app.import";
|
action-name: "app.import";
|
||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Show hidden games");
|
title: _("Show Hidden Games");
|
||||||
action-name: "win.show_hidden";
|
action-name: "win.show_hidden";
|
||||||
}
|
}
|
||||||
|
|
||||||
ShortcutsShortcut {
|
ShortcutsShortcut {
|
||||||
title: _("Remove game");
|
title: _("Remove Game");
|
||||||
action-name: "app.remove_game_details_view";
|
action-name: "app.remove_game_details_view";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Gtk 4.0;
|
using Gtk 4.0;
|
||||||
using Adw 1;
|
using Adw 1;
|
||||||
|
|
||||||
template $PreferencesWindow : Adw.PreferencesWindow {
|
template $CartridgesPreferences : Adw.PreferencesDialog {
|
||||||
default-height: 500;
|
search-enabled: true;
|
||||||
|
|
||||||
Adw.PreferencesPage general_page {
|
Adw.PreferencesPage general_page {
|
||||||
name: "general";
|
name: "general";
|
||||||
@@ -12,71 +12,99 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
Adw.PreferencesGroup behavior_group {
|
Adw.PreferencesGroup behavior_group {
|
||||||
title: _("Behavior");
|
title: _("Behavior");
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow exit_after_launch_switch {
|
||||||
title: _("Exit After Launching Games");
|
title: _("Exit After Launching Games");
|
||||||
activatable-widget: exit_after_launch_switch;
|
|
||||||
|
|
||||||
Switch exit_after_launch_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow cover_launches_game_switch {
|
||||||
title: _("Cover Image Launches Game");
|
title: _("Cover Image Launches Game");
|
||||||
subtitle: _("Swaps the behavior of the cover image and the play button");
|
subtitle: _("Swaps the behavior of the cover image and the play button");
|
||||||
activatable-widget: cover_launches_game_switch;
|
|
||||||
|
|
||||||
Switch cover_launches_game_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.PreferencesGroup images_group {
|
Adw.PreferencesGroup images_group {
|
||||||
title: _("Images");
|
title: _("Images");
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow high_quality_images_switch {
|
||||||
title: _("High Quality Images");
|
title: _("High Quality Images");
|
||||||
subtitle: _("Save game covers losslessly at the cost of storage");
|
subtitle: _("Save game covers losslessly at the cost of storage");
|
||||||
activatable-widget: high_quality_images_switch;
|
|
||||||
|
|
||||||
Switch high_quality_images_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.PreferencesGroup danger_zone_group {
|
Adw.PreferencesGroup danger_zone_group {
|
||||||
title: _("Danger Zone");
|
title: _("Danger Zone");
|
||||||
|
|
||||||
Adw.ActionRow {
|
ListBox remove_all_games_list_box {
|
||||||
title: _("Remove All Games");
|
Adw.PreferencesRow {
|
||||||
|
activatable: true;
|
||||||
|
selectable: false;
|
||||||
|
|
||||||
Button remove_all_games_button {
|
Box {
|
||||||
label: _("Remove");
|
spacing: 6;
|
||||||
valign: center;
|
valign: center;
|
||||||
|
halign: center;
|
||||||
|
|
||||||
|
Label {
|
||||||
|
label: _("Remove All Games");
|
||||||
|
ellipsize: end;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"heading",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
styles [
|
styles [
|
||||||
"destructive-action",
|
"header",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Adw.ActionRow reset_action_row {
|
|
||||||
title: "Reset App";
|
|
||||||
subtitle: "Completely resets and quits Cartridges";
|
|
||||||
visible: false;
|
|
||||||
|
|
||||||
Button reset_button {
|
|
||||||
label: "Reset";
|
|
||||||
valign: center;
|
|
||||||
|
|
||||||
styles [
|
styles [
|
||||||
"destructive-action",
|
"error",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"boxed-list",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.PreferencesGroup reset_group {
|
||||||
|
visible: false;
|
||||||
|
|
||||||
|
ListBox reset_list_box {
|
||||||
|
Adw.PreferencesRow {
|
||||||
|
activatable: true;
|
||||||
|
selectable: false;
|
||||||
|
|
||||||
|
Box {
|
||||||
|
spacing: 6;
|
||||||
|
valign: center;
|
||||||
|
halign: center;
|
||||||
|
|
||||||
|
Label {
|
||||||
|
label: "Reset App";
|
||||||
|
ellipsize: end;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"heading",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"header",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"error",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"boxed-list",
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +113,14 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Import");
|
title: _("Import");
|
||||||
icon-name: "document-save-symbolic";
|
icon-name: "document-save-symbolic";
|
||||||
|
|
||||||
|
Adw.PreferencesGroup import_behavior_group {
|
||||||
|
title: _("Behavior");
|
||||||
|
|
||||||
|
Adw.SwitchRow remove_missing_switch {
|
||||||
|
title: _("Remove Uninstalled Games");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Adw.PreferencesGroup sources_group {
|
Adw.PreferencesGroup sources_group {
|
||||||
title: _("Sources");
|
title: _("Sources");
|
||||||
|
|
||||||
@@ -92,12 +128,20 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Steam");
|
title: _("Steam");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "steam-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow steam_data_action_row {
|
Adw.ActionRow steam_data_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button steam_data_file_chooser_button {
|
Button steam_data_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,40 +150,29 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Lutris");
|
title: _("Lutris");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "lutris-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow lutris_data_action_row {
|
Adw.ActionRow lutris_data_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button lutris_data_file_chooser_button {
|
Button lutris_data_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow lutris_cache_action_row {
|
Adw.SwitchRow lutris_import_steam_switch {
|
||||||
title: _("Cache Location");
|
|
||||||
|
|
||||||
Button lutris_cache_file_chooser_button {
|
|
||||||
icon-name: "folder-symbolic";
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Adw.ActionRow {
|
|
||||||
title: _("Import Steam Games");
|
title: _("Import Steam Games");
|
||||||
activatable-widget: lutris_import_steam_switch;
|
|
||||||
|
|
||||||
Switch lutris_import_steam_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow lutris_import_flatpak_switch {
|
||||||
title: _("Import Flatpak Games");
|
title: _("Import Flatpak Games");
|
||||||
activatable-widget: lutris_import_flatpak_switch;
|
|
||||||
|
|
||||||
Switch lutris_import_flatpak_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,40 +180,37 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Heroic");
|
title: _("Heroic");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "heroic-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow heroic_config_action_row {
|
Adw.ActionRow heroic_config_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button heroic_config_file_chooser_button {
|
Button heroic_config_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow heroic_import_epic_switch {
|
||||||
title: _("Import Epic Games");
|
title: _("Import Epic Games");
|
||||||
activatable-widget: heroic_import_epic_switch;
|
|
||||||
|
|
||||||
Switch heroic_import_epic_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow heroic_import_gog_switch {
|
||||||
title: _("Import GOG Games");
|
title: _("Import GOG Games");
|
||||||
activatable-widget: heroic_import_gog_switch;
|
|
||||||
|
|
||||||
Switch heroic_import_gog_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow heroic_import_amazon_switch {
|
||||||
title: _("Import Sideloaded Games");
|
title: _("Import Amazon Games");
|
||||||
activatable-widget: heroic_import_sideload_switch;
|
}
|
||||||
|
|
||||||
Switch heroic_import_sideload_switch {
|
Adw.SwitchRow heroic_import_sideload_switch {
|
||||||
valign: center;
|
title: _("Import Sideloaded Games");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,12 +218,20 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Bottles");
|
title: _("Bottles");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "bottles-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow bottles_data_action_row {
|
Adw.ActionRow bottles_data_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button bottles_data_file_chooser_button {
|
Button bottles_data_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -202,12 +240,20 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("itch");
|
title: _("itch");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "itch-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow itch_config_action_row {
|
Adw.ActionRow itch_config_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button itch_config_file_chooser_button {
|
Button itch_config_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -216,12 +262,42 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Legendary");
|
title: _("Legendary");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "legendary-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ActionRow legendary_config_action_row {
|
Adw.ActionRow legendary_config_action_row {
|
||||||
title: _("Install Location");
|
title: _("Install Location");
|
||||||
|
|
||||||
Button legendary_config_file_chooser_button {
|
Button legendary_config_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.ExpanderRow retroarch_expander_row {
|
||||||
|
title: _("RetroArch");
|
||||||
|
show-enable-switch: true;
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "retroarch-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.ActionRow retroarch_config_action_row {
|
||||||
|
title: _("Install Location");
|
||||||
|
|
||||||
|
Button retroarch_config_file_chooser_button {
|
||||||
|
icon-name: "folder-symbolic";
|
||||||
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -230,23 +306,49 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
title: _("Flatpak");
|
title: _("Flatpak");
|
||||||
show-enable-switch: true;
|
show-enable-switch: true;
|
||||||
|
|
||||||
Adw.ActionRow flatpak_data_action_row {
|
[prefix]
|
||||||
title: _("Install Location");
|
Image {
|
||||||
|
icon-name: "flatpak-source-symbolic";
|
||||||
|
}
|
||||||
|
|
||||||
Button flatpak_data_file_chooser_button {
|
Adw.ActionRow flatpak_system_data_action_row {
|
||||||
|
// The location of the system-wide data directory
|
||||||
|
title: _("System Location");
|
||||||
|
|
||||||
|
Button flatpak_system_data_file_chooser_button {
|
||||||
icon-name: "folder-symbolic";
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow flatpak_import_launchers_row {
|
Adw.ActionRow flatpak_user_data_action_row {
|
||||||
title: _("Import Game Launchers");
|
// The location of the user-specific data directory
|
||||||
activatable-widget: flatpak_import_launchers_switch;
|
title: _("User Location");
|
||||||
|
|
||||||
Switch flatpak_import_launchers_switch {
|
Button flatpak_user_data_file_chooser_button {
|
||||||
|
icon-name: "folder-symbolic";
|
||||||
valign: center;
|
valign: center;
|
||||||
|
styles [
|
||||||
|
"flat"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Adw.SwitchRow flatpak_import_launchers_switch {
|
||||||
|
title: _("Import Game Launchers");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.SwitchRow desktop_switch {
|
||||||
|
title: _("Desktop Entries");
|
||||||
|
|
||||||
|
[prefix]
|
||||||
|
Image {
|
||||||
|
icon-name: "user-desktop-symbolic";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,31 +369,34 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
|||||||
Adw.PreferencesGroup sgdb_behavior_group {
|
Adw.PreferencesGroup sgdb_behavior_group {
|
||||||
title: _("Behavior");
|
title: _("Behavior");
|
||||||
|
|
||||||
Adw.ActionRow sgdb_switch_row {
|
Adw.SwitchRow sgdb_switch {
|
||||||
title: _("Use SteamGridDB");
|
title: _("Use SteamGridDB");
|
||||||
subtitle: _("Download images when adding or importing games");
|
subtitle: _("Download images when adding or importing games");
|
||||||
activatable-widget: sgdb_switch;
|
|
||||||
|
|
||||||
Switch sgdb_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow sgdb_prefer_switch {
|
||||||
title: _("Prefer Over Official Images");
|
title: _("Prefer Over Official Images");
|
||||||
activatable-widget: sgdb_prefer_switch;
|
|
||||||
|
|
||||||
Switch sgdb_prefer_switch {
|
|
||||||
valign: center;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.ActionRow {
|
Adw.SwitchRow sgdb_animated_switch {
|
||||||
title: _("Prefer Animated Images");
|
title: _("Prefer Animated Images");
|
||||||
activatable-widget: sgdb_animated_switch;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Switch sgdb_animated_switch {
|
Adw.PreferencesGroup {
|
||||||
valign: center;
|
Adw.ActionRow {
|
||||||
|
title: _("Update Covers");
|
||||||
|
subtitle: _("Fetch covers for games already in your library");
|
||||||
|
sensitive: bind sgdb_switch.active;
|
||||||
|
|
||||||
|
Stack sgdb_stack {
|
||||||
|
Button sgdb_fetch_button {
|
||||||
|
label: _("Update");
|
||||||
|
valign: center;
|
||||||
|
}
|
||||||
|
Spinner sgdb_spinner {
|
||||||
|
valign: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,325 +45,435 @@ Adw.StatusPage hidden_notice_empty {
|
|||||||
|
|
||||||
template $CartridgesWindow : Adw.ApplicationWindow {
|
template $CartridgesWindow : Adw.ApplicationWindow {
|
||||||
title: _("Cartridges");
|
title: _("Cartridges");
|
||||||
|
width-request: 360;
|
||||||
|
height-request: 100;
|
||||||
|
|
||||||
|
Adw.Breakpoint {
|
||||||
|
condition ("max-width: 564px")
|
||||||
|
setters {
|
||||||
|
overlay_split_view.collapsed: true;
|
||||||
|
details_view_box.orientation: vertical;
|
||||||
|
details_view_box.margin-top: 12;
|
||||||
|
details_view_box.margin-start: 12;
|
||||||
|
details_view_box.margin-end: 12;
|
||||||
|
details_view_details_box.margin-start: 0;
|
||||||
|
details_view_details_box.margin-end: 0;
|
||||||
|
details_view_title.margin-top: 30;
|
||||||
|
details_view_title.halign: center;
|
||||||
|
details_view_developer.halign: center;
|
||||||
|
details_view_date_box.halign: center;
|
||||||
|
details_view_toolbar.halign: center;
|
||||||
|
details_view_toolbar.orientation: vertical;
|
||||||
|
details_view_play_button.halign: center;
|
||||||
|
details_view_toolbar_buttons.margin-start: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Adw.ToastOverlay toast_overlay {
|
Adw.ToastOverlay toast_overlay {
|
||||||
Stack stack {
|
Adw.NavigationView navigation_view {
|
||||||
visible-child: library_view;
|
Adw.NavigationPage library_page {
|
||||||
transition-type: over_left;
|
title: _("All Games");
|
||||||
|
|
||||||
Overlay details_view {
|
Adw.OverlaySplitView overlay_split_view {
|
||||||
name: "details_view";
|
sidebar-width-fraction: .2;
|
||||||
|
|
||||||
[overlay]
|
[sidebar]
|
||||||
Box details_view_box {
|
Adw.NavigationPage {
|
||||||
orientation: vertical;
|
title: _("Cartridges");
|
||||||
|
Adw.ToolbarView {
|
||||||
Adw.HeaderBar {
|
[top]
|
||||||
[start]
|
Adw.HeaderBar {
|
||||||
Button back_button {
|
[start]
|
||||||
tooltip-text: _("Back");
|
Button {
|
||||||
action-name: "win.go_back";
|
icon-name: "sidebar-show-symbolic";
|
||||||
icon-name: "go-previous-symbolic";
|
action-name: "win.show_sidebar";
|
||||||
}
|
tooltip-text: _("Toggle Sidebar");
|
||||||
|
|
||||||
[title]
|
|
||||||
Adw.WindowTitle details_view_header_bar_title {
|
|
||||||
title: _("Game Details");
|
|
||||||
}
|
|
||||||
|
|
||||||
styles [
|
|
||||||
"flat",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
Adw.Bin {
|
|
||||||
hexpand: true;
|
|
||||||
vexpand: true;
|
|
||||||
|
|
||||||
Box {
|
|
||||||
halign: center;
|
|
||||||
valign: center;
|
|
||||||
margin-start: 24;
|
|
||||||
margin-end: 24;
|
|
||||||
margin-top: 24;
|
|
||||||
margin-bottom: 24;
|
|
||||||
|
|
||||||
Adw.Clamp {
|
|
||||||
maximum-size: 200;
|
|
||||||
|
|
||||||
Overlay {
|
|
||||||
[overlay]
|
|
||||||
Spinner details_view_spinner {
|
|
||||||
margin-start: 72;
|
|
||||||
margin-end: 72;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Picture details_view_cover {
|
ScrolledWindow {
|
||||||
halign: end;
|
ListBox sidebar {
|
||||||
|
Box all_games_row_box {
|
||||||
|
margin-top: 12;
|
||||||
|
margin-bottom: 12;
|
||||||
|
margin-start: 6;
|
||||||
|
margin-end: 6;
|
||||||
|
spacing: 12;
|
||||||
|
|
||||||
|
Image {
|
||||||
|
icon-name: "view-grid-symbolic";
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
halign: start;
|
||||||
|
label: _("All Games");
|
||||||
|
}
|
||||||
|
Label all_games_no_label {
|
||||||
|
hexpand: true;
|
||||||
|
halign: end;
|
||||||
|
|
||||||
|
styles ["dim-label"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Box added_row_box {
|
||||||
|
margin-top: 12;
|
||||||
|
margin-bottom: 12;
|
||||||
|
margin-start: 6;
|
||||||
|
spacing: 12;
|
||||||
|
|
||||||
|
Image {
|
||||||
|
icon-name: "list-add-symbolic";
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
halign: start;
|
||||||
|
label: _("Added");
|
||||||
|
margin-end: 6;
|
||||||
|
}
|
||||||
|
Label added_games_no_label {
|
||||||
|
hexpand: true;
|
||||||
|
halign: end;
|
||||||
|
margin-end: 6;
|
||||||
|
|
||||||
|
styles ["dim-label"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListBoxRow {
|
||||||
|
selectable: false;
|
||||||
|
activatable: false;
|
||||||
|
Label {
|
||||||
|
label: _("Imported");
|
||||||
|
styles ["heading"]
|
||||||
|
halign: start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
styles ["navigation-sidebar"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.ToolbarView library_view {
|
||||||
|
|
||||||
|
[top]
|
||||||
|
Adw.HeaderBar header_bar {
|
||||||
|
|
||||||
|
[start]
|
||||||
|
Revealer {
|
||||||
|
transition-type: slide_right;
|
||||||
|
reveal-child: bind overlay_split_view.show-sidebar inverted;
|
||||||
|
Button show_sidebar_button {
|
||||||
|
icon-name: "sidebar-show-symbolic";
|
||||||
|
action-name: "win.show_sidebar";
|
||||||
|
tooltip-text: _("Toggle Sidebar");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[start]
|
||||||
|
MenuButton {
|
||||||
|
tooltip-text: _("Add Game");
|
||||||
|
icon-name: "list-add-symbolic";
|
||||||
|
menu-model: add_games;
|
||||||
|
}
|
||||||
|
|
||||||
|
[end]
|
||||||
|
MenuButton primary_menu_button {
|
||||||
|
tooltip-text: _("Main Menu");
|
||||||
|
icon-name: "open-menu-symbolic";
|
||||||
|
menu-model: primary_menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
[end]
|
||||||
|
ToggleButton search_button {
|
||||||
|
tooltip-text: _("Search");
|
||||||
|
icon-name: "system-search-symbolic";
|
||||||
|
action-name: "win.toggle_search";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[top]
|
||||||
|
SearchBar search_bar {
|
||||||
|
search-mode-enabled: bind search_button.active bidirectional;
|
||||||
|
key-capture-widget: navigation_view;
|
||||||
|
|
||||||
|
Adw.Clamp {
|
||||||
|
maximum-size: 500;
|
||||||
|
tightening-threshold: 500;
|
||||||
|
|
||||||
|
SearchEntry search_entry {
|
||||||
|
placeholder-text: _("Search");
|
||||||
|
hexpand: true;
|
||||||
|
|
||||||
|
ShortcutController {
|
||||||
|
Shortcut {
|
||||||
|
trigger: "Escape";
|
||||||
|
action: "action(win.toggle_search)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Overlay library_overlay {
|
||||||
|
ScrolledWindow scrolledwindow {
|
||||||
|
FlowBox library {
|
||||||
|
homogeneous: true;
|
||||||
|
halign: center;
|
||||||
valign: start;
|
valign: start;
|
||||||
width-request: 200;
|
column-spacing: 12;
|
||||||
height-request: 300;
|
row-spacing: 12;
|
||||||
|
margin-top: 15;
|
||||||
styles [
|
margin-bottom: 15;
|
||||||
"card",
|
margin-start: 15;
|
||||||
]
|
margin-end: 15;
|
||||||
|
selection-mode: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Box {
|
Adw.NavigationPage hidden_library_page {
|
||||||
orientation: vertical;
|
title: _("Hidden Games");
|
||||||
margin-start: 48;
|
|
||||||
vexpand: true;
|
Adw.ToolbarView hidden_library_view {
|
||||||
|
[top]
|
||||||
|
Adw.HeaderBar hidden_header_bar {
|
||||||
|
[end]
|
||||||
|
MenuButton hidden_primary_menu_button {
|
||||||
|
tooltip-text: _("Main Menu");
|
||||||
|
icon-name: "open-menu-symbolic";
|
||||||
|
menu-model: primary_menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
[end]
|
||||||
|
ToggleButton hidden_search_button {
|
||||||
|
tooltip-text: _("Search");
|
||||||
|
icon-name: "system-search-symbolic";
|
||||||
|
action-name: "win.toggle_search";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[top]
|
||||||
|
SearchBar hidden_search_bar {
|
||||||
|
search-mode-enabled: bind hidden_search_button.active bidirectional;
|
||||||
|
key-capture-widget: hidden_library_view;
|
||||||
|
|
||||||
|
Adw.Clamp {
|
||||||
|
maximum-size: 500;
|
||||||
|
tightening-threshold: 500;
|
||||||
|
|
||||||
|
SearchEntry hidden_search_entry {
|
||||||
|
placeholder-text: _("Search");
|
||||||
|
hexpand: true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Overlay hidden_library_overlay {
|
||||||
|
ScrolledWindow hidden_scrolledwindow {
|
||||||
|
FlowBox hidden_library {
|
||||||
|
homogeneous: true;
|
||||||
|
halign: center;
|
||||||
|
valign: start;
|
||||||
|
column-spacing: 12;
|
||||||
|
row-spacing: 12;
|
||||||
|
margin-top: 15;
|
||||||
|
margin-bottom: 15;
|
||||||
|
margin-start: 15;
|
||||||
|
margin-end: 15;
|
||||||
|
selection-mode: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"background",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.NavigationPage details_page {
|
||||||
|
title: _("Game Details");
|
||||||
|
|
||||||
|
Overlay details_view {
|
||||||
|
name: "details_view";
|
||||||
|
|
||||||
|
[overlay]
|
||||||
|
Adw.ToolbarView details_view_toolbar_view {
|
||||||
|
|
||||||
|
[top]
|
||||||
|
Adw.HeaderBar {
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrolledWindow {
|
||||||
|
Box details_view_box {
|
||||||
|
halign: center;
|
||||||
|
valign: center;
|
||||||
|
margin-start: 24;
|
||||||
|
margin-end: 24;
|
||||||
|
margin-top: 24;
|
||||||
|
margin-bottom: 24;
|
||||||
|
|
||||||
|
Adw.Clamp {
|
||||||
|
maximum-size: 200;
|
||||||
|
|
||||||
|
Overlay {
|
||||||
|
[overlay]
|
||||||
|
Spinner details_view_spinner {
|
||||||
|
margin-start: 72;
|
||||||
|
margin-end: 72;
|
||||||
|
}
|
||||||
|
|
||||||
|
Picture details_view_cover {
|
||||||
|
halign: end;
|
||||||
|
valign: start;
|
||||||
|
width-request: 200;
|
||||||
|
height-request: 300;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"card",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Box details_view_details_box {
|
||||||
|
orientation: vertical;
|
||||||
|
margin-start: 48;
|
||||||
|
vexpand: true;
|
||||||
|
valign: center;
|
||||||
|
|
||||||
|
Label details_view_title {
|
||||||
|
label: _("Game Title");
|
||||||
|
hexpand: true;
|
||||||
|
halign: start;
|
||||||
|
max-width-chars: 24;
|
||||||
|
wrap: true;
|
||||||
|
wrap-mode: word_char;
|
||||||
|
natural-wrap-mode: word;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"title-1",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Label details_view_developer {
|
||||||
|
margin-top: 6;
|
||||||
|
hexpand: true;
|
||||||
|
halign: start;
|
||||||
|
max-width-chars: 36;
|
||||||
|
wrap: true;
|
||||||
|
wrap-mode: word_char;
|
||||||
|
natural-wrap-mode: word;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"heading",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Box details_view_date_box {
|
||||||
|
orientation: horizontal;
|
||||||
|
margin-top: 15;
|
||||||
|
hexpand: true;
|
||||||
|
halign: start;
|
||||||
|
|
||||||
|
Label details_view_added {
|
||||||
|
wrap: true;
|
||||||
|
wrap-mode: word_char;
|
||||||
|
natural-wrap-mode: word;
|
||||||
|
justify: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
Label details_view_last_played {
|
||||||
|
margin-start: 12;
|
||||||
|
wrap: true;
|
||||||
|
wrap-mode: word_char;
|
||||||
|
natural-wrap-mode: word;
|
||||||
|
justify: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Box details_view_toolbar {
|
||||||
|
hexpand: true;
|
||||||
|
vexpand: true;
|
||||||
|
valign: center;
|
||||||
|
|
||||||
|
Button details_view_play_button {
|
||||||
|
name: "details_view_play_button";
|
||||||
|
action-name: "app.launch_game";
|
||||||
|
label: _("Play");
|
||||||
|
halign: start;
|
||||||
|
margin-top: 24;
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"opaque",
|
||||||
|
"pill",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Box details_view_toolbar_buttons {
|
||||||
|
halign: start;
|
||||||
valign: center;
|
valign: center;
|
||||||
|
margin-top: 24;
|
||||||
|
margin-start: 9;
|
||||||
|
|
||||||
Label details_view_title {
|
Button {
|
||||||
label: _("Game Title");
|
icon-name: "document-edit-symbolic";
|
||||||
hexpand: true;
|
action-name: "app.edit_game";
|
||||||
halign: start;
|
tooltip-text: _("Edit");
|
||||||
max-width-chars: 24;
|
|
||||||
wrap: true;
|
|
||||||
wrap-mode: word_char;
|
|
||||||
natural-wrap-mode: word;
|
|
||||||
|
|
||||||
styles [
|
styles [
|
||||||
"title-1",
|
"raised",
|
||||||
|
"circular",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
Label details_view_developer {
|
Button details_view_hide_button {
|
||||||
margin-top: 6;
|
action-name: "app.hide_game";
|
||||||
hexpand: true;
|
|
||||||
halign: start;
|
|
||||||
max-width-chars: 36;
|
|
||||||
wrap: true;
|
|
||||||
wrap-mode: word_char;
|
|
||||||
natural-wrap-mode: word;
|
|
||||||
|
|
||||||
styles [
|
styles [
|
||||||
"heading",
|
"raised",
|
||||||
|
"circular",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
Box {
|
Button {
|
||||||
orientation: horizontal;
|
icon-name: "user-trash-symbolic";
|
||||||
margin-top: 15;
|
action-name: "app.remove_game";
|
||||||
hexpand: true;
|
tooltip-text: _("Remove");
|
||||||
halign: start;
|
|
||||||
|
|
||||||
Label details_view_added {
|
styles [
|
||||||
wrap: true;
|
"raised",
|
||||||
wrap-mode: word_char;
|
"circular",
|
||||||
natural-wrap-mode: word;
|
]
|
||||||
}
|
|
||||||
|
|
||||||
Label details_view_last_played {
|
|
||||||
margin-start: 12;
|
|
||||||
wrap: true;
|
|
||||||
wrap-mode: word_char;
|
|
||||||
natural-wrap-mode: word;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Box {
|
MenuButton {
|
||||||
hexpand: true;
|
icon-name: "system-search-symbolic";
|
||||||
vexpand: true;
|
menu-model: search;
|
||||||
valign: center;
|
tooltip-text: _("Search");
|
||||||
|
|
||||||
Button details_view_play_button {
|
styles [
|
||||||
name: "details_view_play_button";
|
"raised",
|
||||||
action-name: "app.launch_game";
|
"circular",
|
||||||
label: _("Play");
|
]
|
||||||
halign: start;
|
|
||||||
margin-top: 24;
|
|
||||||
|
|
||||||
styles [
|
|
||||||
"opaque",
|
|
||||||
"pill",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
Box {
|
|
||||||
halign: start;
|
|
||||||
valign: center;
|
|
||||||
margin-top: 24;
|
|
||||||
margin-start: 9;
|
|
||||||
|
|
||||||
Button {
|
|
||||||
icon-name: "document-edit-symbolic";
|
|
||||||
action-name: "app.edit_game";
|
|
||||||
tooltip-text: _("Edit");
|
|
||||||
|
|
||||||
styles ["raised", "circular"]
|
|
||||||
}
|
|
||||||
|
|
||||||
Button details_view_hide_button {
|
|
||||||
action-name: "app.hide_game";
|
|
||||||
|
|
||||||
styles ["raised", "circular"]
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
icon-name: "user-trash-symbolic";
|
|
||||||
action-name: "app.remove_game";
|
|
||||||
tooltip-text: _("Remove");
|
|
||||||
|
|
||||||
styles ["raised", "circular"]
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuButton {
|
|
||||||
icon-name: "system-search-symbolic";
|
|
||||||
menu-model: search;
|
|
||||||
tooltip-text: _("Search");
|
|
||||||
|
|
||||||
styles ["raised", "circular"]
|
|
||||||
}
|
|
||||||
|
|
||||||
styles [
|
|
||||||
"toolbar",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
styles [
|
||||||
|
"toolbar",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Picture details_view_blurred_cover {
|
|
||||||
keep-aspect-ratio: false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Box library_view {
|
Picture details_view_blurred_cover {
|
||||||
orientation: vertical;
|
keep-aspect-ratio: false;
|
||||||
|
|
||||||
Adw.HeaderBar header_bar {
|
|
||||||
[start]
|
|
||||||
MenuButton {
|
|
||||||
tooltip-text: _("Add Game");
|
|
||||||
icon-name: "list-add-symbolic";
|
|
||||||
menu-model: add_games;
|
|
||||||
}
|
|
||||||
|
|
||||||
[end]
|
|
||||||
MenuButton primary_menu_button {
|
|
||||||
tooltip-text: _("Main Menu");
|
|
||||||
icon-name: "open-menu-symbolic";
|
|
||||||
menu-model: primary_menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
[end]
|
|
||||||
ToggleButton search_button {
|
|
||||||
tooltip-text: _("Search");
|
|
||||||
icon-name: "system-search-symbolic";
|
|
||||||
action-name: "win.toggle_search";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SearchBar search_bar {
|
|
||||||
search-mode-enabled: bind-property search_button.active bidirectional;
|
|
||||||
key-capture-widget: library_view;
|
|
||||||
|
|
||||||
Adw.Clamp {
|
|
||||||
maximum-size: 500;
|
|
||||||
tightening-threshold: 500;
|
|
||||||
|
|
||||||
SearchEntry search_entry {
|
|
||||||
hexpand: true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Adw.Bin library_bin {
|
|
||||||
ScrolledWindow scrolledwindow {
|
|
||||||
hexpand: true;
|
|
||||||
vexpand: true;
|
|
||||||
|
|
||||||
FlowBox library {
|
|
||||||
homogeneous: true;
|
|
||||||
halign: center;
|
|
||||||
valign: start;
|
|
||||||
column-spacing: 12;
|
|
||||||
row-spacing: 12;
|
|
||||||
margin-top: 15;
|
|
||||||
margin-bottom: 15;
|
|
||||||
margin-start: 15;
|
|
||||||
margin-end: 15;
|
|
||||||
selection-mode: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Box hidden_library_view {
|
|
||||||
orientation: vertical;
|
|
||||||
|
|
||||||
Adw.HeaderBar hidden_header_bar {
|
|
||||||
[start]
|
|
||||||
Button hidden_back_button {
|
|
||||||
tooltip-text: _("Back");
|
|
||||||
action-name: "win.go_back";
|
|
||||||
icon-name: "go-previous-symbolic";
|
|
||||||
}
|
|
||||||
|
|
||||||
[title]
|
|
||||||
Adw.WindowTitle {
|
|
||||||
title: _("Hidden Games");
|
|
||||||
}
|
|
||||||
|
|
||||||
[end]
|
|
||||||
MenuButton hidden_primary_menu_button {
|
|
||||||
tooltip-text: _("Main Menu");
|
|
||||||
icon-name: "open-menu-symbolic";
|
|
||||||
menu-model: primary_menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
[end]
|
|
||||||
ToggleButton hidden_search_button {
|
|
||||||
tooltip-text: _("Search");
|
|
||||||
icon-name: "system-search-symbolic";
|
|
||||||
action-name: "win.toggle_search";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SearchBar hidden_search_bar {
|
|
||||||
search-mode-enabled: bind-property hidden_search_button.active bidirectional;
|
|
||||||
key-capture-widget: hidden_library_view;
|
|
||||||
|
|
||||||
Adw.Clamp {
|
|
||||||
maximum-size: 500;
|
|
||||||
tightening-threshold: 500;
|
|
||||||
|
|
||||||
SearchEntry hidden_search_entry {
|
|
||||||
hexpand: true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Adw.Bin hidden_library_bin {
|
|
||||||
ScrolledWindow hidden_scrolledwindow {
|
|
||||||
hexpand: true;
|
|
||||||
vexpand: true;
|
|
||||||
|
|
||||||
FlowBox hidden_library {
|
|
||||||
homogeneous: true;
|
|
||||||
halign: center;
|
|
||||||
valign: start;
|
|
||||||
column-spacing: 12;
|
|
||||||
row-spacing: 12;
|
|
||||||
margin-top: 15;
|
|
||||||
margin-bottom: 15;
|
|
||||||
margin-start: 15;
|
|
||||||
margin-end: 15;
|
|
||||||
selection-mode: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
styles [
|
|
||||||
"background",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,36 +522,19 @@ menu primary_menu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
section {
|
section {
|
||||||
item {
|
item (_("Preferences"), "app.preferences")
|
||||||
label: _("Preferences");
|
item (_("Keyboard Shortcuts"), "win.show-help-overlay")
|
||||||
action: "app.preferences";
|
item (_("About Cartridges"), "app.about")
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("Keyboard Shortcuts");
|
|
||||||
action: "win.show-help-overlay";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: _("About Cartridges");
|
|
||||||
action: "app.about";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu add_games {
|
menu add_games {
|
||||||
section {
|
section {
|
||||||
item {
|
item (_("Add Game"), "app.add_game")
|
||||||
label: _("Add Game");
|
|
||||||
action: "app.add_game";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
section {
|
section {
|
||||||
item {
|
item (_("Import"), "app.import")
|
||||||
label: _("Import");
|
|
||||||
action: "app.import";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,29 +542,10 @@ menu search {
|
|||||||
section {
|
section {
|
||||||
label: "Search on…";
|
label: "Search on…";
|
||||||
|
|
||||||
item {
|
item (_("IGDB"), "app.igdb_search")
|
||||||
label: "IGDB";
|
item (_("SteamGridDB"), "app.sgdb_search")
|
||||||
action: "app.igdb_search";
|
item (_("ProtonDB"), "app.protondb_search")
|
||||||
}
|
item (_("Lutris"), "app.lutris_search")
|
||||||
|
item (_("HowLongToBeat"), "app.hltb_search")
|
||||||
item {
|
|
||||||
label: "SteamGridDB";
|
|
||||||
action: "app.sgdb_search";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: "ProtonDB";
|
|
||||||
action: "app.protondb_search";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: "Lutris";
|
|
||||||
action: "app.lutris_search";
|
|
||||||
}
|
|
||||||
|
|
||||||
item {
|
|
||||||
label: "HowLongToBeat";
|
|
||||||
action: "app.hltb_search";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,5 +7,5 @@ Icon=@APP_ID@
|
|||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=GNOME;GTK;Game;
|
Categories=GNOME;GTK;Game;
|
||||||
Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;
|
Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<schemalist gettext-domain="cartridges">
|
<schemalist gettext-domain="cartridges">
|
||||||
|
|
||||||
<schema id="@APP_ID@" path="@PREFIX@/">
|
<schema id="@APP_ID@" path="@PREFIX@/">
|
||||||
<key name="exit-after-launch" type="b">
|
<key name="exit-after-launch" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
@@ -10,11 +11,14 @@
|
|||||||
<key name="high-quality-images" type="b">
|
<key name="high-quality-images" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="remove-missing" type="b">
|
||||||
|
<default>true</default>
|
||||||
|
</key>
|
||||||
<key name="steam" type="b">
|
<key name="steam" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="steam-location" type="s">
|
<key name="steam-location" type="s">
|
||||||
<default>"~/.steam/"</default>
|
<default>"~/.steam/steam"</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="lutris" type="b">
|
<key name="lutris" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
@@ -43,6 +47,9 @@
|
|||||||
<key name="heroic-import-gog" type="b">
|
<key name="heroic-import-gog" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="heroic-import-amazon" type="b">
|
||||||
|
<default>true</default>
|
||||||
|
</key>
|
||||||
<key name="heroic-import-sideload" type="b">
|
<key name="heroic-import-sideload" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
</key>
|
</key>
|
||||||
@@ -64,12 +71,24 @@
|
|||||||
<key name="legendary-location" type="s">
|
<key name="legendary-location" type="s">
|
||||||
<default>"~/.config/legendary/"</default>
|
<default>"~/.config/legendary/"</default>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="retroarch" type="b">
|
||||||
|
<default>true</default>
|
||||||
|
</key>
|
||||||
|
<key name="retroarch-location" type="s">
|
||||||
|
<default>"~/.var/app/org.libretro.RetroArch/config/retroarch/"</default>
|
||||||
|
</key>
|
||||||
|
<key name="desktop" type="b">
|
||||||
|
<default>true</default>
|
||||||
|
</key>
|
||||||
<key name="flatpak" type="b">
|
<key name="flatpak" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="flatpak-location" type="s">
|
<key name="flatpak-system-location" type="s">
|
||||||
<default>"/var/lib/flatpak/"</default>
|
<default>"/var/lib/flatpak/"</default>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="flatpak-user-location" type="s">
|
||||||
|
<default>"~/.local/share/flatpak/"</default>
|
||||||
|
</key>
|
||||||
<key name="flatpak-import-launchers" type="b">
|
<key name="flatpak-import-launchers" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
</key>
|
</key>
|
||||||
@@ -85,13 +104,17 @@
|
|||||||
<key name="sgdb-animated" type="b">
|
<key name="sgdb-animated" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="library-rows" type="u">
|
||||||
|
<default>0</default>
|
||||||
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="@APP_ID@.State" path="@PREFIX@/State/">
|
<schema id="@APP_ID@.State" path="@PREFIX@/State/">
|
||||||
<key name="width" type="i">
|
<key name="width" type="i">
|
||||||
<default>1110</default>
|
<default>1170</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="height" type="i">
|
<key name="height" type="i">
|
||||||
<default>820</default>
|
<default>795</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="is-maximized" type="b">
|
<key name="is-maximized" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
@@ -104,10 +127,13 @@
|
|||||||
<choice value="oldest" />
|
<choice value="oldest" />
|
||||||
<choice value="last_played" />
|
<choice value="last_played" />
|
||||||
</choices>
|
</choices>
|
||||||
<default>"a-z"</default>
|
<default>"last_played"</default>
|
||||||
|
</key>
|
||||||
|
<key name="show-sidebar" type="b">
|
||||||
|
<default>false</default>
|
||||||
</key>
|
</key>
|
||||||
<key name="steam-limiter-tokens-history" type="s">
|
<key name="steam-limiter-tokens-history" type="s">
|
||||||
<default>"[]"</default>
|
<default>"[]"</default>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
|||||||
@@ -11,31 +11,40 @@
|
|||||||
<url type="homepage">https://github.com/kra-mo/cartridges</url>
|
<url type="homepage">https://github.com/kra-mo/cartridges</url>
|
||||||
<url type="bugtracker">https://github.com/kra-mo/cartridges/issues</url>
|
<url type="bugtracker">https://github.com/kra-mo/cartridges/issues</url>
|
||||||
<url type="translate">https://hosted.weblate.org/engage/cartridges/</url>
|
<url type="translate">https://hosted.weblate.org/engage/cartridges/</url>
|
||||||
<url type="contact">https://www.kramo.hu/about/</url>
|
<url type="contact">https://www.kramo.page/about/</url>
|
||||||
<url type="vcs-browser">https://github.com/kra-mo/cartridges</url>
|
<url type="vcs-browser">https://github.com/kra-mo/cartridges</url>
|
||||||
<url type="contribute">https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md</url>
|
<url type="contribute">https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md</url>
|
||||||
|
<!-- developer_name tag deprecated with Appstream 1.0 -->
|
||||||
<developer_name translatable="no">kramo</developer_name>
|
<developer_name translatable="no">kramo</developer_name>
|
||||||
|
<developer id="page.kramo">
|
||||||
|
<name translatable="no">kramo</name>
|
||||||
|
</developer>
|
||||||
<launchable type="desktop-id">@APP_ID@.desktop</launchable>
|
<launchable type="desktop-id">@APP_ID@.desktop</launchable>
|
||||||
|
<translation type="gettext">cartridges</translation>
|
||||||
|
<branding>
|
||||||
|
<color type="primary" scheme_preference="light">#d5b0e7</color>
|
||||||
|
<color type="primary" scheme_preference="dark">#501a5c</color>
|
||||||
|
</branding>
|
||||||
<supports>
|
<supports>
|
||||||
<control>pointing</control>
|
<control>pointing</control>
|
||||||
<control>keyboard</control>
|
<control>keyboard</control>
|
||||||
<control>touch</control>
|
<control>touch</control>
|
||||||
</supports>
|
</supports>
|
||||||
<recommends>
|
<recommends>
|
||||||
<display_length compare="gt">545</display_length>
|
<display_length compare="ge">360</display_length>
|
||||||
</recommends>
|
</recommends>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/1.png</image>
|
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/1.png</image>
|
||||||
<caption>Library</caption>
|
<caption>Cartridges</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/2.png</image>
|
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/2.png</image>
|
||||||
<caption>Edit Game Details</caption>
|
<caption>Game Details</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/3.png</image>
|
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/3.png</image>
|
||||||
<caption>Game Details</caption>
|
<caption>Edit Game Details</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/4.png</image>
|
<image>https://raw.githubusercontent.com/kra-mo/cartridges/main/data/screenshots/4.png</image>
|
||||||
@@ -44,6 +53,83 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
<content_rating type="oars-1.1" />
|
<content_rating type="oars-1.1" />
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="2.8.1" date="2024-03-23">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>Fixes an issue with Lutris games not importing</li>
|
||||||
|
<li>Fixes an issue with file chooser buttons being unresponsive</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.8" date="2024-03-20">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>The app features new adaptive widgets taking advantage of developments in GNOME 46</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.7" date="2023-12-12">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>Flatpaks installed for the user and system-wide ones can now be imported separately</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.6" date="2023-10-11">
|
||||||
|
<description translatable="no">
|
||||||
|
<p>You can now search your Cartridges library from GNOME!</p>
|
||||||
|
<p>To enable the functionality, go to "Search" in the Settings app and toggle "Cartridges" on.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.5" date="2023-10-06">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>Added the ability to refetch covers from SteamGridDB</li>
|
||||||
|
<li>Fixed an issue with fractional scaling</li>
|
||||||
|
<li>Translations since 2.4</li>
|
||||||
|
</ul>
|
||||||
|
<p>The project now accepts donations. Thank you so much if you decide to donate! 💜</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.4" date="2023-09-21">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>Cartridges now adapts to smaller screen sizes</li>
|
||||||
|
<li>You can now filter games by import source</li>
|
||||||
|
<li>Ported to Libadwaita 1.4</li>
|
||||||
|
<li>Translations since 2.3</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.3" date="2023-08-29">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>New import source: desktop entries</li>
|
||||||
|
<li>Added the ability to pick executables via the file picker</li>
|
||||||
|
<li>Manually added covers are now padded if they are too short</li>
|
||||||
|
<li>Translations since 2.2</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.2" date="2023-08-17">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>New import source: RetroArch</li>
|
||||||
|
<li>Added the option to automatically remove uninstalled games on import</li>
|
||||||
|
<li>Added the ability to undo an import</li>
|
||||||
|
<li>Various UX improvements</li>
|
||||||
|
<li>Translations since 2.1</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="2.1" date="2023-07-25">
|
||||||
|
<description translatable="no">
|
||||||
|
<ul>
|
||||||
|
<li>Added support for Amazon Games in the Heroic importer</li>
|
||||||
|
<li>Translations since 2.0</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="2.0" date="2023-07-05">
|
<release version="2.0" date="2023-07-05">
|
||||||
<description translatable="no">
|
<description translatable="no">
|
||||||
<p>After months of work, Cartridges 2.0 is here:</p>
|
<p>After months of work, Cartridges 2.0 is here:</p>
|
||||||
|
|||||||
1
data/icons/sources/bottles-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.847 0v.616c0 .371-.17.786-.405 1.239C1.812 2.95 1.163 4.02 1.01 5.288L1 16h2l.01-10.712c.153-1.267.802-2.337 1.432-3.433.235-.453.405-.868.405-1.24V0h-2Zm4 0v.616c0 .371-.17.786-.404 1.239C5.812 2.95 5.163 4.02 5.01 5.288L5 16h2.001l.01-10.712c.153-1.267.801-2.337 1.432-3.433.235-.453.405-.868.405-1.24V0h-2Zm4.001 0v.616c-.315 1.678-1.632 3.165-1.837 4.672L9.001 16h5.693l-.008-10.7c-.32-1.815-1.385-3.08-1.838-4.684V0h-2Z" fill="#000"/></svg>
|
||||||
|
After Width: | Height: | Size: 532 B |
1
data/icons/sources/flatpak-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.805.02a.971.971 0 0 0-.36.148l-6 4A.998.998 0 0 0 1 5v6a1 1 0 0 0 .445.833l6 4c.337.223.774.223 1.11 0l6-4a.998.998 0 0 0 .446-.832V5a.998.998 0 0 0-.445-.832l-6-4a.994.994 0 0 0-.75-.149Zm.196 2.179V9l5-3.332v4.797l-5 3.337V9L3 5.668v-.133L8 2.2Z" fill="#000"/></svg>
|
||||||
|
After Width: | Height: | Size: 355 B |
1
data/icons/sources/heroic-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="m7.872 16-3.817-3.083L2 2.79 7.872 0l5.871 2.789-2.055 10.128L7.872 16Zm0-4.257-.294-.293-.88-7.927 1.1-1.908 1.174 1.908-.807 7.927-.293.293Zm-.294.367-.147.367-1.761.294-.294-.66.294-.662 1.761.294.147.367Zm-.073.734-.22 1.541.587.294.587-.294-.22-1.541-.367-.22-.367.22Zm.807-.367-.147-.367.147-.367 1.761-.293.294.66-.294.66-1.761-.293Z" fill="#000"/></svg>
|
||||||
|
After Width: | Height: | Size: 485 B |
1
data/icons/sources/itch-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.965 1.992C1.43 2.08 1 2.58 1 3.115V15.18c0 .534.43.894.965.806l12.066-1.979c.534-.088.964-.588.964-1.122V.82c0-.535-.43-.894-.964-.807L1.964 1.992Zm3.41 3.33c.555-.091.95.204 1.09.722l3.068-.503c.14-.564.532-.988 1.087-1.08.882-.144 1.851.602 2.154 1.659l.723 2.523c.302 1.056-.172 2.04-1.054 2.184-.774.127-1.615-.432-2.014-1.286l-4.863.798c-.399.984-1.24 1.82-2.014 1.946-.882.145-1.356-.683-1.054-1.838l.723-2.76c.303-1.157 1.272-2.22 2.154-2.365ZM7.282 6.58v.986l-.791.13L7.997 9.36 9.505 7.2l-.743.122v-.985l-1.48.243Z" fill="#000"/></svg>
|
||||||
|
After Width: | Height: | Size: 631 B |
1
data/icons/sources/legendary-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 6.355V1a1 1 0 0 1 1-1h2.893a1 1 0 0 1 .708.293l.645.645a1 1 0 0 0 .707.293h4.094a1 1 0 0 0 .707-.293L11.4.293A1 1 0 0 1 12.107 0H15a1 1 0 0 1 1 1v5.355a1 1 0 0 1-.293.707l-.23.23a1 1 0 0 0 0 1.415l.23.23a1 1 0 0 1 .293.708V15a1 1 0 0 1-1 1h-2.893a1 1 0 0 1-.708-.293l-.645-.645a1 1 0 0 0-.707-.293H5.953a1 1 0 0 0-.707.293l-.645.645a1 1 0 0 1-.708.293H1a1 1 0 0 1-1-1V9.645a1 1 0 0 1 .293-.707l.23-.23a1 1 0 0 0 0-1.415l-.23-.23A1 1 0 0 1 0 6.354ZM8 5a1 1 0 0 0-2 0v5.5a1 1 0 0 0 1 1h3a1 1 0 1 0 0-2H8V5Z" fill="#000"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
||||||
|
After Width: | Height: | Size: 757 B |
1
data/icons/sources/lutris-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 7.937C0 3.554 3.518 0 7.857 0c1.196 0 2.33.27 3.344.753.055-.118.181-.363.301-.371.158-.012.248.09.35.203l.001.002c.102.115.306.287.306.287s.929-.32 1.97.251c1.043.572 1.19.744 1.394 1.144.144.284.14.87.126 1.19a.248.248 0 0 0-.039-.004c-.17 0-.308.174-.308.387 0 .214.138.387.308.387a.256.256 0 0 0 .133-.039c.153.292.233.562.255.806-.05-.348-.544-.586-.544-.586s-.077.135-.243.215c-.025.012-.056.01-.091.006-.063-.007-.138-.014-.21.06-.239.484.345.888.617.877.265-.011.476-.276.475-.512.047.92-.74 1.461-1.495 1.374-.493-.058-.907-.249-1.383-.469a10.262 10.262 0 0 0-1.187-.483c-.951-.307-1.569-.47-2.322-.585-1.486-.227-2.557.12-3.061.424a5.84 5.84 0 0 0-.427.284c.772.15 1.236 1.329 1.25 1.65l.002.013v.007l.001.033c-.021.484-.247.845-.725.83a.823.823 0 0 1-.713-.426c-.014-.024-.028-.049-.044-.072a1.92 1.92 0 0 0-.965-.795c-.46.705-.715 1.548-.715 2.53 0 2.897 2.345 5.052 5.213 5.052.907 0 2.817-.309 4-1.28.226-.207.485-.438.725-.55-.862 2.161-3.479 3.488-6.299 3.403C3.534 15.996 0 12.321 0 7.937ZM13.415 4.02a.596.596 0 0 0 .593-.6.596.596 0 0 0-.593-.599.597.597 0 0 0-.594.6c0 .33.266.6.594.6Z" fill="#000"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
1
data/icons/sources/retroarch-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.56 4 5.6 5.28H3.52L3.04 7.2H1.76l.48-1.92H.96L0 9.12h2.56l-.32 1.28h2.24L2.8 12.32h1.88l1.56-1.92h3.52l1.56 1.92h1.88l-1.68-1.92h2.24l-.32-1.28H16l-.96-3.84h-1.28l.48 1.92h-1.28l-.48-1.92H10.4L11.44 4h-1.36L8.96 5.28H7.04L5.92 4H4.56Zm.16 2.56H6v1.28H4.72V6.56Zm5.283 0h1.28v1.28h-1.28V6.56Z" fill="#000"/></svg>
|
||||||
|
After Width: | Height: | Size: 399 B |
1
data/icons/sources/steam-source-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.352 5.1a1.509 1.509 0 1 0 2.51 1.675A1.509 1.509 0 0 0 9.352 5.1Zm2.923-.277a2.009 2.009 0 1 1-3.34 2.231 2.009 2.009 0 0 1 3.34-2.23ZM5.01 12.131l-.983-.407a1.7 1.7 0 0 0 3.108-.103 1.696 1.696 0 0 0-1.213-2.29 1.699 1.699 0 0 0-.966.07l1.015.421a1.249 1.249 0 0 1-.96 2.307v.002ZM2.546 2.121A7.996 7.996 0 0 1 7.966 0l.003.013a7.988 7.988 0 0 1 7.159 4.432 7.996 7.996 0 0 1-4.277 11.018 7.99 7.99 0 0 1-8.274-1.558A7.989 7.989 0 0 1 .279 10.18l3.064 1.267A2.264 2.264 0 0 0 7.823 11v-.107l2.718-1.938h.063A3.016 3.016 0 1 0 7.589 5.94v.031l-1.906 2.76h-.126c-.454 0-.898.138-1.273.395L0 7.354A7.995 7.995 0 0 1 2.546 2.12Z" fill="#000"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
||||||
|
After Width: | Height: | Size: 878 B |
@@ -4,7 +4,7 @@ blueprints = custom_target('blueprints',
|
|||||||
'gtk/window.blp',
|
'gtk/window.blp',
|
||||||
'gtk/game.blp',
|
'gtk/game.blp',
|
||||||
'gtk/preferences.blp',
|
'gtk/preferences.blp',
|
||||||
'gtk/details-window.blp'
|
'gtk/details-dialog.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@'],
|
||||||
@@ -52,9 +52,13 @@ appstream_file = i18n.merge_file(
|
|||||||
install_dir: join_paths(get_option('datadir'), 'metainfo')
|
install_dir: join_paths(get_option('datadir'), 'metainfo')
|
||||||
)
|
)
|
||||||
|
|
||||||
appstream_util = find_program('appstream-util', required: false)
|
appstreamcli = find_program('appstreamcli', required: false)
|
||||||
if appstream_util.found()
|
if appstreamcli.found()
|
||||||
test('Validate appstream file', appstream_util, args: ['validate', appstream_file])
|
test('Validate appstream file',
|
||||||
|
appstreamcli,
|
||||||
|
args: ['validate', '--no-net', '--explain', appstream_file],
|
||||||
|
workdir: meson.current_build_dir()
|
||||||
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
install_data(
|
install_data(
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 683 KiB After Width: | Height: | Size: 452 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 40 KiB |
@@ -49,9 +49,9 @@ Stored as a string.
|
|||||||
|
|
||||||
### source
|
### source
|
||||||
|
|
||||||
A unique ID for the source of the game in lowercase, without spaces.
|
A unique ID for the source of the game in lowercase, without spaces or underscores.
|
||||||
|
|
||||||
If a source provides multiple internal sources, these should be separately labeled, but share a common prefix. eg. `heoic_gog`, `heroic_epic`.
|
If a source provides multiple internal sources, these should be separately labeled, but share a common prefix. eg. `heoic_gog`, `heroic_epic`. This is the only place you should use an underscore.
|
||||||
|
|
||||||
Stored as a string.
|
Stored as a string.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id" : "hu.kramo.Cartridges.Devel",
|
"id" : "hu.kramo.Cartridges.Devel",
|
||||||
"runtime" : "org.gnome.Platform",
|
"runtime" : "org.gnome.Platform",
|
||||||
"runtime-version" : "44",
|
"runtime-version" : "46",
|
||||||
"sdk" : "org.gnome.Sdk",
|
"sdk" : "org.gnome.Sdk",
|
||||||
"command" : "cartridges",
|
"command" : "cartridges",
|
||||||
"finish-args" : [
|
"finish-args" : [
|
||||||
@@ -11,13 +11,18 @@
|
|||||||
"--device=dri",
|
"--device=dri",
|
||||||
"--socket=wayland",
|
"--socket=wayland",
|
||||||
"--talk-name=org.freedesktop.Flatpak",
|
"--talk-name=org.freedesktop.Flatpak",
|
||||||
"--filesystem=host:ro",
|
"--filesystem=host",
|
||||||
"--filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam/:ro",
|
"--filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam/:ro",
|
||||||
"--filesystem=~/.var/app/net.lutris.Lutris/:ro",
|
"--filesystem=~/.var/app/net.lutris.Lutris/:ro",
|
||||||
"--filesystem=~/.var/app/com.heroicgameslauncher.hgl/config/heroic/:ro",
|
"--filesystem=~/.var/app/com.heroicgameslauncher.hgl/config/heroic/:ro",
|
||||||
|
"--filesystem=~/.var/app/com.heroicgameslauncher.hgl/config/legendary/:ro",
|
||||||
"--filesystem=~/.var/app/com.usebottles.bottles/data/bottles/:ro",
|
"--filesystem=~/.var/app/com.usebottles.bottles/data/bottles/:ro",
|
||||||
"--filesystem=~/.var/app/io.itch.itch/config/itch/:ro",
|
"--filesystem=~/.var/app/io.itch.itch/config/itch/:ro",
|
||||||
"--filesystem=/var/lib/flatpak:ro"
|
"--filesystem=~/.var/app/org.libretro.RetroArch/config/retroarch/:ro",
|
||||||
|
"--filesystem=/var/lib/flatpak/app:ro",
|
||||||
|
"--filesystem=/var/lib/flatpak/exports:ro",
|
||||||
|
"--filesystem=xdg-data/flatpak/app:ro",
|
||||||
|
"--filesystem=xdg-data/flatpak/exports:ro"
|
||||||
],
|
],
|
||||||
"cleanup" : [
|
"cleanup" : [
|
||||||
"/include",
|
"/include",
|
||||||
@@ -28,8 +33,7 @@
|
|||||||
"/share/man",
|
"/share/man",
|
||||||
"/share/pkgconfig",
|
"/share/pkgconfig",
|
||||||
"*.la",
|
"*.la",
|
||||||
"*.a",
|
"*.a"
|
||||||
"Cartridges.iss"
|
|
||||||
],
|
],
|
||||||
"modules" : [
|
"modules" : [
|
||||||
{
|
{
|
||||||
@@ -108,7 +112,7 @@
|
|||||||
{
|
{
|
||||||
"type" : "git",
|
"type" : "git",
|
||||||
"url" : "https://gitlab.gnome.org/jwestman/blueprint-compiler",
|
"url" : "https://gitlab.gnome.org/jwestman/blueprint-compiler",
|
||||||
"tag" : "v0.8.1"
|
"tag" : "v0.10.0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"cleanup" : [
|
"cleanup" : [
|
||||||
@@ -119,6 +123,7 @@
|
|||||||
"name" : "cartridges",
|
"name" : "cartridges",
|
||||||
"builddir" : true,
|
"builddir" : true,
|
||||||
"buildsystem" : "meson",
|
"buildsystem" : "meson",
|
||||||
|
"run-tests" : true,
|
||||||
"config-opts": [
|
"config-opts": [
|
||||||
"-Dprofile=development"
|
"-Dprofile=development"
|
||||||
],
|
],
|
||||||
|
|||||||
28
meson.build
@@ -1,5 +1,5 @@
|
|||||||
project('cartridges',
|
project('cartridges',
|
||||||
version: '2.0',
|
version: '2.8.1',
|
||||||
meson_version: '>= 0.59.0',
|
meson_version: '>= 0.59.0',
|
||||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||||
)
|
)
|
||||||
@@ -8,7 +8,11 @@ i18n = import('i18n')
|
|||||||
gnome = import('gnome')
|
gnome = import('gnome')
|
||||||
python = import('python')
|
python = import('python')
|
||||||
|
|
||||||
|
py_installation = python.find_installation('python3')
|
||||||
|
|
||||||
|
python_dir = join_paths(get_option('prefix'), py_installation.get_install_dir())
|
||||||
pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name())
|
pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name())
|
||||||
|
libexecdir = join_paths(get_option('prefix'), get_option('libexecdir'))
|
||||||
|
|
||||||
profile = get_option('profile')
|
profile = get_option('profile')
|
||||||
if profile == 'development'
|
if profile == 'development'
|
||||||
@@ -20,29 +24,29 @@ elif profile == 'release'
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
conf = configuration_data()
|
conf = configuration_data()
|
||||||
conf.set('PYTHON', python.find_installation('python3').full_path())
|
conf.set('PYTHON', py_installation.full_path())
|
||||||
conf.set('PYTHON_VERSION', python.find_installation('python3').language_version())
|
conf.set('PYTHON_VERSION', py_installation.language_version())
|
||||||
conf.set('APP_ID', app_id)
|
conf.set('APP_ID', app_id)
|
||||||
conf.set('PREFIX', prefix)
|
conf.set('PREFIX', prefix)
|
||||||
conf.set('VERSION', meson.project_version())
|
conf.set('VERSION', meson.project_version())
|
||||||
conf.set('PROFILE', profile)
|
conf.set('PROFILE', profile)
|
||||||
|
conf.set('TIFF_COMPRESSION', get_option('tiff_compression'))
|
||||||
conf.set('localedir', join_paths(get_option('prefix'), get_option('localedir')))
|
conf.set('localedir', join_paths(get_option('prefix'), get_option('localedir')))
|
||||||
conf.set('pkgdatadir', pkgdatadir)
|
conf.set('pkgdatadir', pkgdatadir)
|
||||||
|
conf.set('libexecdir', libexecdir)
|
||||||
|
|
||||||
subdir('data')
|
subdir('data')
|
||||||
subdir('src')
|
subdir('cartridges')
|
||||||
subdir('po')
|
subdir('po')
|
||||||
|
|
||||||
configure_file(
|
if host_machine.system() == 'windows'
|
||||||
input: './windows/Cartridges.iss.in',
|
subdir('windows')
|
||||||
output: 'Cartridges.iss',
|
else
|
||||||
configuration: conf,
|
subdir('search-provider')
|
||||||
install: true,
|
endif
|
||||||
install_dir: '.'
|
|
||||||
)
|
|
||||||
|
|
||||||
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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,3 +7,12 @@ option(
|
|||||||
],
|
],
|
||||||
value: 'release'
|
value: 'release'
|
||||||
)
|
)
|
||||||
|
option(
|
||||||
|
'tiff_compression',
|
||||||
|
type: 'combo',
|
||||||
|
choices: [
|
||||||
|
'webp',
|
||||||
|
'jpeg',
|
||||||
|
],
|
||||||
|
value: 'webp'
|
||||||
|
)
|
||||||
@@ -19,3 +19,10 @@ pl
|
|||||||
sv
|
sv
|
||||||
tr
|
tr
|
||||||
el
|
el
|
||||||
|
cs
|
||||||
|
zh_Hans
|
||||||
|
be
|
||||||
|
hr
|
||||||
|
ca
|
||||||
|
ja
|
||||||
|
hi
|
||||||
|
|||||||
30
po/POTFILES
@@ -8,12 +8,26 @@ data/gtk/help-overlay.blp
|
|||||||
data/gtk/preferences.blp
|
data/gtk/preferences.blp
|
||||||
data/gtk/window.blp
|
data/gtk/window.blp
|
||||||
|
|
||||||
src/main.py
|
cartridges/main.py
|
||||||
src/window.py
|
cartridges/window.py
|
||||||
src/details_window.py
|
cartridges/details_window.py
|
||||||
src/game.py
|
cartridges/game.py
|
||||||
src/preferences.py
|
cartridges/preferences.py
|
||||||
|
|
||||||
src/utils/create_dialog.py
|
cartridges/utils/create_dialog.py
|
||||||
src/importer/sources/source.py
|
|
||||||
src/store/managers/sgdb_manager.py
|
cartridges/importer/importer.py
|
||||||
|
cartridges/importer/source.py
|
||||||
|
cartridges/importer/location.py
|
||||||
|
cartridges/importer/location.py
|
||||||
|
cartridges/importer/bottles_source.py
|
||||||
|
cartridges/importer/desktop_source.py
|
||||||
|
cartridges/importer/flatpak_source.py
|
||||||
|
cartridges/importer/heroic_source.py
|
||||||
|
cartridges/importer/itch_source.py
|
||||||
|
cartridges/importer/legendary_source.py
|
||||||
|
cartridges/importer/lutris_source.py
|
||||||
|
cartridges/importer/retroarch_source.py
|
||||||
|
cartridges/importer/steam_source.py
|
||||||
|
|
||||||
|
cartridges/store/managers/sgdb_manager.py
|
||||||
583
po/ar.po
@@ -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.
|
||||||
# Ali Aljishi <ahj696@hotmail.com>, 2023.
|
# Ali Aljishi <ahj696@hotmail.com>, 2023.
|
||||||
# kramo <contact@kramo.hu>, 2023.
|
# kramo <contact@kramo.hu>, 2023.
|
||||||
|
# Ali-98 <ahj696@hotmail.com>, 2023.
|
||||||
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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-07-04 17:29+0000\n"
|
"PO-Revision-Date: 2023-12-15 13:10+0000\n"
|
||||||
"Last-Translator: Ali Aljishi <ahj696@hotmail.com>\n"
|
"Last-Translator: Ali-98 <ahj696@hotmail.com>\n"
|
||||||
"Language-Team: Arabic <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Arabic <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/ar/>\n"
|
"cartridges/ar/>\n"
|
||||||
"Language: ar\n"
|
"Language: ar\n"
|
||||||
@@ -18,11 +19,12 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||||
"X-Generator: Weblate 5.0-dev\n"
|
"X-Generator: Weblate 5.3\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "خراطيش"
|
msgstr "خراطيش"
|
||||||
|
|
||||||
@@ -36,8 +38,10 @@ msgid "Launch all your games"
|
|||||||
msgstr "شغِّل كلَّ ألعابك"
|
msgstr "شغِّل كلَّ ألعابك"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "لعب;مشغل;ستيم;لوترس;هروك;قوارير;إتش;هيرويك;بوتلز;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"لعب;مشغل;ستيم;لوترس;هروك;قوارير;إتش;هيرويك;بوتلز;لجندري;فلاتباك;رتروآرتش;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -50,20 +54,18 @@ msgstr ""
|
|||||||
"وبرامج أخرى، وذلك دون تسجيل دخول. ولك ترتيب وإخفاء الألعاب فيه كيفما شئت، "
|
"وبرامج أخرى، وذلك دون تسجيل دخول. ولك ترتيب وإخفاء الألعاب فيه كيفما شئت، "
|
||||||
"وكذلك تستطيع منه تنزيل غُلُف الألعاب من SteamGridDB."
|
"وكذلك تستطيع منه تنزيل غُلُف الألعاب من SteamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "المكتبة"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "حرِّر تفاصيل اللعبة"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "تفاصيل اللعبة"
|
msgstr "تفاصيل اللعبة"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "حرِّر تفاصيل اللعبة"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "التفضيلات"
|
msgstr "التفضيلات"
|
||||||
|
|
||||||
@@ -71,244 +73,272 @@ msgstr "التفضيلات"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "ألغِ"
|
msgstr "ألغِ"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "غلاف جديد"
|
msgstr "غلاف جديد"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "احذف الغلاف"
|
msgstr "احذف الغلاف"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "العنوان"
|
msgstr "العنوان"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "عنوان اللعبة"
|
msgstr "المطوِّر (اختياري)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "المطوِّر"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "المطوِّر أو الناشر (اختياري)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "ملفُّ التنفيذ"
|
msgstr "ملفُّ التنفيذ"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "الملفُّ المفتوح أو الأمر المشغَّل عند بدء اللعبة"
|
msgstr "اختر ملفًّا"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "معلومات أكثر"
|
msgstr "معلومات أكثر"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "حرِّر"
|
msgstr "حرِّر"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "أخفِ"
|
msgstr "أخفِ"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "أزل"
|
msgstr "أزل"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: 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:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "عام"
|
msgstr "عام"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "أنهِ"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "ابحث"
|
msgstr "ابحث"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "أظهر التفضيلات"
|
msgstr "اختصارات لوحة المفاتيح"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "الاختصارات"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "تراجع"
|
msgstr "تراجع"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "افتح القائمة"
|
msgstr "أنهِ"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "أظهر شريط الجانب"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "القائمة الرئيسة"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "الألعاب"
|
msgstr "الألعاب"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "أضف لعبةً جديدةً"
|
msgstr "أضف لعبةً"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "استورد ألعابًا"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "أظهر الألعاب المخفية"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "أزل اللعبة"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr "السلوك"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr "اخرج بعد بدء الألعاب"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr "تبدأ صورة الغلاف اللعبة"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr "يبدِّل سلوك صورة الغلاف وزرِّ «العب»"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr "الصور"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr "صور ذات دقَّة عالية"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr "احفظ غُلُف الألعاب دون فقد على حساب مساحة التخزين"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr "منطقة خطر"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr "أزل كلَّ الألعاب"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "استورد"
|
msgstr "استورد"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "أظهر الألعاب المخفية"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "أزل اللعبة"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "السلوك"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "اخرج بعد بدء الألعاب"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "تبدأ صورة الغلاف اللعبة"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "يبدِّل سلوك صورة الغلاف وزرِّ «العب»"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "الصور"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "صور ذات دقَّة عالية"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "احفظ غُلُف الألعاب دون فقد على حساب مساحة التخزين"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "منطقة خطر"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "أزل كلَّ الألعاب"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "أزل الألعاب المحذوفة"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "المصادر"
|
msgstr "المصادر"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "ستيم"
|
msgstr "ستيم"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "موضع التثبيت"
|
msgstr "موضع التثبيت"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "لوترس"
|
msgstr "لوترس"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "موضع الذاكرة المؤقتة"
|
msgstr "موضع الذاكرة المؤقتة"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "استورد ألعابًا من ستيم"
|
msgstr "استورد ألعابًا من ستيم"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "استورد ألعاب فلاتباك"
|
msgstr "استورد ألعاب فلاتباك"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "هِرُوِك"
|
msgstr "هِرُوِك"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "استورد ألعاب أَبِك"
|
msgstr "استورد ألعاب أَبِك"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "استورد ألعاب جيأوجي"
|
msgstr "استورد ألعاب جيأوجي"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "استورد ألعابًا من أمازون"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "استورد ألعابًا مثبَّتةً بغير متجر"
|
msgstr "استورد ألعابًا مثبَّتةً بغير متجر"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "قوارير"
|
msgstr "قوارير"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "إتش"
|
msgstr "إتش"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr "لجندري"
|
msgstr "لجندري"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "رتروآرتش"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr "فلاتباك"
|
msgstr "فلاتباك"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "موضع النظام"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "موضع المستخدم"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "استورد مشغِّلات ألعاب"
|
msgstr "استورد مشغِّلات ألعاب"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "مدخلات سطح المكتب"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "الاستيثاق"
|
msgstr "الاستيثاق"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "مفتاح واجهة البرمجة"
|
msgstr "مفتاح واجهة البرمجة"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "استخدم SteamGridDB"
|
msgstr "استخدم SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "نزِّل الصور حينما تنزِّل أو تستورد الألعاب"
|
msgstr "نزِّل الصور حينما تنزِّل أو تستورد الألعاب"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "فضِّلها على الصور الرسمية"
|
msgstr "فضِّلها على الصور الرسمية"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "فضِّل الصور المتحرِّكة"
|
msgstr "فضِّل الصور المتحرِّكة"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "حدِّث الغُلُف"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "اجلب غُلُفًا للألعاب التي في المكتبة"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
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"
|
||||||
msgstr "لم يُعثر على ألعاب"
|
msgstr "لم يُعثر على ألعاب"
|
||||||
@@ -333,118 +363,135 @@ msgstr "لا توجد ألعاب مخفية"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "هنا يظهر ما أخفيت من ألعاب."
|
msgstr "هنا يظهر ما أخفيت من ألعاب."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "عد"
|
msgstr "كلُّ الألعاب"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "عنوان اللعبة"
|
msgstr "أُضيفَت"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "العب"
|
msgstr "اُستوردَت"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "أضف لعبةً"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "القائمة الرئيسة"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "الألعاب المخفية"
|
msgstr "الألعاب المخفية"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "عنوان اللعبة"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "العب"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "رتِّب"
|
msgstr "رتِّب"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "أ-ي"
|
msgstr "أ-ي"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "ي-أ"
|
msgstr "ي-أ"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "الأجدد"
|
msgstr "الأجدد"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "الأقدم"
|
msgstr "الأقدم"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "لُعبت آخر مرَّة"
|
msgstr "لُعبت آخر مرَّة"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "أظهر ما أخفي"
|
msgstr "أظهر ما أخفي"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "اختصارات لوحة المفاتيح"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "عن «خراطيش»"
|
msgstr "عن «خراطيش»"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "بُدئت {}"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Ali Aljishi <ahj696@hotmail.com>"
|
msgstr "Ali Aljishi <ahj696@hotmail.com>"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "أضيفت في: {}"
|
msgstr "أضيفت في: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "أبدًا"
|
msgstr "أبدًا"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "لُعبت آخر مرَّة في: {}"
|
msgstr "لُعبت آخر مرَّة في: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "طبِّق"
|
msgstr "طبِّق"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "أضف لعبةً جديدةً"
|
msgstr "أضف لعبةً جديدةً"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "أكِّد"
|
msgstr "أضف"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "ملفات التنفيذ"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "ملف.txt"
|
msgstr "ملف.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "البرنامج"
|
msgstr "البرنامج"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\المسار\\إلى\\{}"
|
msgstr "C:\\المسار\\إلى\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/المسار/إلى/{}"
|
msgstr "/المسار/إلى/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -466,97 +513,180 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"ولا تنسَ إحاطة المسار بعلامتي تنصيص مزدوجتين حالما تضمَّن مسافات!"
|
"ولا تنسَ إحاطة المسار بعلامتي تنصيص مزدوجتين حالما تضمَّن مسافات!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "تعذَّرت إضافة اللعبة"
|
msgstr "تعذَّرت إضافة اللعبة"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "لا يجوز كون عنوان اللعبة فارغًا."
|
msgstr "لا يجوز كون عنوان اللعبة فارغًا."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "لا يجوز كون ملفِّ التنفيذ فارغًا."
|
msgstr "لا يجوز كون ملفِّ التنفيذ فارغًا."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
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
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "بُدئت {}"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "أٌخفيت {}"
|
msgstr "أٌخفيت {}"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "أٌظهرت {}"
|
msgstr "أٌظهرت {}"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "أزيلت {}"
|
msgstr "أزيلت {}"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "أُزيلت كلُّ الألعاب"
|
msgstr "أُزيلت كلُّ الألعاب"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"تحتاج مفتاح واجهة برمجة حال ما أردت استخدام SteamGridDB، {}هنا تولِّده{}."
|
"تحتاج مفتاح واجهة برمجة حال ما أردت استخدام SteamGridDB، {}هنا تولِّده{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "تُنزَّل الغُلُف…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "حُدِّثت الغُلُف"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "لم يُعثر على التثبيت"
|
msgstr "لم يُعثر على التثبيت"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "حدِّد مجلَّدًا صالحًا."
|
msgstr "حدِّد مجلَّدًا صالحًا."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "تحذير"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr "مجلَّد غير صالح"
|
msgstr "مجلَّد غير صالح"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "عيِّن الموضع"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "تجاهل"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "تُستورد الألعاب…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "طرأ هذا الخطأ أثناء الاستيراد:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "لم يُعثر على ألعاب جديدة"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "اُستوردت لعبة واحدة"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "اُستوردت {} لعبة"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "أزيل ١"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:352
|
#: cartridges/importer/location.py:33
|
||||||
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
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} installation directory."
|
|
||||||
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
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} cache directory."
|
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr "حدِّد مجلَّد ذاكرة {} المؤقتة."
|
msgstr "حدِّد مجلَّد بيانات {}."
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
msgid "Set Location"
|
msgid "No RetroArch Core Selected"
|
||||||
msgstr "عيِّن الموضع"
|
msgstr "لم تختر نواة رتروآرتش"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
msgstr "تجاهل"
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "ليس للقوائم التالية نواة مبدئية:"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "لم نستورد الألعاب التي لم تختر لها أنويةً"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "تعذَّر استيثاق SteamGridDB"
|
msgstr "تعذَّر استيثاق SteamGridDB"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr "أكِّد مفتاح واجهة البرمجة في التفضيلات"
|
msgstr "أكِّد مفتاح واجهة البرمجة في التفضيلات"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "المكتبة"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "أظهر التفضيلات"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "الاختصارات"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "افتح القائمة"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "أضف لعبةً جديدةً"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "استورد ألعابًا"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "عد"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "ابحث عن ألعاب"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "ابحث في الألعاب المخفية"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "عنوان اللعبة"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "المطوِّر"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "الملفُّ المفتوح أو الأمر المشغَّل عند بدء اللعبة"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "أكِّد"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
#~| msgid "The Steam directory cannot be found."
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
@@ -591,21 +721,6 @@ msgstr "أكِّد مفتاح واجهة البرمجة في التفضيلات"
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "حدِّد مجلَّد ذاكرة لوترس المؤقَّتة."
|
#~ msgstr "حدِّد مجلَّد ذاكرة لوترس المؤقَّتة."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "تُستورد الألعاب…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "تُستورد الغُلُف…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "لم يُعثر على ألعاب جديدة"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "اُستوردت لعبة واحدة"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "اُستوردت {} لعبة"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "المجلَّد المستخدم عند استيراد الألعاب"
|
#~ msgstr "المجلَّد المستخدم عند استيراد الألعاب"
|
||||||
|
|
||||||
|
|||||||
652
po/be.po
Normal file
@@ -0,0 +1,652 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# Yahor <k1llo2810@gmail.com>, 2023.
|
||||||
|
# Yahor <g_egor98@tut.by>, 2023.
|
||||||
|
# Yahor <k1llo2810@protonmail.com>, 2023.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2023-12-13 09:28+0000\n"
|
||||||
|
"Last-Translator: Yahor <k1llo2810@protonmail.com>\n"
|
||||||
|
"Language-Team: Belarusian <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/be/>\n"
|
||||||
|
"Language: be\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||||
|
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||||
|
"X-Generator: Weblate 5.3-rc\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "Картрыджы"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr "Праграма запуску гульняў"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr "Запускайце ўсе свае гульні"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"гульні;праграма запуску;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||||
|
"retroarch;"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
"Картрыджы - гэта простая праграма для запуску ўсіх вашых гульняў. Яна "
|
||||||
|
"падтрымлівае імпарт гульняў з Steam, Lutris, Heroic і іншых без неабходнасці "
|
||||||
|
"ўваходу ў сістэму. Вы можаце сартаваць і хаваць гульні або спампоўваць "
|
||||||
|
"вокладку з SteamGridDB."
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr "Падрабязнасці аб гульні"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Рэдагаваць падрабязнасці аб гульні"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "Параметры"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Скасаваць"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr "Новая вокладка"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr "Выдалиць вокладку"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Назва"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr "Распрацоўшчык (неабавязкова)"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr "Выконваны"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr "Выбраць файл"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr "Больш інфармацыі"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Рэдагаваць"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr "Схаваць"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Выдаліць"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr "Паказаць"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Агульнае"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Пошук"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "Спалучэнні клавіш"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr "Адмяніць"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "Выйсці"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Пераключыць бакавую панэль"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Галоўнае меню"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Гульні"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr "Дадаць гульню"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr "Імпарт"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Паказаць схаваныя гульні"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Выдаліць гульню"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Паводзіны"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Выхад пасля запуску гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "Выява вокладкі запускае гульню"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Мяняе паводзіны вокладкі і кнопкі запуску"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Відарысы"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Відарысы высокай якасці"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Захаванне вокладак гульняў без страт за кошт сховішча"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Небяспечная зона"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Выдаліць усе гульні"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Выдаляць дэінсталяваныя гульні"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "Крыніцы"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "Месца ўсталёўкі"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "Lutris"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr "Размяшчэнне кэша"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr "Імпарт гульняў Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr "Імпарт гульняў Flatpak"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr "Heroic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr "Імпарт Epic Games"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "Імпарт гульняў GOG"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Імпарт гульняў Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "Імпарт іншых гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "Bottles"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "itch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr "Legendary"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr "Flatpak"
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Сістэмнае размяшчэнне"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Карыстальніцкае размяшчэнне"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Імпарт сродкаў запуску гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Запісы працоўнага стала"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr "Аўтэнтыфікацыя"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "Ключ API"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr "Выкарыстоўвайць SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr "Спампоўка відарысаў пры даданні ці імпарце гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "Аддавайце перавагу афіцыйным відарысам"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "Аддавайце перавагу аніміраваным відарысам"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Абнавіць вокладкі"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Атрымаць вокладкі для гульняў, якія ўжо ёсць у вашай бібліятэцы"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Абнавіць"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr "Гульні не знойдзены"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr "Паспрабуйце іншы пошук."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr "Няма гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr "Выкарыстоўвайце кнопку +, каб дадаць гульні."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr "Няма схаваных гульняў"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr "Гульні, якія вы схаваеце, з'явяцца тут."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "Усе гульні"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "Дададзена"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "Імпартавана"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr "Схаваныя гульні"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Назва гульні"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Гуляць"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr "Сартаваць"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr "А-Я"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr "Я-А"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr "Найноўшыя"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr "Старэйшыя"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr "Апошняя гульня"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr "Паказаць схаваныя"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr "Аб картрыджах"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} запушчана"
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr "Yahor Haurylenka https://github.com/k1llo"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr "Дададзена: {}"
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Ніколі"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr "Гулялі апошні раз: {}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Ужыць"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr "Дадаць новую гульню"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "Дадаць"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Выконваныя"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "file.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr "праграма"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr "C:\\шлях\\да\\{}"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr "/шлях/да/{}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
"Каб запусціць выкананы файл \"{}\", выканайце каманду:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Каб адкрыць файл \"{}\" з дапамогай праграмы па змаўчанні, выкарыстоўвайце:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Калі шлях змяшчае прабелы, абавязкова заключыце яго ў падвойныя двукоссі!"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr "Не ўдалося дадаць гульню"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr "Назва гульні не можа быць пустой."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr "Выканальны файл не можа быць пустым."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr "Не ўдалося прымяніць параметры"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr "{} схаваная"
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr "{} непрыхавана"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr "{} выдалена"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr "Усе гульні выдалены"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
"Для выкарыстання SteamGridDB патрабуецца ключ API. Вы можаце стварыць яго {}"
|
||||||
|
"тут{}."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Спампоўка вокладак…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Вокладкі абноўлены"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr "Усталяванне не знойдзена"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr "Выберыце сапраўдны каталог."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Увага"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr "Няправільны каталог"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Задаць размяшчэнне"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Адхіліць"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Імпарт гульняў…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Падчас імпарту адбыліся наступныя памылкі:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Новыя гульні не знойдзены"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "Імпартавана 1 гульня"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} гульняў імпартавана"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 выдалена"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Выберыце каталог кэша {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Выберыце каталог канфігурацыі {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Выберыце каталог даных {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "Ядро RetroArch не выбрана"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Наступныя плэйлісты не маюць ядра па змаўчанні:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Гульні без выбранага ядра не былі імпартаваныя"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "Немагчыма аўтэнтыфікаваць SteamGridDB"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "Праверце свой ключ API ў наладах"
|
||||||
648
po/ca.po
Normal file
@@ -0,0 +1,648 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# jolupa <jolupameister@gmail.com>, 2023.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2023-12-15 13:10+0000\n"
|
||||||
|
"Last-Translator: jolupa <jolupameister@gmail.com>\n"
|
||||||
|
"Language-Team: Catalan <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/ca/>\n"
|
||||||
|
"Language: ca\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: Weblate 5.3\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "Cartridges"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr "Llançador de jocs"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr "Llança tots els teus jocs"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"jocs;llançador;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
"Cartridges es un llançador de jocs senzill per tots els teus jocs. Suporta "
|
||||||
|
"la importació de jocs des de Steam, Lutris, Heroic i molts més sense la "
|
||||||
|
"necessitat de iniciar sessió. Pots ordenar i amagar els jocs o descarregar "
|
||||||
|
"l'art de la coberta de SteamGridDB."
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr "Detalls del joc"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Editar els detalls del joc"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "Preferències"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancel·lar"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr "Coberta nova"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr "Eliminar la coberta"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Títol"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr "Desenvolupador (opcional)"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr "Executable"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr "Seleccionar fitxer"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr "Més informació"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Editar"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr "Amagar"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Esborrar"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr "Mostrar"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr "General"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Cercar"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "Dreceres de teclat"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr "Desfés"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "Sortir"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Alternar la barra lateral"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Menú principal"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Jocs"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr "Afegeix joc"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr "Importar"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Mostrar jocs ocults"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Eliminar joc"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Comportament"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Sortir després de llançar el joc"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "La imatge de la coberta llança el joc"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Canvia el comportament de la imatge de la coberta i el botó de jugar"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Imatges"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Imatges de qualitat alta"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Guarda les cobertes del joc sense pèrdues amb el cost d'emmagatzematge"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Zona de perill"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Esborrar tots els jocs"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Esborrar jocs desinstal·lats"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "Fonts"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "Ubicació de la instal·lació"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "Lutris"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr "Ubicació de la memòria cau"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr "Importar jocs de Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr "Importar jocs de Flatpak"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr "Heroic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr "Importar jocs de Epic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "Importar jocs de GOG"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importar jocs de Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "Importar jocs no aprovats"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "Bottles"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "itch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr "Legendary"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr "Flatpak"
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Ubicació del sistema"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Ubicació de l'usuari"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Importar llançadors de jocs"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Entrades d'escriptori"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr "Autenticació"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "Clau API"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr "Fes servir SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr "Descarregar les imatges al afegir o importar jocs"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "Prefereix sobre imatges oficials"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "Prefereix imatges animades"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Actualitzar cobertes"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Descarregar cobertes per a jocs que ja es troben a la teva llibreria"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Actualitzar"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr "No hi han jocs"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr "Prova una cerca diferent."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr "Cap joc"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr "Fes servir el botó + per afegir jocs."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr "No hi han jocs amagats"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr "Els jocs que amaguis sortiran aquí."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "Tots els jocs"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "Afegit"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "Importat"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr "Jocs amagats"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Títol del joc"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Jugar"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr "Ordenar"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr "A-Z"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr "Z-A"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr "Més recent"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr "Més antic"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr "Últim jugat"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr "Mostrar els amagats"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr "Sobre Cartridges"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} llançat"
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr "crèdits_traductors"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr "Afegit: {}"
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Mai"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr "Últim jugat: {}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Aplicar"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr "Afegeix joc nou"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "Afegir"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Executables"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "fitxer.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr "programa"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr "C:\\camí\\a\\{}"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr "/camí/a/{}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
"Per llançar l'executable \"{}\", fes servir l'ordre:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Per obrir el fitxer \"{}\" amb l'aplicació per defecte, fes servir:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Si el camí conté espais, assegurat d'envoltar-lo amb cometes dobles!"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr "No es pot afegir el joc"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr "El títol del joc no pot estar buit."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr "El executable no pot estar buit."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr "No s'han pogut aplicar les preferències"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr "{} amagat"
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr "{} mostrar"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr "{} eliminat"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr "Tots els jocs eliminats"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
"Es necessita una clau API per poder fer servir SteamGridDB. Pots generar una "
|
||||||
|
"{}aquí{}."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Descarregant cobertes…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Cobertes actualitzades"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr "No s'ha trobat l'instal·lacióó"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr "Selecciona un directori vàlid."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Avis"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr "Directori no vàlid"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Escull una ubicació"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Descartar"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Important jocs…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Han succeït els següents errors al importar:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "No s'han trobat jocs nous"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 joc importat"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} jocs importats"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 eliminat"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Selecciona el directori per la memòria cau {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Selecciona el directori de configuració {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Selecciona el directori de dades {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "No s'ha seleccionat cap nucli de RetroArch"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "La següent llista de reproducció no te cap nucli:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Els jocs sense cap nucli seleccionat no seran importats"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "No es pot Autenticar a SteamGridDB"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "Verifica la teva clau API en les preferències"
|
||||||
@@ -8,18 +8,19 @@ 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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -33,7 +34,8 @@ msgid "Launch all your games"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
@@ -44,20 +46,18 @@ msgid ""
|
|||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -65,244 +65,272 @@ msgstr ""
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: 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:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
msgid "Sources"
|
msgid "Show Hidden Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/help-overlay.blp:68
|
||||||
msgid "Steam"
|
msgid "Remove Game"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:381
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
msgid "Behavior"
|
||||||
#: data/gtk/preferences.blp:234
|
|
||||||
msgid "Install Location"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Lutris"
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
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"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -327,118 +355,135 @@ msgstr ""
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -451,88 +496,136 @@ msgid ""
|
|||||||
"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 ""
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
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
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:352
|
#: cartridges/importer/location.py:33
|
||||||
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
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
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
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
msgid "Set Location"
|
msgid "No RetroArch Core Selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
696
po/cs.po
Normal file
@@ -0,0 +1,696 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# foo expert <deferred_water346@simplelogin.com>, 2023.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2023-09-24 16:04+0000\n"
|
||||||
|
"Last-Translator: foo expert <deferred_water346@simplelogin.com>\n"
|
||||||
|
"Language-Team: Czech <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/cs/>\n"
|
||||||
|
"Language: cs\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||||
|
"X-Generator: Weblate 5.1-dev\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "Kazety"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr "Spouštěč her"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr "Spusťte všechny vaše hry"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"hraní;spouštěč;steam;lutris;heroic;láhve;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
"Kazety jsou jednoduchý spouštěč pro všechny vaše hry. Podporuje importovaní "
|
||||||
|
"her ze služeb Steam, Lutris, Heroic a dalších bez nutnosti přihlášení. Hry "
|
||||||
|
"můžete třídit a skrývat nebo stahovat obálky ze služby SteamGridDB."
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr "Podrobnosti o hře"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Upravit podrobnosti o hře"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "Předvolby"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Zrušit"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr "Nový obal"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr "Odstranit obal"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Název"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr "Vývojář (nepovinné)"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr "Spustitelný soubor"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr "Vybrat soubor"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr "Více informací"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Upravit"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr "Skrýt"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Odstranit"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr "Odkrýt"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Obecné"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Vyhledávání"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "Klávesové zkratky"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr "Zpět"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "Ukončit"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Přepnout postranní panel"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Hlavní nabídka"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Hry"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr "Přidat hru"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr "Import"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Zobrazit skryté hry"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Odstranit hru"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Chování"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Ukončit po spuštění her"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "Obrázek na obálce spouští hru"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Vymění chování obrázku na obálce a tlačítka pro přehrávání"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Obrázky"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Vysoce kvalitní obrázky"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Ukládat obaly her bezztrátově na úkor většího místa na disku"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Nebezpečná zóna"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Odstranit všechny hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Odstranit odinstalované hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "Zdroje"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "Umístění instalace"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "Lutris"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr "Umístění dočasných souborů"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr "Importovat Steam hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr "Importovat Flatpak hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr "Heroic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr "Importovat Epic Games hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "Importovat GOG hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importovat Amazon hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "Importovat ručně načtené hry"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "Láhve"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "itch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr "Legendary"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr "Flatpak"
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Set Location"
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Nastavit umístění"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Set Location"
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Nastavit umístění"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Importovat spouštěče her"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Položky na ploše"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr "Ověření"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "Klíč API"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr "Používat SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr "Stahovat obrázky při přidávání nebo importování her"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "Upřednostnit před oficiálními obrázky"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "Upřednostnit animované obrázky"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete Cover"
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Odstranit obal"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr "Nebyly nalezeny žádné hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr "Zkuste hledat něco jiného."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr "Žádné hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr "Tlačítkem + můžete přidávat hry."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr "Žádné skryté hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr "Hry, které skryjete, se zobrazí zde."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "Všechny hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "Přidané"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "Importované"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr "Skryté hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Název hry"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Hrát"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr "Třídit"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr "A-Ž"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr "Ž-A"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr "Nejnovější"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr "Nejstarší"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr "Naposledy hráno"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr "Zobrazit Skryté"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr "O Kazetách"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} spuštěno"
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr "ooo.i.love.foo"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr "Přidáno: {}"
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Nikdy"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr "Naposledy hráno: {}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Použít"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr "Přidat novou hru"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "Přidat"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Spustitelné soubory"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "soubor.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr "program"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr "C:\\cesta\\k\\{}"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr "/cesta/k/{}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
"Chcete-li spustit spustitelný soubor \"{}\", použijte příkaz:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Chcete-li otevřít soubor \"{}\" pomocí výchozí aplikace, použijte příkaz:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Pokud cesta obsahuje mezery, nezapomeňte ji zabalit do dvojitých uvozovek!"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr "Nelze přidat hru"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr "Název hry nemůže být prázdný."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr "Spustitelný soubor nemůže být prázdný."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr "Nelze použít předvolby"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr "{} skryto"
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr "{} odkryto"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr "{} odstraněno"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr "Všechny hry odstraněny"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
"K používání služby SteamGridDB je vyžadován klíč API. Můžete si ho "
|
||||||
|
"vygenerovat {}zde{}."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr "Instalace nebyla nalezena"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr "Vyberte platný adresář."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Pozor"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr "Neplatný adresář"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Nastavit umístění"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Zahodit"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Přidávání her…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Tyto chyby se vyskytly při importu:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Nebyly nalezeny žádné nové hry"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "Přidána 1 hra"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "Přidány {} hry"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 odstraněna"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Vyberte adresář {} mezipaměti."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Vyberte konfigurační adresář {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Vyberte datový adresář {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "Žádné RetroArch jádro nevybráno"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Tyto seznamy her nemají výchozí jádra:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Hry bez vybraného jádra nebyly přidány"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "Nelze ověřit SteamGridDB"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "Ověřte váš klíč API v předvolbách"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Knihovna"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Zobrazit předvolby"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Zkratky"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Otevřít nabídku"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Přidat novou hru"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Importovat hry"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Zpět"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Search"
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Vyhledávání"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Show hidden games"
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Zobrazit skryté hry"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Název hry"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Vývojář"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Soubor nebo příkaz pro spuštění hry"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Potvrdit"
|
||||||
644
po/de.po
@@ -4,13 +4,15 @@
|
|||||||
# Jummit <jummit@web.de>, 2023.
|
# Jummit <jummit@web.de>, 2023.
|
||||||
# WebSnke <websnke@tutanota.com>, 2023.
|
# WebSnke <websnke@tutanota.com>, 2023.
|
||||||
# Ettore Atalan <atalanttore@googlemail.com>, 2023.
|
# Ettore Atalan <atalanttore@googlemail.com>, 2023.
|
||||||
|
# Simon Hahne <simonhahne@web.de>, 2023.
|
||||||
|
# Konstantin Tutsch <mail@konstantintutsch.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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-04-17 17:20+0000\n"
|
"PO-Revision-Date: 2024-02-19 06:35+0000\n"
|
||||||
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
|
"Last-Translator: Konstantin Tutsch <mail@konstantintutsch.com>\n"
|
||||||
"Language-Team: German <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: German <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/de/>\n"
|
"cartridges/de/>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
@@ -18,11 +20,12 @@ 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 4.17\n"
|
"X-Generator: Weblate 5.4\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartridges"
|
msgstr "Cartridges"
|
||||||
|
|
||||||
@@ -33,11 +36,13 @@ msgstr "Spiele-Launcher"
|
|||||||
#: data/hu.kramo.Cartridges.desktop.in:5
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
msgid "Launch all your games"
|
msgid "Launch all your games"
|
||||||
msgstr "Starte all deine Spiele"
|
msgstr "Starten Sie alle Ihre Spiele"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"spiel;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -46,25 +51,23 @@ msgid ""
|
|||||||
"necessary. You can sort and hide games or download cover art from "
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Cartridges ist ein einfacher Spiel-Launcher. Es unterstützt das Importieren "
|
"Cartridges ist ein einfacher Game Launcher für alle deine Spiele. Es bietet "
|
||||||
"von Spielen aus Steam, Lutris, Heroic und mehr, keine Anmeldung "
|
"Unterstützung für den Import von Spielen aus Steam, Lutris, Heroic und mehr, "
|
||||||
"erforderlich. Du kannst sortieren, Spiele verstecken oder das Cover-Art aus "
|
"ohne dass eine Anmeldung erforderlich ist. Sie können Spiele sortieren und "
|
||||||
"SteamGRID herunterladen."
|
"ausblenden oder Cover-Art von SteamGridDB herunterladen."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Bibliothek"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Spieldetails bearbeiten"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Spieldetails"
|
msgstr "Spieldetails"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Spieldetails bearbeiten"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Einstellungen"
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
@@ -72,252 +75,272 @@ msgstr "Einstellungen"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr "Neues Cover"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr "Cover löschen"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "Der Titel des Spiels"
|
msgstr "Entwickler (optional)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Entwickler"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Der Entwickler oder Verlag (optional)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Ausführbare Datei"
|
msgstr "Ausführbare Datei"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "Datei zum Öffnen oder Befehl zum Starten des Spiels"
|
msgstr "Datei auswählen"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr "Weitere Informationen"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Bearbeiten"
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Verstecken"
|
msgstr "Verstecken"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Entfernen"
|
msgstr "Entfernen"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Unverstecken"
|
msgstr "Unverstecken"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Allgemein"
|
msgstr "Allgemein"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Beenden"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Suchen"
|
msgstr "Suchen"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Einstellungen anzeigen"
|
msgstr "Tastaturkürzel"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Kürzel"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Rückgängig"
|
msgstr "Rückgängig"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Menü öffnen"
|
msgstr "Beenden"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Seitenleiste umschalten"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Hauptmenü"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Spiele"
|
msgstr "Spiele"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Neues Spiel hinzufügen"
|
msgstr "Spiel hinzufügen"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Spiele importieren"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Ausgeblendete Spiele anzeigen"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "Spiel entfernen"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr "Verhalten"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr "Nach dem Starten von Spielen beenden"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr "Coverbild Startet Spiel"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr "Tauscht das Verhalten des Covers und des Spielen-Knopfes"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr "Bilder"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr "Hochaufgelöste Bilder"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr "Speichere Spielcovers verlustfrei auf Kosten des Speicherplatzes"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr "Gefahrenzone"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr "Alle Spiele entfernen"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importieren"
|
msgstr "Importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Ausgeblendete Spiele anzeigen"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Spiel entfernen"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Verhalten"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Nach dem Starten von Spielen beenden"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "Coverbild Startet Spiel"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Tauscht das Verhalten des Covers und des Spielen-Knopfes"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Bilder"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Hochaufgelöste Bilder"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Speichere Spielcovers verlustfrei auf Kosten des Speicherplatzes"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Gefahrenzone"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Alle Spiele entfernen"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Deinstallierte Spiele entfernen"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Quellen"
|
msgstr "Quellen"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
#, fuzzy
|
|
||||||
#| msgid "itch Install Location"
|
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "itch-Installationsort"
|
msgstr "Installationsort"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Lutris Cache Location"
|
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Lutris-Cacheort"
|
msgstr "Cache-Speicherort"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Steam-Spiele importieren"
|
msgstr "Steam-Spiele importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Import Steam Games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Steam-Spiele importieren"
|
msgstr "Flatpak-Spiele importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Epic Games importieren"
|
msgstr "Epic Games importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "GOG-Spiele importieren"
|
msgstr "GOG-Spiele importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Amazon-Spiele importieren"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Sideloaded-Spiele importieren"
|
msgstr "Sideloaded-Spiele importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bottles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr "Legendary"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
#, fuzzy
|
#: data/gtk/preferences.blp:327
|
||||||
#| msgid "Game Launcher"
|
msgid "System Location"
|
||||||
|
msgstr "System Ort"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Nutzer Ort"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "Spiele-Launcher"
|
msgstr "Spiele-Launcher importieren"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Desktop Einträge"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Authentifizierung"
|
msgstr "Authentifizierung"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "API-Schlüssel"
|
msgstr "API-Schlüssel"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "SteamGridDB benutzen"
|
msgstr "SteamGridDB benutzen"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Lade Bilder herunter, wenn Spiele hinzugefügt oder importiert werden"
|
msgstr "Lade Bilder herunter, wenn Spiele hinzugefügt oder importiert werden"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Über offizielien Images bevorzugen"
|
msgstr "Über offiziellen Bildern bevorzugen"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Animierte Bilder bevorzugen"
|
msgstr "Animierte Bilder bevorzugen"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Cover aktualisieren"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Cover für in der Bibliothek vorhandene Spiele laden"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Aktualisieren"
|
||||||
|
|
||||||
#: 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"
|
||||||
msgstr "Keine Spiele gefunden"
|
msgstr "Keine Spiele gefunden"
|
||||||
@@ -342,118 +365,135 @@ msgstr "Keine versteckten Spiele"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Ausgeblendete Spiele, werden hier angezeigt."
|
msgstr "Ausgeblendete Spiele, werden hier angezeigt."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Zurück"
|
msgstr "Alle Spiele"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Spieltitel"
|
msgstr "Hinzugefügt"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Spielen"
|
msgstr "Importiert"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Spiel hinzufügen"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Hauptmenü"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Ausgeblendete Spiele"
|
msgstr "Ausgeblendete Spiele"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Spieltitel"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Spielen"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Sortierung"
|
msgstr "Sortierung"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Neuestes"
|
msgstr "Neuestes"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Älteste"
|
msgstr "Älteste"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Zuletzt gespielt"
|
msgstr "Zuletzt gespielt"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Ausgeblendete anzeigen"
|
msgstr "Ausgeblendete anzeigen"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Tastaturkürzel"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Über Cartridges"
|
msgstr "Über Cartridges"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} gestartet"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Feliks Weber"
|
msgstr "Feliks Weber"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Hinzugefügt: {}"
|
msgstr "Hinzugefügt: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Nie"
|
msgstr "Nie"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Zuletzt gespielt: {}"
|
msgstr "Zuletzt gespielt: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Anwenden"
|
msgstr "Anwenden"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Neues Spiel hinzufügen"
|
msgstr "Neues Spiel hinzufügen"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Bestätigen"
|
msgstr "Hinzufügen"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Ausführbare Dateien"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "datei.txt"
|
msgstr "datei.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "Programm"
|
msgstr "Programm"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\pfad\\zu\\{}"
|
msgstr "C:\\pfad\\zu\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/pfad/zu/{}"
|
msgstr "/pfad/zu/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -476,105 +516,184 @@ msgstr ""
|
|||||||
"Falls der Pfad Leerzeichen enthält, stelle sicher ihn in doppelte "
|
"Falls der Pfad Leerzeichen enthält, stelle sicher ihn in doppelte "
|
||||||
"Anführungszeichen zu setzen!"
|
"Anführungszeichen zu setzen!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Konnte Spiel nicht hinzufügen"
|
msgstr "Konnte Spiel nicht hinzufügen"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Spieltitel kann nicht leer sein."
|
msgstr "Spieltitel kann nicht leer sein."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "Ausführbare Datei darf nicht leer sein."
|
msgstr "Ausführbare Datei darf nicht leer sein."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Einstellungen konnten nicht angewendet werden"
|
msgstr "Einstellungen konnten nicht angewendet werden"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} gestartet"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} versteckt"
|
msgstr "{} versteckt"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} unversteckt"
|
msgstr "{} unversteckt"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} entfernt"
|
msgstr "{} entfernt"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Alle Spiele entfernt"
|
msgstr "Alle Spiele entfernt"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Für die Nutzung von SteamGridDB ist ein API-Schlüssel erforderlich. Sie "
|
"Für die Nutzung von SteamGridDB ist ein API-Schlüssel erforderlich. Sie "
|
||||||
"können ihn {}hier{} generieren."
|
"können ihn {}hier{} generieren."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
#, fuzzy
|
msgid "Downloading covers…"
|
||||||
#| msgid "Installation Not Found"
|
msgstr "Cover werden geladen…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Cover aktualisiert"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Installation nicht gefunden"
|
msgstr "Installation nicht gefunden"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Wähle das Datenverzeichnis von {} aus."
|
msgstr "Wähle ein gültiges Verzeichnis aus."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Warnung"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr "Ungültiges Verzeichnis"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Ort festlegen"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Verstanden"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Spiele werden importiert…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Die folgenden Fehler sind beim Import aufgetreten:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Keine neuen Spiele gefunden"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 Spiel importiert"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} Spiele importiert"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 entfernt"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:352
|
#: cartridges/importer/location.py:33
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} cache directory."
|
msgid "Select the {} cache directory."
|
||||||
msgstr "Wähle das Datenverzeichnis von {} aus."
|
msgstr "Wählen Sie das Cache-Verzeichnis {}."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} configuration directory."
|
|
||||||
msgid "Select the {} configuration directory."
|
msgid "Select the {} configuration directory."
|
||||||
msgstr "Wähle das Konfigurationsverzeichnis von {} aus."
|
msgstr "Wähle das Konfigurationsverzeichnis von {} aus."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr "Wähle das Datenverzeichnis von {} aus."
|
msgstr "Wähle das Datenverzeichnis von {} aus."
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
msgid "Set Location"
|
msgid "No RetroArch Core Selected"
|
||||||
msgstr "Ort festlegen"
|
msgstr "Kein RetroArch Kern ausgewählt"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
msgstr "Verstanden"
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Diese Playlists haben keinen Standard Kern:"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
#, fuzzy
|
msgid "Games with no core selected were not imported"
|
||||||
#| msgid "Couldn't Connect to SteamGridDB"
|
msgstr "Spiele ohne ausgewählten Kern wurden nicht importiert"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "Verbindung zu SteamGridDB konnte nicht hergestellt werden"
|
msgstr "SteamGridDB konnte nicht authentifiziert werden"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr "Verifiziere deinen API-Schlüssel in den Einstellungen"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Bibliothek"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Einstellungen anzeigen"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Kürzel"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Menü öffnen"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Neues Spiel hinzufügen"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Spiele importieren"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Zurück"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Search"
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Suchen"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Show hidden games"
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Ausgeblendete Spiele anzeigen"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Der Titel des Spiels"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Entwickler"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Datei zum Öffnen oder Befehl zum Starten des Spiels"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Bestätigen"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Cache Not Found"
|
#~| msgid "Cache Not Found"
|
||||||
@@ -607,27 +726,6 @@ msgstr ""
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Wähle das Lutris-Cache-Verzeichnis aus."
|
#~ msgstr "Wähle das Lutris-Cache-Verzeichnis aus."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Spiele werden importiert…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Spielecover werden importiert…"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "No Games Found"
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Keine Spiele gefunden"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Game Imported"
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "Spiel Importiert"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Games Imported"
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "Spiele importiert"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Verzeichnis, das beim Importieren von Spielen verwendet wird"
|
#~ msgstr "Verzeichnis, das beim Importieren von Spielen verwendet wird"
|
||||||
|
|
||||||
|
|||||||
594
po/el.po
@@ -6,8 +6,8 @@ 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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-05-29 18:48+0000\n"
|
"PO-Revision-Date: 2023-10-08 16:00+0000\n"
|
||||||
"Last-Translator: yiannis ioannides <sub@wai.ai>\n"
|
"Last-Translator: yiannis ioannides <sub@wai.ai>\n"
|
||||||
"Language-Team: Greek <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Greek <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/el/>\n"
|
"cartridges/el/>\n"
|
||||||
@@ -16,11 +16,12 @@ 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 4.18-dev\n"
|
"X-Generator: Weblate 5.1-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Κασέτες"
|
msgstr "Κασέτες"
|
||||||
|
|
||||||
@@ -34,8 +35,11 @@ msgid "Launch all your games"
|
|||||||
msgstr "Εκκινήστε όλα σας τα παιχνίδια"
|
msgstr "Εκκινήστε όλα σας τα παιχνίδια"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "gaming;εκκινητής;steam;lutris;heroic;bottles;itch;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"gaming;εκκινητής;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||||
|
"retroarch;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -50,20 +54,18 @@ msgstr ""
|
|||||||
"να κρύψετε τα παιχνίδια σας, καθώς και να κατεβάσετε τα εξώφυλλα τους από το "
|
"να κρύψετε τα παιχνίδια σας, καθώς και να κατεβάσετε τα εξώφυλλα τους από το "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Βιβλιοθήκη"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Επεξεργασία Λεπτομερειών Παιχνιδιού"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Λεπτομέρειες Παιχνιδιού"
|
msgstr "Λεπτομέρειες Παιχνιδιού"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Επεξεργασία Λεπτομερειών Παιχνιδιού"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Προτιμήσεις"
|
msgstr "Προτιμήσεις"
|
||||||
|
|
||||||
@@ -71,254 +73,277 @@ msgstr "Προτιμήσεις"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Ακύρωση"
|
msgstr "Ακύρωση"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "Νέο Εξώφυλλο"
|
msgstr "Νέο Εξώφυλλο"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "Διαγραφή Εξώφυλλου"
|
msgstr "Διαγραφή Εξώφυλλου"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Τίτλος"
|
msgstr "Τίτλος"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "Τίτλος Παιχνιδιού"
|
msgstr "Προγραμματιστής (προαιρετικό)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Προγραμματιστής"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Προγραμματιστής ή Εκδότης (προαιρετικό)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Πρόγραμμα"
|
msgstr "Εκτελέσιμο αρχείο"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr ""
|
msgstr "Επιλογή αρχείου"
|
||||||
"Αρχείο προς άνοιγμα ή εντολή προς εκτέλεση κατά την εκκίνηση παιχνιδιού"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Περισσότερες Πληροφορίες"
|
msgstr "Περισσότερες Πληροφορίες"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Επεξεργασία"
|
msgstr "Επεξεργασία"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Απόκρυψη"
|
msgstr "Απόκρυψη"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Αφαίρεση"
|
msgstr "Αφαίρεση"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: 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:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Γενικά"
|
msgstr "Γενικά"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Κλείσιμο"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Εύρεση"
|
msgstr "Αναζήτηση"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Εμφάνιση προτιμήσεων"
|
msgstr "Συντομεύσεις Πληκτρολογίου"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Συντομεύσεις"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Αναίρεση"
|
msgstr "Αναίρεση"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Άνοιγμα μενού"
|
msgstr "Κλείσιμο"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Ρύθμιση πάνελ"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Κύριο μενού"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Παιχνίδια"
|
msgstr "Παιχνίδια"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Πρόσθεση νέου παιχνιδιού"
|
msgstr "Προσθήκη παιχνιδιού"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Εισαγωγή παιχνιδιών"
|
msgid "Import"
|
||||||
|
msgstr "Εισαγωγή"
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Εμφάνιση κρυμμένων παιχνιδιών"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
msgid "Remove game"
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Εμφάνιση κρυμμένων παιχνιδιών"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
msgstr "Αφαίρεση παιχνιδιού"
|
msgstr "Αφαίρεση παιχνιδιού"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Συμπεριφορά"
|
msgstr "Συμπεριφορά"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr "Έξοδος μετά την εκκίνηση παιχνιδιών"
|
msgstr "Έξοδος μετά την εκκίνηση παιχνιδιών"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr "Εξώφυλλο εκκινεί το παιχνίδι"
|
msgstr "Εξώφυλλο εκκινεί το παιχνίδι"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr "Εικόνες"
|
msgstr "Εικόνες"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr "Εικόνες Υψηλής Ποιότητας"
|
msgstr "Εικόνες Υψηλής Ποιότητας"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
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:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Επικίνδυνη Ζώνη"
|
msgstr "Επικίνδυνη Ζώνη"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr "Αφαίρεση Όλων Των Παιχνιδιών"
|
msgstr "Αφαίρεση Όλων Των Παιχνιδιών"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
#: data/gtk/preferences.blp:119
|
||||||
msgid "Import"
|
msgid "Remove Uninstalled Games"
|
||||||
msgstr "Εισαγωγή"
|
msgstr "Αφαίρεση απεγκατεστημένων παιχνιδιών"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Πηγές"
|
msgstr "Πηγές"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
#, fuzzy
|
|
||||||
#| msgid "itch Install Location"
|
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Τοποθεσία Εγκατάστασης itch"
|
msgstr "Τοποθεσία εγκατάστασης"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Lutris Cache Location"
|
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Τοποθεσία cache του Lutris"
|
msgstr "Τοποθεσία cache"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Εισαγωγή Παιχνιδιών Steam"
|
msgstr "Εισαγωγή παιχνιδιών Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Import Steam Games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Εισαγωγή Παιχνιδιών Steam"
|
msgstr "Εισαγωγή παιχνιδιών Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Εισαγωγή Παιχνιδιών Epic"
|
msgstr "Εισαγωγή παιχνιδιών Epic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Εισαγωγή Παιχνιδιών GOG"
|
msgstr "Εισαγωγή παιχνιδιών GOG"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Εισαγωγή παιχνιδιών Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Εισαγωγή Παιχνιδιών Μέσω Sideloading"
|
msgstr "Εισαγωγή παιχνιδιών μέσω sideloading"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bottles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr "Legendary"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Game Launcher"
|
#| msgid "Set Location"
|
||||||
msgid "Import Game Launchers"
|
msgid "System Location"
|
||||||
msgstr "Πρόγραμμα Εκκίνησης Παιχνιδιών"
|
msgstr "Ορίστε Τοποθεσία"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Set Location"
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Ορίστε Τοποθεσία"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Εισαγωγή εκκινητών παιχνιδιών"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Εισαγωγές desktop"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Επιβεβαίωση"
|
msgstr "Επιβεβαίωση"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "Κλειδί API"
|
msgstr "Κλειδί API"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Χρήση SteamGridDB"
|
msgstr "Χρήση SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Λήψη εικόνων κατά τη διάρκεια πρόσθεσης ή εισαγωγής παιχνιδιών"
|
msgstr "Λήψη εικόνων κατά τη διάρκεια πρόσθεσης ή εισαγωγής παιχνιδιών"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Προτίμηση Επίσημων Εικόνων"
|
msgstr "Προτίμηση Επίσημων Εικόνων"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Προτίμηση Κινούμενων Εικόνων"
|
msgstr "Προτίμηση Κινούμενων Εικόνων"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Ανανέωση εξώφυλλου"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Ανάκτηση εξώφυλλων για τα προϋπάρχων παιχνίδια στη βιβλιοθήκη σας"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
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"
|
||||||
msgstr "Δεν Βρέθηκαν Παιχνίδια"
|
msgstr "Δεν Βρέθηκαν Παιχνίδια"
|
||||||
@@ -343,118 +368,135 @@ msgstr "Δεν υπάρχουν κρυφά παιχνίδια"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Τα παιχνίδια που κρύβετε θα εμφανίζονται εδώ."
|
msgstr "Τα παιχνίδια που κρύβετε θα εμφανίζονται εδώ."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Πίσω"
|
msgstr "Όλα τα παιχνίδια"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Τίτλος παιχνιδιού"
|
msgstr "Προστέθηκε"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Παίξτε"
|
msgstr "Εισήχθη"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Προσθήκη παιχνιδιού"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Κύριο μενού"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Κρυμμένα παιχνίδια"
|
msgstr "Κρυμμένα παιχνίδια"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Τίτλος παιχνιδιού"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Παίξτε"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Ταξινόμηση"
|
msgstr "Ταξινόμηση"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "Α-Ζ"
|
msgstr "Α-Ζ"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Ζ-Α"
|
msgstr "Ζ-Α"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Νεότερο"
|
msgstr "Νεότερο"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Παλαιότερο"
|
msgstr "Παλαιότερο"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Τελευταία αναπαραγωγή"
|
msgstr "Τελευταία αναπαραγωγή"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Εμφάνιση Κρυφών"
|
msgstr "Εμφάνιση Κρυφών"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Συντομεύσεις Πληκτρολογίου"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Σχετικά με τις Κασέτες"
|
msgstr "Σχετικά με τις Κασέτες"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} εκκινήθη"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Yiannis Ioannides"
|
msgstr "Yiannis Ioannides"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Προστέθηκε: {}"
|
msgstr "Προστέθηκε: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Ποτέ"
|
msgstr "Ποτέ"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Τελευταία αναπαραγωγή: {}"
|
msgstr "Τελευταία αναπαραγωγή: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Εφαρμογή"
|
msgstr "Εφαρμογή"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Προσθήκη νέου παιχνιδιού"
|
msgstr "Προσθήκη νέου παιχνιδιού"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Επιβεβαίωση"
|
msgstr "Προσθήκη"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Προγράμματα"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "αρχειο.txt"
|
msgstr "αρχειο.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "Πρόγραμμα"
|
msgstr "πρόγραμμα"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\προς\\φάκελο\\{}"
|
msgstr "C:\\προς\\φάκελο\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/προς/φάκελο/{}"
|
msgstr "/προς/φάκελο/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -478,105 +520,182 @@ msgstr ""
|
|||||||
"Αν η διεύθυνση φακέλου περιέχει κενά, φροντίστε να την περικλείσετε σε διπλά "
|
"Αν η διεύθυνση φακέλου περιέχει κενά, φροντίστε να την περικλείσετε σε διπλά "
|
||||||
"εισαγωγικά!"
|
"εισαγωγικά!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Αδυναμία προσθήκης παιχνιδιού"
|
msgstr "Αδυναμία προσθήκης παιχνιδιού"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Ο τίτλος παιχνιδιού δεν μπορεί να είναι κενός."
|
msgstr "Ο τίτλος παιχνιδιού δεν μπορεί να είναι κενός."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "Η εφαρμογή δεν μπορεί να είναι κενή."
|
msgstr "Η εφαρμογή δεν μπορεί να είναι κενή."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
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
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} εκκινήθη"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} αποκρύφθηκε"
|
msgstr "{} αποκρύφθηκε"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} φανερώθηκε"
|
msgstr "{} φανερώθηκε"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} αφαιρέθηκε"
|
msgstr "{} αφαιρέθηκε"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Όλα τα παιχνίδια αφαιρέθηκαν"
|
msgstr "Όλα τα παιχνίδια αφαιρέθηκαν"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Για τη χρήση του SteamGridDB απαιτείται ένα κλειδί API. Μπορείτε να "
|
"Για τη χρήση του SteamGridDB απαιτείται ένα κλειδί API. Μπορείτε να "
|
||||||
"δημιουργήσετε ένα {}εδώ{}."
|
"δημιουργήσετε ένα {}εδώ{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
#, fuzzy
|
msgid "Downloading covers…"
|
||||||
#| msgid "Installation Not Found"
|
msgstr "Λήψη εξώφυλλων…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Τα εξώφυλλα ανανεώθηκαν"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Η εγκατάσταση δεν βρέθηκε"
|
msgstr "Η εγκατάσταση δεν βρέθηκε"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
msgstr "Επιλέξτε έναν έγκυρο προορισμό."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Προσοχή"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr "Μη έγκυρος προορισμός"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} configuration directory."
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr "Επιλέξτε τον κατάλογο διαμόρφωσης {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr "Ορίστε Τοποθεσία"
|
msgstr "Ορίστε Τοποθεσία"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr "Απόρριψη"
|
msgstr "Απόρριψη"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
#, fuzzy
|
msgid "Importing Games…"
|
||||||
#| msgid "Couldn't Connect to SteamGridDB"
|
msgstr "Εισαγωγή παιχνιδιών…"
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
|
||||||
msgstr "Η σύνδεση στο SteamGridDB δεν μπόρεσε να πραγματοποιηθεί"
|
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/importer/importer.py:338
|
||||||
msgid "Verify your API key in preferences"
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Τα παρακάτω σφάλματα παρουσιάστηκαν κατά την εισαγωγή:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Δεν βρέθηκαν νέα παιχνίδια"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 παιχνίδι εισήχθη"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} παιχνίδια εισήχθησαν"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 αφαιρέθηκε"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Επιλέξτε τον προορισμό cache του {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Επιλέξτε τον προορισμό ρυθμίσεων του {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Επιλέξτε τον προορισμό δεδομένων του {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "Δεν υπάρχει επιλεγμένος πυρήνας RetroArch"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Οι παρακάτω λίστες δεν έχουν προεπιλεγμένο πυρήνα:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Παιχνίδια χωρίς επιλεγμένο πυρήνα δεν εισήχθησαν"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Η επιβεβαίωση γνησιότητας του SteamGridDB δεν μπόρεσε να πραγματοποιηθεί"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "Επιβεβαιώστε το κλειδί API σας στις ρυθμίσεις"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Βιβλιοθήκη"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Εμφάνιση προτιμήσεων"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Συντομεύσεις"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Άνοιγμα μενού"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Πρόσθεση νέου παιχνιδιού"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Εισαγωγή παιχνιδιών"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Πίσω"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Αναζήτηση παιχνιδιών"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Αναζήτηση κρυμμένων παιχνιδιών"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Τίτλος Παιχνιδιού"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Προγραμματιστής"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Αρχείο προς άνοιγμα ή εντολή προς εκτέλεση κατά την εκκίνηση παιχνιδιού"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Επιβεβαίωση"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Cache Not Found"
|
#~| msgid "Cache Not Found"
|
||||||
@@ -608,18 +727,3 @@ msgstr ""
|
|||||||
|
|
||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Επιλέξτε τη τοποθεσία cache του Lutris."
|
#~ msgstr "Επιλέξτε τη τοποθεσία cache του Lutris."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Εισαγωγή παιχνιδιών…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Εισαγωγή εξώφυλλων…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Δεν βρέθηκαν νέα παιχνίδια"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "1 παιχνίδι εισήχθη"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "{} παιχνίδια εισήχθησαν"
|
|
||||||
|
|||||||
587
po/es.po
@@ -1,16 +1,17 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
# SOME DESCRIPTIVE TITLE.
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
# This file is distributed under the same license as the cartridges package.
|
# This file is distributed under the same license as the cartridges package.
|
||||||
# Óscar Fernández Díaz <oscfdezdz@users.noreply.hosted.weblate.org>, 2023.
|
# Óscar Fernández Díaz <oscfdezdz@users.noreply.hosted.weblate.org>, 2023, 2024.
|
||||||
# gallegonovato <fran-carro@hotmail.es>, 2023.
|
# gallegonovato <fran-carro@hotmail.es>, 2023.
|
||||||
# kramo <contact@kramo.hu>, 2023.
|
# kramo <contact@kramo.hu>, 2023.
|
||||||
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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-07-04 17:29+0000\n"
|
"PO-Revision-Date: 2024-02-19 06:35+0000\n"
|
||||||
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
|
"Last-Translator: Óscar Fernández Díaz <oscfdezdz@users.noreply.hosted.weblate"
|
||||||
|
".org>\n"
|
||||||
"Language-Team: Spanish <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Spanish <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/es/>\n"
|
"cartridges/es/>\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
@@ -18,11 +19,12 @@ 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.0-dev\n"
|
"X-Generator: Weblate 5.4\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartuchos"
|
msgstr "Cartuchos"
|
||||||
|
|
||||||
@@ -36,8 +38,11 @@ msgid "Launch all your games"
|
|||||||
msgstr "Lance todos sus juegos"
|
msgstr "Lance todos sus juegos"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
"juegos;lanzador;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -46,25 +51,23 @@ msgid ""
|
|||||||
"necessary. You can sort and hide games or download cover art from "
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Cartridges es un lanzador simple para todos tus juegos. Admite la "
|
"Cartuchos es un sencillo lanzador de juegos para todos sus juegos. Tiene "
|
||||||
"importación de tus juegos de Steam, Lutris, Heroic y más sin necesidad de "
|
"soporte para importar juegos de Steam, Lutris, Heroic y más sin necesidad de "
|
||||||
"una cuenta. Puedes ordenar y ocultar juegos, o descargar carátulas de "
|
"iniciar sesión. Puede ordenar y ocultar juegos o descargar portadas de "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Biblioteca"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Editar detalles del juego"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Detalles del juego"
|
msgstr "Detalles del juego"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Editar detalles del juego"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Preferencias"
|
msgstr "Preferencias"
|
||||||
|
|
||||||
@@ -72,245 +75,273 @@ msgstr "Preferencias"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "Nueva caratula"
|
msgstr "Portada nueva"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "Borrar la caratula"
|
msgstr "Borrar portada"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Título"
|
msgstr "Título"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "El título del juego"
|
msgstr "Desarrollador (opcional)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Desarrollador"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "El desarrollador o editor (opcional)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Ejecutable"
|
msgstr "Ejecutable"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "Archivo a abrir o comando a ejecutar al iniciar el juego"
|
msgstr "Seleccionar archivo"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Más información"
|
msgstr "Más información"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Editar"
|
msgstr "Editar"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Ocultar"
|
msgstr "Ocultar"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Mostrar"
|
msgstr "Desocultar"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "General"
|
msgstr "General"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Salir"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Buscar"
|
msgstr "Buscar"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Mostrar preferencias"
|
msgstr "Atajos del teclado"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Atajos"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Deshacer"
|
msgstr "Deshacer"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Abrir menú"
|
msgstr "Salir"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Conmutar la barra lateral"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Menú principal"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Juegos"
|
msgstr "Juegos"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Añadir juego nuevo"
|
msgstr "Añadir juego"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Importar juegos"
|
msgid "Import"
|
||||||
|
msgstr "Importar"
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Mostrar juegos ocultos"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
msgid "Remove game"
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Mostrar juegos ocultos"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
msgstr "Eliminar juego"
|
msgstr "Eliminar juego"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Conducta"
|
msgstr "Comportamiento"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr "Salir después de iniciar juegos"
|
msgstr "Salir después de iniciar juegos"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr "La imagen de portada lanza el juego"
|
msgstr "La imagen de portada lanza el juego"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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 ""
|
||||||
"Cambia el comportamiento de la imagen de portada y del botón de reproducción"
|
"Cambia el comportamiento de la imagen de portada y del botón de reproducción"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr "Imágenes"
|
msgstr "Imágenes"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr "Imágenes de alta calidad"
|
msgstr "Imágenes de alta calidad"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
msgstr "Guarda las partidas sin pérdidas a costa del almacenamiento"
|
msgstr "Guarda las partidas sin pérdidas a costa del almacenamiento"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zona peligrosa"
|
msgstr "Zona de peligro"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr "Quitar todos los juegos"
|
msgstr "Eliminar todos los juegos"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
#: data/gtk/preferences.blp:119
|
||||||
msgid "Import"
|
msgid "Remove Uninstalled Games"
|
||||||
msgstr "Importar"
|
msgstr "Eliminar los juegos desinstalados"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Fuentes"
|
msgstr "Fuentes"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Lugar de la instalación"
|
msgstr "Ruta de instalación"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Localización de la caché"
|
msgstr "Ruta de la caché"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Importar juegos de Steam"
|
msgstr "Importar juegos de Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Importar los juegos Flatpak"
|
msgstr "Importar juegos Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Importar juegos de Epic"
|
msgstr "Importar juegos de Epic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Importar juegos de GOG"
|
msgstr "Importar juegos de GOG"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importar juegos de Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Importar juegos descargados"
|
msgstr "Importar juegos descargados"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bottles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr "Legendario"
|
msgstr "Legendario"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr "Flatpak"
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Ubicación del sistema"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Ubicación del usuario"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "Importar lanzadores de juegos"
|
msgstr "Importar lanzadores de juegos"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Entradas de escritorio"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Autentificación"
|
msgstr "Autenticación"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "Código API"
|
msgstr "Clave API"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Utiliza SteamGridDB"
|
msgstr "Usar SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Descargar las imágenes al añadir o importar juegos"
|
msgstr "Descargar las imágenes al añadir o importar juegos"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Preferir las imágenes oficiales"
|
msgstr "Preferir las imágenes oficiales"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Prefiero las imágenes animadas"
|
msgstr "Prefiero las imágenes animadas"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Actualizar las portadas"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Busca las portadas de los juegos de su biblioteca"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Actualizar"
|
||||||
|
|
||||||
#: 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"
|
||||||
msgstr "No se han encontrado juegos"
|
msgstr "No se han encontrado juegos"
|
||||||
@@ -335,118 +366,135 @@ msgstr "No hay juegos ocultos"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Los juegos que oculte aparecerán aquí."
|
msgstr "Los juegos que oculte aparecerán aquí."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Volver"
|
msgstr "Todos los juegos"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Título del juego"
|
msgstr "Añadido"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Jugar"
|
msgstr "Importado"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Añadir juego"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Menú principal"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Juegos ocultos"
|
msgstr "Juegos ocultos"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Título del juego"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Jugar"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Ordenar"
|
msgstr "Ordenar"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Más recientes"
|
msgstr "Más recientes"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Más antiguos"
|
msgstr "Más antiguos"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Último jugado"
|
msgstr "Último jugado"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Mostrar ocultos"
|
msgstr "Mostrar ocultos"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Atajos del teclado"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Acerca de Cartuchos"
|
msgstr "Acerca de Cartuchos"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} comenzó"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Óscar Fernández Díaz <oscfdezdz@tuta.io>"
|
msgstr "Óscar Fernández Díaz <oscfdezdz@tuta.io>"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Añadido: {}"
|
msgstr "Añadido: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Nunca"
|
msgstr "Nunca"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Último jugado: {}"
|
msgstr "Último jugado: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Aplicar"
|
msgstr "Aplicar"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Añadir juego nuevo"
|
msgstr "Añadir un nuevo Juego"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Confirmar"
|
msgstr "Añadir"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Ejecutables"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "archivo.txt"
|
msgstr "archivo.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "programa"
|
msgstr "programa"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\ruta\\hasta\\{}"
|
msgstr "C:\\ruta\\hasta\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/ruta/hasta/{}"
|
msgstr "/ruta/hasta/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -468,105 +516,187 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Si la ruta contiene espacios, ¡asegúrese de entrecomillarla!"
|
"Si la ruta contiene espacios, ¡asegúrese de entrecomillarla!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "No se puede añadir el juego"
|
msgstr "No se puede añadir el juego"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "El título del juego no puede estar vacío."
|
msgstr "El título del juego no puede estar vacío."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "El ejecutable no puede estar vacío."
|
msgstr "El ejecutable no puede estar vacío."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "No se pudieron aplicar las preferencias"
|
msgstr "No se pudieron aplicar las preferencias"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} comenzó"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} oculto"
|
msgstr "{} oculto"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} visible"
|
msgstr "{} visible"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} eliminado"
|
msgstr "{} eliminado"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Todos los juegos eliminados"
|
msgstr "Todos los juegos eliminados"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Se necesita una clave API para utilizar SteamGridDB. Puedes generar una {}"
|
"Se necesita una clave API para utilizar SteamGridDB. Puedes generar una {}"
|
||||||
"aquí{}."
|
"aquí{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Descargando las portadas…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Portadas actualizadas"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Instalación no encontrada"
|
msgstr "Instalación no encontrada"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Selecciona un directorio válido."
|
msgstr "Seleccione un directorio válido."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Advertencia"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr "Directorio incorrecto"
|
msgstr "Directorio no válido"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr "Seleccione el directorio de la caché {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} installation directory."
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr "Selecciona el directorio de la instalación {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} cache directory."
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr "Seleccione el directorio de la caché {}."
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr "Escoger la ubicación"
|
msgstr "Escoger la ubicación"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr "Descartar"
|
msgstr "Descartar"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Importando juegos…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Han sucedido los siguientes fallos durante la importación:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "No se encontraron juegos nuevos"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 juego importado"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} juegos importados"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 eliminado"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Seleccione el directorio de la caché de {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Seleccione el directorio de configuración de {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Selecciona el directorio de los datos {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "No hay ningún núcleo RetroArch seleccionado"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr ""
|
||||||
|
"Las siguientes listas de reproducción no tienen un núcleo predeterminado:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Los juegos sin núcleo seleccionado no se importaron"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "No se ha podido autenticar SteamGridDB"
|
msgstr "No se ha podido autenticar SteamGridDB"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr "Verifica tu clave API en las preferencias"
|
msgstr "Verifique su clave API en las preferencias"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Biblioteca"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Mostrar preferencias"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Atajos"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Abrir menú"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Añadir un nuevo juego"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Importar juegos"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Volver"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Buscar los juegos"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Buscar los juegos ocultos"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "El título del juego"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Desarrollador"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Archivo a abrir o comando a ejecutar al iniciar el juego"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Confirmar"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
#~ msgstr "No se encuentra el directorio de Steam."
|
#~ msgstr "No se encuentra el directorio de Steam."
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Confirm"
|
|
||||||
#~ msgid "Configuration"
|
#~ msgid "Configuration"
|
||||||
#~ msgstr "Confirmar"
|
#~ msgstr "Confirmar"
|
||||||
|
|
||||||
@@ -594,21 +724,6 @@ msgstr "Verifica tu clave API en las preferencias"
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Selecciona el directorio de la caché de Lutris."
|
#~ msgstr "Selecciona el directorio de la caché de Lutris."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Importando juegos…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Importando las portadas…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "No se encontraron juegos nuevos"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "1 juego importado"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "0 juegos importados"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Directorio a usar para importar juegos"
|
#~ msgstr "Directorio a usar para importar juegos"
|
||||||
|
|
||||||
@@ -663,19 +778,16 @@ msgstr "Verifica tu clave API en las preferencias"
|
|||||||
#~ msgstr "/ruta/hasta/{file_name}"
|
#~ msgstr "/ruta/hasta/{file_name}"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "General"
|
|
||||||
#~ msgctxt "shortcuts window"
|
#~ msgctxt "shortcuts window"
|
||||||
#~ msgid "General"
|
#~ msgid "General"
|
||||||
#~ msgstr "General"
|
#~ msgstr "General"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Search"
|
|
||||||
#~ msgctxt "shortcuts window"
|
#~ msgctxt "shortcuts window"
|
||||||
#~ msgid "Search"
|
#~ msgid "Search"
|
||||||
#~ msgstr "Buscar"
|
#~ msgstr "Buscar"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Undo"
|
|
||||||
#~ msgctxt "shortcuts window"
|
#~ msgctxt "shortcuts window"
|
||||||
#~ msgid "Undo"
|
#~ msgid "Undo"
|
||||||
#~ msgstr "Deshacer"
|
#~ msgstr "Deshacer"
|
||||||
@@ -721,3 +833,6 @@ msgstr "Verifica tu clave API en las preferencias"
|
|||||||
|
|
||||||
#~ msgid "Talking to Steam"
|
#~ msgid "Talking to Steam"
|
||||||
#~ msgstr "Hablando con Steam"
|
#~ msgstr "Hablando con Steam"
|
||||||
|
|
||||||
|
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||||
|
#~ msgstr "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||||
|
|||||||
741
po/fa.po
@@ -2,13 +2,14 @@
|
|||||||
# 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.
|
||||||
# سید حسین موسوی فرد <shmf1385@protonmail.com>, 2023.
|
# سید حسین موسوی فرد <shmf1385@protonmail.com>, 2023.
|
||||||
|
# Danial Behzadi <dani.behzi@ubuntu.com>, 2023.
|
||||||
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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-04-22 10:48+0000\n"
|
"PO-Revision-Date: 2023-09-24 16:04+0000\n"
|
||||||
"Last-Translator: سید حسین موسوی فرد <shmf1385@protonmail.com>\n"
|
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\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"
|
||||||
@@ -16,11 +17,12 @@ 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 4.18-dev\n"
|
"X-Generator: Weblate 5.1-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "کارتریجها"
|
msgstr "کارتریجها"
|
||||||
|
|
||||||
@@ -31,11 +33,14 @@ msgstr "اجراگر بازی"
|
|||||||
#: data/hu.kramo.Cartridges.desktop.in:5
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
msgid "Launch all your games"
|
msgid "Launch all your games"
|
||||||
msgstr "اجرای همهٔ بازیهای شما"
|
msgstr "اجرای همهٔ بازیهایتان"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
"بازی;استیم;لوتریس;هروییک;بطریها;باتلز;ایچ;فلتپک;لجندری;رتروآرچ;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -44,409 +49,454 @@ msgid ""
|
|||||||
"necessary. You can sort and hide games or download cover art from "
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"کارتریج یک اجراگر سادهٔ بازی برای همهٔ بازیهای شماست. کارتریج میتواند بدون "
|
"کارتریج یک اجراگر سادهٔ بازی برای همهٔ بازیهایتان است. کارتریج میتواند بدون "
|
||||||
"نیاز به ورود، بازیهای شما را از استیم، لوتریس، هیروییک و... وارد کند. شما "
|
"نیاز به ورود، بازیهایتان را از استیم، لوتریس، هروییک و… وارد کند. میتوانید "
|
||||||
"میتوانید بازیهای خود را پنهان کنید یا جلدشان را از SteamGridDB بارگیری کنید."
|
"بازیهایتان را نهفته یا طرح جلدشان را از SteamGridDB بگیرید."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "کتابخانه"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "ویرایش جزییات بازی"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "جزییات بازی"
|
msgstr "جزییات بازی"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "ویرایش جزییات بازی"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "ترجیحات"
|
msgstr "ترجیحات"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:25
|
#: data/gtk/details-window.blp:25
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr "لغو"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr "طرج جلد جدید"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr "حذف طرح جلد"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "عنوان"
|
msgstr "عنوان"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr ""
|
msgstr "توسعهدهنده (اختیاری)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr ""
|
msgstr "اجرایی"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr ""
|
msgstr "گزینش پرونده"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr "اطّلاعات بیشتر"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "ویرایش"
|
msgstr "ویرایش"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "پنهان کردن"
|
msgstr "نهفتن"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "حذف"
|
msgstr "برداشتن"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: 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:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "عمومی"
|
msgstr "عمومی"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "خروج"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "جستوجو"
|
msgstr "جستوجو"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "نمایش ترجیحات"
|
msgstr "میانبرهیا صفحهکلید"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "میانبرها"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "برگردان"
|
msgstr "برگردان"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "گشودن فهرست"
|
msgstr "خروج"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "تغییر وضعیت نوار کناری"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "فهرست اصلی"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "بازیها"
|
msgstr "بازیها"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "افزدون بازی"
|
msgstr "افزودن بازی"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "درونریزی بازی"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "نمایش بازیهای پنهان"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "حذف کردن بازی"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr "خروج پس از اجرا کردن بازی"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr "عکس جلد بازی را باز میکند"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr "عکسها"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr "عکسهای با کیفیت بالا"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr "منطقهٔ خطر"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr "حذف کردن همهٔ بازیها"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "درونریزی"
|
msgstr "درونریزی"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "نمایش بازیهای نهفته"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "برداشتن بازی"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "رفتار"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "خروج پس از اجرا کردن بازی"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "طرح جلد بازی را اجرا میکند"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "تعویض رفتار تصویر جلد و دکمهٔ بازی کردن"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "عکسها"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "عکسهای با کیفیت بالا"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "ذخیرهٔ طرح جلدهای بدون اتلاف به فیمت ذخیرهسازی"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "منطقهٔ خطر"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "حذف کردن همهٔ بازیها"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "برداشن بازیهای نصب نشده"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "منبعها"
|
msgstr "منبعها"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "استیم"
|
msgstr "استیم"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr ""
|
msgstr "مکان نصب"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr ""
|
msgstr "لوتریس"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr ""
|
msgstr "مکان انباره"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr ""
|
msgstr "درونریزی بازیهای استیم"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Import games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "درونریزی بازی"
|
msgstr "درونریزی بازیهای فلتپک"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr ""
|
msgstr "هروییک"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr ""
|
msgstr "درونریزی بازیهای اپیک"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
|
||||||
msgid "Import GOG Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
|
||||||
msgid "Import Sideloaded Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
|
||||||
msgid "Bottles"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
|
||||||
msgid "itch"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "درونریزی بازیهای گوگ"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "درونریزی بازیهای آمازون"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "درونریزی بازیهای نصب شده"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "بطریها"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "ایچ"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr "لجندری"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "رتروآرچ"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr "فلتپک"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Game Launcher"
|
#| msgid "Set Location"
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "تنظیم مکان"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Set Location"
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "تنظیم مکان"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "اجراگر بازی"
|
msgstr "درونریزی اجراگرهای بازی"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "ورودیهای میزکار"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr ""
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr ""
|
msgstr "هویتسنجی"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr ""
|
msgstr "کلید API"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr ""
|
msgstr "استفاده از SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr ""
|
msgstr "بارگیری تصویرها هنگام افزودن یا درونریزی بازیها"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "ترجیح به تصویرهای رسمی"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "ترچیح تصویرهای پویا"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete Cover"
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "حذف طرح جلد"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:405
|
||||||
msgid "Prefer Animated Images"
|
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"
|
||||||
msgstr ""
|
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"
|
||||||
msgstr ""
|
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"
|
||||||
msgstr ""
|
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:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr ""
|
msgstr "همهٔ بازیها"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr ""
|
msgstr "افزوده"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr ""
|
msgstr "درونریخته"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr ""
|
msgstr "بازیهای نهفته"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "عنوان بازی"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "بازی کردن"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr ""
|
msgstr "ترتیب"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr ""
|
msgstr "آ-ی"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr ""
|
msgstr "ی-آ"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr ""
|
msgstr "جدیدترین"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr ""
|
msgstr "قدیمیترین"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr ""
|
msgstr "آخرین بازی شده"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr ""
|
msgstr "نمایش نهفته"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
|
msgstr "دربارهٔ کارتریجها"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} اجرا شد"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr ""
|
msgstr "دانیال بهزادی <dani.behzi@ubuntu.com>"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr ""
|
msgstr "افزوده: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr ""
|
msgstr "هرگز"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr ""
|
msgstr "آخرین بازی شده: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr "اعمال"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr ""
|
msgstr "افزودن بازی جدید"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr ""
|
msgstr "افزودن"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "اجراییها"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr ""
|
msgstr "پرونده.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr ""
|
msgstr "برنامه"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr ""
|
msgstr "C:\\Path\\to\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr ""
|
msgstr "/path/to/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -458,94 +508,175 @@ 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"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"برای گشودن پروندهٔ {}با برنامهٔ پیشگزیده:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"اگر مسیر فاصله داشت، مطمئن شوید در نقلقول گذاشتهایدش!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr ""
|
msgstr "نتوانست بازی بیفزاید"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr ""
|
msgstr "عنوان بازی نمیتواند خالی باشد."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr ""
|
msgstr "اجرایی نمیتواند خالی باشد."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
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
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr ""
|
msgstr "{}نهفته"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr ""
|
msgstr "{} نانهفته"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr ""
|
msgstr "{} برداشته"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr ""
|
msgstr "همهٔ بازیها برداشته شدند"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"برای استفاده از SteamGridDB نیاز به یک کلید API است. میتوانید {}اینجا{} یکی "
|
||||||
|
"بسازید."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr ""
|
msgstr "نصب پیدا نشد"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr ""
|
msgstr "گزینش شاخهای معتبر."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "هشدار"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr "شاخهٔ نامعتبر"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr ""
|
msgstr "تنظیم مکان"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr ""
|
msgstr "رد"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "درونریزی بازیها…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "هنگام درونریزی خطاهای زیر رخ دادند:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "هیچ بازی جدیدی پیدا نشد"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "۱ بازی درونریخته شد"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} بازی درونریخته شدند"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "یکی برداشته شد"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "گزینش شاخهٔ انبارهٔ {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "گزینش شاخهٔ پیکربندی {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "گزینش شاخهٔ دادهٔ {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "هیچ هستهٔ رتروآرچی گزیده نشده"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "سیاهههای بازی کردن زیر هیچ هستهٔ پیشگزیدهای ندارند:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "بازیهای بدون هسته درونریزی نشدند"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr ""
|
msgstr "نتوانست در SteamGridDB هویتسنجی کند"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr "کلید APIتان را در ترجیحات تأیید کنید"
|
||||||
|
|
||||||
#, fuzzy
|
#~ msgid "Library"
|
||||||
#~| msgid "Add new game"
|
#~ msgstr "کتابخانه"
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "افزدون بازی"
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "نمایش ترجیحات"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "میانبرها"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "گشودن فهرست"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "افزودن بازی جدید"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "درونریزی بازیها"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "بازگشت"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "جستوجوی بازیها"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "جستوجوی بازیهای نهفته"
|
||||||
|
|||||||
672
po/fi.po
@@ -6,13 +6,14 @@
|
|||||||
# Kopimi <tatuus@tutanota.com>, 2023.
|
# Kopimi <tatuus@tutanota.com>, 2023.
|
||||||
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2023.
|
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2023.
|
||||||
# kramo <contact@kramo.hu>, 2023.
|
# kramo <contact@kramo.hu>, 2023.
|
||||||
|
# Scott Anecito <scott.anecito@linux.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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-05-07 15:38+0000\n"
|
"PO-Revision-Date: 2024-01-16 06:06+0000\n"
|
||||||
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
|
"Last-Translator: Scott Anecito <scott.anecito@linux.com>\n"
|
||||||
"Language-Team: Finnish <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Finnish <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/fi/>\n"
|
"cartridges/fi/>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
@@ -20,11 +21,12 @@ 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 4.18-dev\n"
|
"X-Generator: Weblate 5.4-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartridges"
|
msgstr "Cartridges"
|
||||||
|
|
||||||
@@ -38,15 +40,13 @@ msgid "Launch all your games"
|
|||||||
msgstr "Käynnistä kaikki pelisi"
|
msgstr "Käynnistä kaikki pelisi"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
"peli;pelaaminen;pullot;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
#, fuzzy
|
|
||||||
#| msgid ""
|
|
||||||
#| "Cartridges is a simple game launcher. It has support for importing your "
|
|
||||||
#| "games from Steam, Heroic and Bottles with organizational features such as "
|
|
||||||
#| "hiding and sorting by date added or last played."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cartridges is a simple game launcher for all of your games. It has support "
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
"for importing games from Steam, Lutris, Heroic and more with no login "
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
@@ -54,24 +54,21 @@ msgid ""
|
|||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Cartridges on helppo pelikäynnistin. Se tukee pelien tuontia Steamista, "
|
"Cartridges on helppo pelikäynnistin. Se tukee pelien tuontia Steamista, "
|
||||||
"Heroicista ja Bottlesista ja tarjoaa ominaisuuden järjestelyyn, kuten "
|
"Heroicista ja Bottlesista, sekä muistaa ilman kirjautumista. Voit lajitella "
|
||||||
"piilottamisen ja lajittelun lisäyspäivämäärän tai viimeisimmän pelatun pelin "
|
"tai piilottaa pelejä ja ladata kansikuvan SteamGridDB tietokannasta."
|
||||||
"mukaan."
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Kirjasto"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Muokkaa pelin tietoja"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Pelin tiedot"
|
msgstr "Pelin tiedot"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Muokkaa pelin tietoja"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Asetukset"
|
msgstr "Asetukset"
|
||||||
|
|
||||||
@@ -79,253 +76,275 @@ msgstr "Asetukset"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Peru"
|
msgstr "Peru"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr "Uusi kansi"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr "Poista kansi"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Nimi"
|
msgstr "Nimi"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "Pelin nimi"
|
msgstr "Kehittäjä (valinnainen)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Kehittäjä"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Kehittäjä tai julkaisija (valinnainen)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Suoritettava"
|
msgstr "Suoritettava"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr ""
|
msgstr "Valitse tiedosto"
|
||||||
"Tiedosto, joka avataan tai komento, joka ajetaan pelin käynnistämisen "
|
|
||||||
"yhteydessä"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr "Lisätietoja"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Muokkaa"
|
msgstr "Muokkaa"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Piilota"
|
msgstr "Piilota"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Poista"
|
msgstr "Poista"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Näytä"
|
msgstr "Näytä"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Yleistä"
|
msgstr "Yleistä"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Lopeta"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Etsi"
|
msgstr "Etsi"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Näytä asetukset"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
|
||||||
msgid "Shortcuts"
|
|
||||||
msgstr "Pikanäppäimet"
|
msgstr "Pikanäppäimet"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Kumoa"
|
msgstr "Kumoa"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Avaa valikko"
|
msgstr "Lopeta"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Sivupalkki päälle/pois"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Päävalikko"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Pelit"
|
msgstr "Pelit"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Lisää uusi peli"
|
msgstr "Lisää peli"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Tuo pelejä"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Näytä piilotetut pelit"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "Poista peli"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr "Toiminta"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr "Poistuminen pelin käynnistämisen jälkeen"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr "Kansikuva käynnistää pelin"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr "Kuvat"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr "Korkealaatuiset kuvat"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr "Tallenna pelien kansikuvat häviöttömästi tallennustilan kustannuksella"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr "Vaaravyöhyke"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr "Poista kaikki pelit"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Tuo"
|
msgstr "Tuo"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Näytä piilotetut pelit"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Poista peli"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Toiminta"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Poistuminen pelin käynnistämisen jälkeen"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "Kansikuva käynnistää pelin"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Vaihtaa keskenään kansikuvan ja Pelaa-painikkeen toiminnallisuuden"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Kuvat"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Korkealaatuiset kuvat"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Tallenna pelin kannet häviöttömästi tallennustilan kustannuksella."
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Vaaravyöhyke"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Poista kaikki pelit"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Poista kaikki pelit, joiden asennus on poistettu"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Lähteet"
|
msgstr "Lähteet"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
#, fuzzy
|
|
||||||
#| msgid "itch Install Location"
|
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "itch-asennuksen sijainti"
|
msgstr "Asennuspaikka"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Lutris Cache Location"
|
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Lutris-välimuistin sijainti"
|
msgstr "Välimuistin sijainti"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Tuo Steam-pelejä"
|
msgstr "Tuo Steam-pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Import Steam Games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Tuo Steam-pelejä"
|
msgstr "Tuo Flatpak-pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Tuo Epic-pelejä"
|
msgstr "Tuo Epic-pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Tuo GOG-pelejä"
|
msgstr "Tuo GOG-pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Tuo Amazon-pelejä"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Tuo Sideload-pelejä"
|
msgstr "Tuo Sideload-pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Pullot"
|
msgstr "Pullot"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr ""
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr "Legendaarinen"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Game Launcher"
|
#| msgid "Set Location"
|
||||||
msgid "Import Game Launchers"
|
msgid "System Location"
|
||||||
msgstr "Pelin käynnistin"
|
msgstr "Aseta sijainti"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Set Location"
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Aseta sijainti"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Tuo pelin käynnistimet"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Työpöytätietueet"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Tunnistautuminen"
|
msgstr "Tunnistautuminen"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "API-avain"
|
msgstr "API-avain"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Käytä SteamGridDB:tä"
|
msgstr "Käytä SteamGridDB:tä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Lataa kuvat pelejä lisätessä tai tuotaessa"
|
msgstr "Lataa kuvia, kun lisäät tai tuot pelejä"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Suosi virallisten kuvien sijaan"
|
msgstr "Mieluummin kuin virallisia kuvia"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Suosi animoituja kuvia"
|
msgstr "Mieluummin animoituja kuvia"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Päivitä kannet"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Nouda kuoret jo kirjastossa oleville peleille"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Päivitä"
|
||||||
|
|
||||||
#: 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"
|
||||||
@@ -351,118 +370,135 @@ msgstr "Ei piilotettuja pelejä"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Piilotetut pelit näkyvät täällä."
|
msgstr "Piilotetut pelit näkyvät täällä."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Takaisin"
|
msgstr "Kaikki pelit"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Pelin nimi"
|
msgstr "Lisätty"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Pelaa"
|
msgstr "Tuotu"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Lisää peli"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Päävalikko"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Piilotetut pelit"
|
msgstr "Piilotetut pelit"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Pelin nimi"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Pelaa"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Lajittele"
|
msgstr "Lajittele"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Uusin"
|
msgstr "Uusin"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Vanhin"
|
msgstr "Vanhin"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Viimeksi pelattu"
|
msgstr "Viimeksi pelattu"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Näytä piilotetut"
|
msgstr "Näytä piilotetut"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Pikanäppäimet"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Tietoja - Cartridges"
|
msgstr "Tietoja - Cartridges"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} käynnistetty"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Linux Sauna"
|
msgstr "Linux Sauna"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Lisätty: {}"
|
msgstr "Lisätty: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Ei koskaan"
|
msgstr "Ei koskaan"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Viimeksi pelattu: {}"
|
msgstr "Viimeksi pelattu: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Käytä"
|
msgstr "Käytä"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Lisää uusi peli"
|
msgstr "Lisää uusi peli"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Vahvista"
|
msgstr "Lisää"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Suoritettava"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "file.txt"
|
msgstr "file.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "ohjelma"
|
msgstr "ohjelma"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\polku\\kansioon\\{}"
|
msgstr "C:\\polku\\kansioon\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/polku/kansioon/{}"
|
msgstr "/polku/kansioon/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -474,108 +510,197 @@ 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 ""
|
||||||
"Käynnistääksesi suoritettavan ohjelman \"{exe_name}\", käytä komentoa:\n"
|
"Käynnistääksesi suoritettavan ohjelman \"{}\", käytä komentoa:\n"
|
||||||
"\n"
|
"\n"
|
||||||
"<tt>\"{}\"</tt>\n"
|
"<tt>\"{}\"</tt>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Avataksesi tiedoston \"{}\" oletussovelluksella, käytä komentoa:\n"
|
"Jos haluat avata tiedoston \"{}\" oletussovelluksella, käytä komentoa:\n"
|
||||||
"\n"
|
"\n"
|
||||||
"<tt>{} \"{}\"</tt>\n"
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Jos polku sisältää välilyöntejä, varmista, että se on suljettu "
|
"Jos polku sisältää välilyöntejä, varmista, että se on suljettu "
|
||||||
"kaksinkertaisiin lainausmerkkeihin!"
|
"kaksinkertaisiin lainausmerkkeihin!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Peliä ei voitu lisätä"
|
msgstr "Peliä ei voitu lisätä"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Pelin nimi ei voi olla tyhjä."
|
msgstr "Pelin nimi ei voi olla tyhjä."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "Suoritettava ei voi olla tyhjä."
|
msgstr "Suoritettava ei voi olla tyhjä."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Asetuksia ei voitu ottaa käyttöön"
|
msgstr "Asetuksia ei voitu ottaa käyttöön"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} käynnistetty"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} piilotettu"
|
msgstr "{} piilotettu"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} palautettu näkyviin"
|
msgstr "{} palautettu näkyviin"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} poistettu"
|
msgstr "{} poistettu"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Kaikki pelit poistettu"
|
msgstr "Kaikki pelit poistettu"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"API-avain on pakollinen, jos haluat käyttää SteamGridDB:tä. Voit luoda "
|
"SteamGridDB:n käyttäminen edellyttää API-avainta. Voit luoda sellaisen {}"
|
||||||
"avaimen {}täällä{}."
|
"täältä{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
#, fuzzy
|
msgid "Downloading covers…"
|
||||||
#| msgid "Installation Not Found"
|
msgstr "Ladataan kansikuvia…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Kannet päivitetty"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Asennusta ei löydy"
|
msgstr "Asennusta ei löydy"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr ""
|
msgstr "Valitse kelvollinen kansio."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Varoitus"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr "Virheellinen kansio"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr "Aseta sijainti"
|
msgstr "Aseta sijainti"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr "Hylkää"
|
msgstr "Hylkää"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
#, fuzzy
|
msgid "Importing Games…"
|
||||||
#| msgid "Couldn't Connect to SteamGridDB"
|
msgstr "Tuodaan pelejä…"
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
|
||||||
msgstr "Ei voitu yhdistää SteamGridDB:hen"
|
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Seuraavat virheet tapahtuivat tuonnin aikana:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Uusia pelejä ei löytynyt"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 peli tuotu"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} peliä tuotu"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 poistettu"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Valitse {}-välimuistikansio."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Valitse {}-asetuskansio."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Valitse {}-datakansio."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "RetroArch-ydintä ei ole valittu"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Seuraavilla soittolistoilla ei ole oletusydintä:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Pelejä, joihin ei ole valittu ydintä, ei tuotu"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "Ei voitu kirjautua SteamGridDB:hen"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr "Vahvista API-avaimesi asetuksissa"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Kirjasto"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Näytä asetukset"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Pikanäppäimet"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Avaa valikko"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Lisää uusi peli"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Tuo pelejä"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Takaisin"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Search"
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Etsi"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Show hidden games"
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Näytä piilotetut pelit"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Pelin nimi"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Kehittäjä"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Tiedosto, joka avataan tai komento, joka ajetaan pelin käynnistämisen "
|
||||||
|
#~ "yhteydessä"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Vahvista"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
#~| msgid "The Steam directory cannot be found."
|
||||||
@@ -608,27 +733,6 @@ msgstr ""
|
|||||||
#~ msgid "Cache Not Found"
|
#~ msgid "Cache Not Found"
|
||||||
#~ msgstr "Välimuistia ei löydy"
|
#~ msgstr "Välimuistia ei löydy"
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Tuodaan pelejä…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Tuodaan kansikuvia…"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "No Games Found"
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Pelejä ei löydetty"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Game Imported"
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "Peli tuotu"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Games Imported"
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "Pelit tuotu"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Hakemisto, jota käytetään pelejä tuotaessa"
|
#~ msgstr "Hakemisto, jota käytetään pelejä tuotaessa"
|
||||||
|
|
||||||
|
|||||||
528
po/fr.po
@@ -11,9 +11,9 @@ 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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-07-05 13:13+0000\n"
|
"PO-Revision-Date: 2023-12-16 21:06+0000\n"
|
||||||
"Last-Translator: Geoffrey Coulaud <geoffrey.coulaud+github@gmail.com>\n"
|
"Last-Translator: \"J. Lavoie\" <j.lavoie@net-c.ca>\n"
|
||||||
"Language-Team: French <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: French <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/fr/>\n"
|
"cartridges/fr/>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
@@ -21,13 +21,14 @@ 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.0-dev\n"
|
"X-Generator: Weblate 5.3\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartridges"
|
msgstr "Cartouches"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:4
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
msgid "Game Launcher"
|
msgid "Game Launcher"
|
||||||
@@ -39,8 +40,9 @@ msgid "Launch all your games"
|
|||||||
msgstr "Lancez tous vos jeux"
|
msgstr "Lancez tous vos jeux"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "gaming;jeux;lanceur;steam;lutris;heroic;bouteilles;itch;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr "jeu;lanceur;steam;lutris;heroic;bouteilles;itch;flatpak;legendary;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -49,25 +51,23 @@ msgid ""
|
|||||||
"necessary. You can sort and hide games or download cover art from "
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Cartridges est un lanceur de jeux simple pour tous vos jeux. Il prend en "
|
"Cartouches est un lanceur de jeux simple pour tous vos jeux. Il prend en "
|
||||||
"charge l’importation des jeux depuis Steam, Lutris, Heroic et d’autres "
|
"charge l’importation des jeux depuis Steam, Lutris, Heroic et d’autres "
|
||||||
"encore, sans nécessiter de connexion. Vous pouvez trier et masquer les jeux "
|
"encore, sans nécessiter de connexion. Vous pouvez trier et masquer les jeux "
|
||||||
"ou télécharger la pochette depuis SteamGridDB."
|
"ou télécharger la pochette depuis SteamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Bibliothèque"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Modifier les détails du jeu"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Détails du jeu"
|
msgstr "Détails du jeu"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Modifier les détails du jeu"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Préférences"
|
msgstr "Préférences"
|
||||||
|
|
||||||
@@ -75,247 +75,275 @@ msgstr "Préférences"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "Nouvelle couverture"
|
msgstr "Nouvelle couverture"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "Supprimer la couverture"
|
msgstr "Supprimer la couverture"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titre"
|
msgstr "Titre"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "Le titre du jeu"
|
msgstr "Développeur (facultatif)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Développeur"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Le développeur ou l’éditeur (facultatif)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Exécutable"
|
msgstr "Exécutable"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "Fichier à ouvrir ou commande à exécuter au lancement du jeu"
|
msgstr "Sélectionner un fichier"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Plus d’informations"
|
msgstr "Plus d’informations"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Modifier"
|
msgstr "Modifier"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Masquer"
|
msgstr "Masquer"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Ne plus masquer"
|
msgstr "Ne plus masquer"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Général"
|
msgstr "Général"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Quitter"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Rechercher"
|
msgstr "Rechercher"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Afficher les préférences"
|
msgstr "Raccourcis clavier"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Raccourcis"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Ouvrir le menu"
|
msgstr "Quitter"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Afficher ou Cacher la Barre Latérale"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Menu principal"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Jeux"
|
msgstr "Jeux"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Ajouter un nouveau jeu"
|
msgstr "Ajouter un jeu"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Importer des jeux"
|
msgid "Import"
|
||||||
|
msgstr "Importer"
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Afficher les jeux masqués"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
msgid "Remove game"
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Afficher les jeux masqués"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
msgstr "Supprimer le jeu"
|
msgstr "Supprimer le jeu"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Comportement"
|
msgstr "Comportement"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr "Quitter après avoir lancé les jeux"
|
msgstr "Quitter après avoir lancé les jeux"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr "Cliquer sur l’image de la pochette lance le jeu"
|
msgstr "Cliquer sur l’image de la pochette lance le jeu"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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 ""
|
||||||
"Intervertit le comportement de l’image de la pochette et du bouton de lecture"
|
"Intervertit le comportement de l’image de la pochette et du bouton de lecture"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr "Images"
|
msgstr "Images"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr "Images de haute qualité"
|
msgstr "Images de haute qualité"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Sauvegarde les pochettes des jeux sans perte, mais prend plus d'espace de "
|
"Sauvegarde les pochettes des jeux sans perte, mais prend plus d'espace de "
|
||||||
"stockage"
|
"stockage"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zone de danger"
|
msgstr "Zone de danger"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr "Supprimer tous les jeux"
|
msgstr "Supprimer tous les jeux"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
#: data/gtk/preferences.blp:119
|
||||||
msgid "Import"
|
msgid "Remove Uninstalled Games"
|
||||||
msgstr "Importer"
|
msgstr "Retirer les jeux désinstallés"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Sources"
|
msgstr "Sources"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Emplacement d'installation"
|
msgstr "Emplacement d'installation"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Emplacement du cache"
|
msgstr "Emplacement du cache"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Importer les jeux de Steam"
|
msgstr "Importer les jeux de Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Importer des jeux Flatpak"
|
msgstr "Importer des jeux Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Importer les jeux d'Epic Games"
|
msgstr "Importer les jeux d'Epic Games"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Importer les jeux de GOG"
|
msgstr "Importer les jeux de GOG"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importer les jeux Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Importer des jeux Sideloaded"
|
msgstr "Importer des jeux Sideloaded"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bouteilles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr "Légendaire"
|
msgstr "Légendaire"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr "Flatpak"
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Emplacement du système"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Emplacement de l'utilisateur"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "Importer des lanceurs de jeux"
|
msgstr "Importer des lanceurs de jeux"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Éléments de bureau"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Authentification"
|
msgstr "Authentification"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "Clé API"
|
msgstr "Clé API"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Utiliser SteamGridDB"
|
msgstr "Utiliser SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Télécharger les images lors de l’ajout ou de l’importation de jeux"
|
msgstr "Télécharger les images lors de l’ajout ou de l’importation de jeux"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Préférer à la place des images officielles"
|
msgstr "Préférer à la place des images officielles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Préférer les images animées"
|
msgstr "Préférer les images animées"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Mettre à jour les pochettes des jeux"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Récupérer les pochettes des jeux déjà présents dans votre bibliothèque"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Mise à jour"
|
||||||
|
|
||||||
#: 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"
|
||||||
msgstr "Aucun jeu trouvé"
|
msgstr "Aucun jeu trouvé"
|
||||||
@@ -340,118 +368,135 @@ msgstr "Pas de jeux masqués"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Les jeux que vous masquez apparaîtront ici."
|
msgstr "Les jeux que vous masquez apparaîtront ici."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Retour"
|
msgstr "Tous les Jeux"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Titre du jeu"
|
msgstr "Ajouté"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Jouer"
|
msgstr "Importé"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Ajouter un jeu"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Menu principal"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Jeux masqués"
|
msgstr "Jeux masqués"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Titre du jeu"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Jouer"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Trier"
|
msgstr "Trier"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Le plus récent"
|
msgstr "Le plus récent"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Le plus ancien"
|
msgstr "Le plus ancien"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Dernière session"
|
msgstr "Dernière session"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Afficher les masqués"
|
msgstr "Afficher les masqués"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Raccourcis clavier"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "À propos de Cartridges"
|
msgstr "À propos de Cartouches"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} lancé"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Irénée Thirion"
|
msgstr "Irénée Thirion, L. Chareton"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Ajouté : {}"
|
msgstr "Ajouté : {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Jamais"
|
msgstr "Jamais"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Dernière session : {}"
|
msgstr "Dernière session : {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Appliquer"
|
msgstr "Appliquer"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Ajouter un nouveau jeu"
|
msgstr "Ajouter un nouveau jeu"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Confirmer"
|
msgstr "Ajouter"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Exécutables"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "fichier.txt"
|
msgstr "fichier.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "programme"
|
msgstr "programme"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\chemin\\vers\\{}"
|
msgstr "C:\\chemin\\vers\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/chemin/vers/{}"
|
msgstr "/chemin/vers/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -467,102 +512,188 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"<tt>\"{}\"</tt>\n"
|
"<tt>\"{}\"</tt>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Pour ouvrir le fichier « {} » avec l’application par défaut, utilisez la "
|
"Pour ouvrir le fichier « {} » avec l’application par défaut, utilisez :\n"
|
||||||
"commande :\n"
|
|
||||||
"\n"
|
"\n"
|
||||||
"<tt>{} \"{}\"</tt>\n"
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Si le chemin d'accès contient des espaces, veillez à le mettre entre "
|
"Si le chemin d'accès contient des espaces, veillez à le mettre entre "
|
||||||
"guillemets !"
|
"guillemets !"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Impossible d’ajouter le jeu"
|
msgstr "Impossible d’ajouter le jeu"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Le titre du jeu ne peut pas être vide."
|
msgstr "Le titre du jeu ne peut pas être vide."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "L’exécutable ne peut pas être vide."
|
msgstr "L’exécutable ne peut pas être vide."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Impossible d’appliquer les préférences"
|
msgstr "Impossible d’appliquer les préférences"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} lancé"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} masqué"
|
msgstr "{} masqué"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} affiché"
|
msgstr "{} affiché"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} retiré"
|
msgstr "{} retiré"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Tous les jeux ont été supprimés"
|
msgstr "Tous les jeux ont été supprimés"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Une clé API est requise pour utiliser SteamGridDB. Vous pouvez en générer "
|
"Une clé API est requise pour utiliser SteamGridDB. Vous pouvez en générer "
|
||||||
"une {}ici{}."
|
"une {}ici{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Téléchargement des pochettes des jeux…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Couvertures des jeux mises à jour"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Installation introuvable"
|
msgstr "Installation introuvable"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Sélectionnez un répertoire valide."
|
msgstr "Sélectionnez un répertoire valide."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Attention"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr "Répertoire invalide"
|
msgstr "Répertoire invalide"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Définir l’emplacement"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Fermer"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Importation des jeux…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Les erreurs suivantes se sont produites durant l'importation :"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Aucun nouveau jeu trouvé"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 jeu importé"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} jeux importés"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 retiré"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:352
|
#: cartridges/importer/location.py:33
|
||||||
msgid "Select the {} cache directory."
|
msgid "Select the {} cache directory."
|
||||||
msgstr "Sélectionnez le répertoire de cache de {}."
|
msgstr "Sélectionnez le répertoire de cache de {}."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
msgid "Select the {} configuration directory."
|
msgid "Select the {} configuration directory."
|
||||||
msgstr "Sélectionnez le répertoire de configuration de {}."
|
msgstr "Sélectionnez le répertoire de configuration de {}."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr "Sélectionnez le répertoire de données de {}."
|
msgstr "Sélectionnez le répertoire de données de {}."
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
msgid "Set Location"
|
msgid "No RetroArch Core Selected"
|
||||||
msgstr "Définir l’emplacement"
|
msgstr "Aucun noyau RetroArch sélectionné"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
msgstr "Fermer"
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Les listes de lecture suivantes n'ont pas de noyau par défaut :"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Les jeux sans noyau sélectionné n'ont pas été importés"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "Impossible de se connecter à SteamGridDB"
|
msgstr "Impossible de se connecter à SteamGridDB"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr "Vérifiez votre clé API dans les préférences"
|
msgstr "Vérifiez votre clé API dans les préférences"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Bibliothèque"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Afficher les préférences"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Raccourcis"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Ouvrir le menu"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Ajouter un nouveau jeu"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Importer des jeux"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Retour"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Rechercher des jeux"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Rechercher dans les jeux masqués"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Le titre du jeu"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Développeur"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Fichier à ouvrir ou commande à exécuter au lancement du jeu"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Confirmer"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
#~| msgid "The Steam directory cannot be found."
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
@@ -597,21 +728,6 @@ msgstr "Vérifiez votre clé API dans les préférences"
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Sélectionnez le répertoire du cache de Lutris."
|
#~ msgstr "Sélectionnez le répertoire du cache de Lutris."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Importation des jeux…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Importation des pochettes des jeux…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Aucun nouveau jeu trouvé"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "1 jeu importé"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "{} jeux importés"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Répertoire à utiliser lors de l’importation de jeux"
|
#~ msgstr "Répertoire à utiliser lors de l’importation de jeux"
|
||||||
|
|
||||||
|
|||||||
648
po/hi.po
Normal file
@@ -0,0 +1,648 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# Nitin Khalia <weblate.scrambled777@simplelogin.com>, 2024.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2024-02-11 03:37+0000\n"
|
||||||
|
"Last-Translator: Nitin Khalia <weblate.scrambled777@simplelogin.com>\n"
|
||||||
|
"Language-Team: Hindi <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/hi/>\n"
|
||||||
|
"Language: hi\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||||
|
"X-Generator: Weblate 5.4-dev\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "Cartridges"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr "गेम लॉन्चर"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr "अपने सभी गेम्स लॉन्च करें"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"गेमिंग;लॉन्चर;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
"Cartridges आपके सभी गेम के लिए एक सरल गेम लॉन्चर है। इसमें बिना किसी लॉगिन "
|
||||||
|
"अवश्यक्ता के Steam, Lutris, Heroic और अन्य से गेम आयात करने का समर्थन है। आप "
|
||||||
|
"गेम को सॉर्ट और छिपा सकते हैं या SteamGridDB से कवर आर्ट डाउनलोड कर सकते हैं।"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr "गेम विवरण"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr "गेम विवरण संपादित करें"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "प्राथमिकताएँ"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "रद्द करें"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr "नया कवर"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr "कवर हटाएँ"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "शीर्षक"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr "विकासकर्ता (वैकल्पिक)"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr "एक्सेक्यूटेबल"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr "फाइल चुनें"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr "अधिक जानकारी"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "संपादित करें"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr "छुपाएं"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "हटाएँ"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr "सामने लाएँ"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr "जनरल"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "खोजें"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "कीबोर्ड शॉर्टकट"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr "पूर्ववत"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "छोड़ें"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "साइडबार टॉगल करें"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "मुख्य मेन्यू"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "गेम्स"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr "गेम जोड़ें"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr "आयात"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "छिपे हुए गेम्स दिखाएँ"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "गेम हटाएं"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "व्यवहार"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "गेम्स लॉन्च करने के बाद बाहर निकलें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "कवर छवि गेम लॉन्च करती है"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "कवर छवि और प्ले बटन के व्यवहार की अदला-बदली करता है"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "छवियां"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "उच्च गुणवत्ता वाली छवियां"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "स्टोरेज की कीमत पर हानि रहित तरीके से गेम कवर सहेजें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "खतरनाक क्षेत्र"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "सभी गेम्स हटाएं"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "अनइंस्टॉल किए गए गेम्स हटाएं"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "स्रोत"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "इंस्टॉल जगह"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "Lutris"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr "कैशे की जगह"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr "Steam गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr "Flatpak गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr "Heroic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr "Epic गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "GOG गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Amazon गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "साइडलोडेड गेम्स आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "Bottles"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "itch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr "Legendary"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr "Flatpak"
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "सिस्टम की जगह"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "उपयोगकर्ता की जगह"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "गेम लॉन्चर आयात करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "डेस्कटॉप प्रविष्टियाँ"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr "प्रमाणीकरण"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "API कुंजी"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr "SteamGridDB का प्रयोग करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr "गेम जोड़ते या आयात करते समय छवियां डाउनलोड करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "आधिकारिक छवियों से अधिक प्राथमिकता दें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "एनिमेटेड छवियों को प्राथमिकता दें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "कवर अपडेट करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "अपनी लाइब्रेरी में पहले से ही गेम के लिए कवर प्राप्त करें"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "अपडेट"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr "कोई गेम नहीं मिला"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr "कोई भिन्न खोज आज़माएँ।"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr "कोई गेम नहीं"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr "गेम जोड़ने के लिए + बटन का उपयोग करें।"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr "कोई छुपे गेम्स नहीं"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr "आपके द्वारा छिपाए गए गेम यहां दिखाई देंगे।"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "सभी गेम्स"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "जोड़ा गया"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "आयातित"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr "छुपे हुए गेम्स"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "गेम शीर्षक"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "खेलें"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr "क्रमबद्ध करें"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr "A-Z"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr "Z-A"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr "नवीनतम"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr "सबसे पुराने"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr "अंतिम बार खेला गया"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr "छुपा हुआ दिखाए"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr "Cartridges के बारे में"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} लॉन्च किया गया"
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr "Scrambled777 <weblate.scrambled777@simplelogin.com>"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr "जोड़ा गया: {}"
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "कभी नहीं"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr "अंतिम बार खेला गया: {}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "लागू"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr "नया गेम जोड़ें"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "जोड़ें"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "एक्सेक्यूटेबल"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "फाइल.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr "प्रोग्राम"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr "C:\\पथ\\को\\{}"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr "/पथ/को/{}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
"एक्सेक्यूटेबल \"{}\" लॉन्च करने के लिए, कमांड का उपयोग करें:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"डिफ़ॉल्ट एप्लिकेशन के साथ \"{}\" फाइल खोलने के लिए, इसका उपयोग करें:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"यदि पथ में रिक्त स्थान हैं, तो इसे दोहरे उद्धरण चिह्नों में लपेटना सुनिश्चित "
|
||||||
|
"करें!"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr "गेम नहीं जोड़ा जा सका"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr "गेम का शीर्षक रिक्त नहीं हो सकता।"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr "Executable खाली नहीं हो सकता।"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr "प्राथमिकताएँ लागू नहीं की जा सकीं"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr "{} छिपा हुआ"
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr "{} नहीं छिपा हुआ"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr "{} हटाया हुआ"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr "सभी गेम्स हटा दिए गए"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
"SteamGridDB का उपयोग करने के लिए API कुंजी की आवश्यकता होती है। आप {}यहां{} "
|
||||||
|
"एक उत्पन्न कर सकते हैं।"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "कवर डाउनलोड हो रहा है…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "कवर अप्डैटिड"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr "इंस्टालेशन नहीं मिला"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr "एक वैध डॉयरेक्टरी का चयन करें।"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "चेतावनी"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr "अवैध डॉयरेक्टरी"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "स्थान तय करें"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "खारिज"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "गेम्स आयात किया जा रहा है…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "आयात के दौरान निम्नलिखित त्रुटियाँ हुईं:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "कोई नया गेम्स नहीं मिले"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 गेम आयात किया गया"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} गेम्स आयातित"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 हटाया"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "{} कैशे डॉयरेक्टरी का चयन करें।"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "{} कॉन्फ़िगरेशन डॉयरेक्टरी का चयन करें।"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "{} डेटा डॉयरेक्टरी का चयन करें।"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "कोई RetroArch कोर चयनित नहीं"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "निम्नलिखित प्लेलिस्ट में कोई डिफ़ॉल्ट कोर नहीं है:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "बिना कोर के चयनित गेम्स का आयात नहीं किया गया"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "SteamGridDB को प्रमाणित नहीं किया जा सका"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "प्राथमिकताओं में अपनी API कुंजी सत्यापित करें"
|
||||||
650
po/hr.po
Normal file
@@ -0,0 +1,650 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# Milo Ivir <mail@milotype.de>, 2023.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2023-12-23 17:07+0000\n"
|
||||||
|
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
|
||||||
|
"Language-Team: Croatian <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/hr/>\n"
|
||||||
|
"Language: hr\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||||
|
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||||
|
"X-Generator: Weblate 5.4-dev\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "Cartridges"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr "Pokretač za igre"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr "Pokreni sve svoje igre"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"igranje;pokretač;para;lutris;heroic;bottles;butelje;itch;flatpak;legendary;"
|
||||||
|
"retroarch;"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
"Cartridges je jednostavan pokretač igri za sve tvoje igre. Podržava uvoz "
|
||||||
|
"igri sa Steama, Lutrisa, Heroica i drugih bez potrebe za prijavom. Možeš "
|
||||||
|
"promijeniti redoslijed igri, sakriti igre ili preuzeti naslovnice sa "
|
||||||
|
"SteamGridDB-a."
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr "Detalji igre"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Uredi detalje igre"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "Postavke"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Otkaži"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr "Nova naslovnica"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr "Izbriši naslovnicu"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Naslov"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr "Programer (opcijonalno)"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr "Izvršna datoteka"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr "Odaberi datoteku"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr "Daljnje informacije"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Uredi"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr "Sakrij"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Ukloni"
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr "Prikaži"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Općenito"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Traži"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "Tipkovnički prečaci"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr "Poništi"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "Zatvori aplikaciju"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Uključi/Isključi bočnu traku"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Glavni izbornik"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Igre"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr "Dodaj igru"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr "Uvezi"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Prikaži skrivene igre"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Ukloni igru"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Ponašanje"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Izađi nakon pokretanja igri"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "Slika naslovnice pokreće igru"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Mijenja ponašanje slike naslovnice i gumba za pokretanje igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Slike"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Slike visoke kvalitete"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Spremi nalsovnice igri bez gubitka kvalitete nauštrb memorije"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Opasno područje"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Ukloni sve igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Ukloni deinstalirane igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "Izvori"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "Steam"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "Instaliraj lokaciju"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "Lutris"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr "Lokacija predmemorije"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr "Uvezi Steam igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr "Uvezi Flatpak igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr "Heroic"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr "Uvezi Epic igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "Uvezi GOG igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Uvezi Amazon igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "Uvezi Sideloaded igre"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "Butelje"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "itch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr "Legendary"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr "Flatpak"
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Lokacija sustava"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Lokacija korisnika"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Uvezi pokretače igri"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Desktop unosi"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr "Autentifikacija"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "API Ključ"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr "Koristi SteamGridDB"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr "Preuzmi slike prilikom dodavanja ili uvoza igri"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr "Preferiraj službene slike"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr "Preferiraj animirane slike"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Aktualiziraj naslovnice"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Preuzmi naslovnice za igre koje se već nalaze u tvojoj knjižnici"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Aktualizirati"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr "Nije pronađena nijedna igra"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr "Pokušaj drugačiju pretragu."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr "Nema igri"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr "Koristi gump + za dodavanje igri."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr "Nema skrivenih igri"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr "Igre koje sakriješ će se pojaviti ovdje."
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "Sve igre"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "Dodano"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "Uvezeno"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr "Skrivene igre"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Naslov igre"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Igraj"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr "Redoslijed"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr "A-Z"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr "Z-A"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr "Najnovije"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr "Najstarije"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr "Zadnje igrane"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr "Prikaži skrivene"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr "Informacije o Cartridges"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "Pokrenuto: {}"
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr "Milo Ivir <mail@milotype.de>"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr "Dodano: {}"
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Nikada"
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr "Zadnje igrane: {}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Primijeni"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr "Dodaj novu igru"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "Dodaj"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Izvršne datoteke"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "datoteka.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr "program"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr "C:\\putanja\\do\\{}"
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr "\\putanja\\do\\{}"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
"Za pokretanje izvršne datoteke „{}” koristi naredbu:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>„{}”</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Za otvaranje datoteke „{}” sa zadanom aplikacijom, koristi:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} „{}”</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"Ako putanja sadrži razmake, obavezno je stavi u navodnike!"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr "Neuspjelo dodavanje igre"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr "Naslov igre ne može biti prazan."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr "Izvršna datoteka ne može biti prazna."
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr "Neuspjela primjena postavki"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr "Skriveno: {}"
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr "Prikazano: {}"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr "Uklonjeno: {}"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr "Sve igre su uklonjene"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
"Za korištenje SteamGridDB-a je potreban API ključ. Možeš ga generirati {}"
|
||||||
|
"ovdje{}."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Preuzimanje naslovnica …"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Naslovnice su aktualizirane"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr "Instalacija nije pronađena"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr "Odaberi jedan valjani direktorij."
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Upozorenje"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr "Nevaljani direktorij"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Postavi lokaciju"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Odbaci"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Uvoz igri …"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Dogodile su se sljedeće greške tijekom uvoza:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Nije pronađena nijedna nova igra"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "Jedna igra je uvezena"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "Broj uvezenih igri: {}"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "Jedna je uklonjena"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Odaberi direktorij {} predmemorije."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Odaberi direktorij {} konfiguracije."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Odaberi direktorij {} podataka."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "Nije odabrana RetroArch jezgra"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Ovi popisi igri nemaju zadane jezgre:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Igre bez odabrane jezgre nisu uvezene"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "Neuspjela autentifikacija SteamGridDB-a"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr "Potvrdi tvoj API ključ u postavkama"
|
||||||
578
po/hu.po
@@ -3,13 +3,13 @@
|
|||||||
# This file is distributed under the same license as the cartridges package.
|
# This file is distributed under the same license as the cartridges package.
|
||||||
# kramo, 2023.
|
# kramo, 2023.
|
||||||
#
|
#
|
||||||
# kramo <contact@kramo.hu>, 2023.
|
# kramo <contact@kramo.hu>, 2023, 2024.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-07-05 13:13+0000\n"
|
"PO-Revision-Date: 2024-01-28 19:06+0000\n"
|
||||||
"Last-Translator: kramo <contact@kramo.hu>\n"
|
"Last-Translator: kramo <contact@kramo.hu>\n"
|
||||||
"Language-Team: Hungarian <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Hungarian <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/hu/>\n"
|
"cartridges/hu/>\n"
|
||||||
@@ -18,11 +18,12 @@ 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.0-dev\n"
|
"X-Generator: Weblate 5.4-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Kazetták"
|
msgstr "Kazetták"
|
||||||
|
|
||||||
@@ -36,8 +37,10 @@ msgid "Launch all your games"
|
|||||||
msgstr "Indítsa el az összes játékát"
|
msgstr "Indítsa el az összes játékát"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "játék;indító;steam;lutris;heroic;palackok;itch;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"játék;indító;steam;lutris;heroic;palackok;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -50,20 +53,18 @@ msgstr ""
|
|||||||
"ból, Heroic-ból és több más forrásból bejelentkezés nélkül. Rendezheti és "
|
"ból, Heroic-ból és több más forrásból bejelentkezés nélkül. Rendezheti és "
|
||||||
"elrejtheti a játékait, valamint letölthet borítóképeket a SteamGridDB-ről."
|
"elrejtheti a játékait, valamint letölthet borítóképeket a SteamGridDB-ről."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Könyvtár"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Játék Szerkesztése"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Játék Tulajdonságai"
|
msgstr "Játék Tulajdonságai"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Játék Szerkesztése"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Beállítások"
|
msgstr "Beállítások"
|
||||||
|
|
||||||
@@ -71,244 +72,272 @@ msgstr "Beállítások"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Mégse"
|
msgstr "Mégse"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "Új borító"
|
msgstr "Új borító"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "Borító törlése"
|
msgstr "Borító törlése"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Cím"
|
msgstr "Cím"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "A játék címe"
|
msgstr "Fejlesztő (nem kötelező)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Fejlesztő"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "A fejlesztő vagy kiadó (nem kötelező)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Program"
|
msgstr "Program"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "Fájl megnyitása vagy parancs futtatása a játék indításakor"
|
msgstr "Fájl kiválasztása"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Több infó"
|
msgstr "Több infó"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Szerkesztés"
|
msgstr "Szerkesztés"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Elrejtés"
|
msgstr "Elrejtés"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Eltávolítás"
|
msgstr "Eltávolítás"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Elrejtés visszavonása"
|
msgstr "Elrejtés visszavonása"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Általános"
|
msgstr "Általános"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Kilépés"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Keresés"
|
msgstr "Keresés"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Beállítások megjelenítése"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
|
||||||
msgid "Shortcuts"
|
|
||||||
msgstr "Gyorsbillentyűk"
|
msgstr "Gyorsbillentyűk"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Visszavonás"
|
msgstr "Visszavonás"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Menü megnyitása"
|
msgstr "Kilépés"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Oldalsáv megjelenítése"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Főmenü"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Játékok"
|
msgstr "Játékok"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Új játék hozzáadása"
|
msgstr "Játék hozzáadása"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Játékok importálása"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Rejtett játékok megjelenítése"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "Játék eltávolítása"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr "Működés"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
|
||||||
msgid "Exit After Launching Games"
|
|
||||||
msgstr "Kilépés játékok indítása után"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
|
||||||
msgid "Cover Image Launches Game"
|
|
||||||
msgstr "A borítókép indítja el a játékot"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
|
||||||
msgid "Swaps the behavior of the cover image and the play button"
|
|
||||||
msgstr "Felcseréli a \"Játék\" gomb és a borítókép funkcióját"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
|
||||||
msgid "Images"
|
|
||||||
msgstr "Képek"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
|
||||||
msgid "High Quality Images"
|
|
||||||
msgstr "Jó minőségű képek"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
|
||||||
msgstr "Játékborítók veszteségmentes tárolása a tárhely költségére"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
|
||||||
msgid "Danger Zone"
|
|
||||||
msgstr "Veszélyzóna"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
|
||||||
msgid "Remove All Games"
|
|
||||||
msgstr "Az összes játék eltávolítása"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importálás"
|
msgstr "Importálás"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Rejtett játékok megjelenítése"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Játék eltávolítása"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Működés"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr "Kilépés játékok indítása után"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr "A borítókép indítja el a játékot"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr "Felcseréli a \"Játék\" gomb és a borítókép funkcióját"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Képek"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr "Jó minőségű képek"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr "Játékborítók veszteségmentes tárolása a tárhely költségére"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr "Veszélyzóna"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr "Az összes játék eltávolítása"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Nem található játékok eltávolítása"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Források"
|
msgstr "Források"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Telepítés helye"
|
msgstr "Telepítés helye"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Gyorsítótár helye"
|
msgstr "Gyorsítótár helye"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Steam játékok importálása"
|
msgstr "Steam játékok importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Flatpak játékok importálása"
|
msgstr "Flatpak játékok importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Epic Games játékok importálása"
|
msgstr "Epic Games játékok importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "GOG játékok importálása"
|
msgstr "GOG játékok importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Amazon játékok importálása"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Manuálisan hozzáadott játékok importálása"
|
msgstr "Manuálisan hozzáadott játékok importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Palackok"
|
msgstr "Palackok"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr "Legendary"
|
msgstr "Legendary"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr "Flatpak"
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Rendszermappa helye"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Felhasználói mappa helye"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "Játékindítók importálása"
|
msgstr "Játékindítók importálása"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Asztali bejegyzések"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Hitelesítés"
|
msgstr "Hitelesítés"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "API kulcs"
|
msgstr "API kulcs"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "SteamGridDB használata"
|
msgstr "SteamGridDB használata"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Képek letöltése játékok hozzáadásakor és importálásakor"
|
msgstr "Képek letöltése játékok hozzáadásakor és importálásakor"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "SteamGridDB képek előnyben részesítése"
|
msgstr "SteamGridDB képek előnyben részesítése"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Animált képek előnyben részesítése"
|
msgstr "Animált képek előnyben részesítése"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Borítók frissítése"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Borítók letöltése játékokhoz, amik már a könyvtárában vannak"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Frissítés"
|
||||||
|
|
||||||
#: 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"
|
||||||
msgstr "Nem találhatóak játékok"
|
msgstr "Nem találhatóak játékok"
|
||||||
@@ -333,118 +362,135 @@ msgstr "Nincsenek rejtett játékok"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "A rejtett játékaid itt lesznek megtalálhatóak."
|
msgstr "A rejtett játékaid itt lesznek megtalálhatóak."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Vissza"
|
msgstr "Összes játék"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Cím"
|
msgstr "Hozzáadva"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Játék"
|
msgstr "Importálva"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Játék hozzáadása"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Főmenü"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Rejtett játékok"
|
msgstr "Rejtett játékok"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Cím"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Játék"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Rendezés"
|
msgstr "Rendezés"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Legújabb"
|
msgstr "Legújabb"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Legrégebbi"
|
msgstr "Legrégebbi"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Legutóbb játszott"
|
msgstr "Legutóbb játszott"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Rejtett játékok"
|
msgstr "Rejtett játékok"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Gyorsbillentyűk"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "A Kazetták névjegye"
|
msgstr "A Kazetták névjegye"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} elindítva"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "kramo https://kramo.hu"
|
msgstr "kramo https://kramo.page"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Hozzáadva: {}"
|
msgstr "Hozzáadva: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Soha"
|
msgstr "Soha"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Legutóbbi játékmenet: {}"
|
msgstr "Legutóbbi játékmenet: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Alkalmazás"
|
msgstr "Alkalmazás"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Új játék hozzáadása"
|
msgstr "Új játék hozzáadása"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Megerősítés"
|
msgstr "Hozzáad"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Programok"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "fájl.txt"
|
msgstr "fájl.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "program"
|
msgstr "program"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\útvonal\\ide\\{}"
|
msgstr "C:\\útvonal\\ide\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/útvonal/ide/{}"
|
msgstr "/útvonal/ide/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -467,96 +513,182 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Ha az elérési útvonalban szóközök vannak, rakja az útvonalat idézőjelek közé!"
|
"Ha az elérési útvonalban szóközök vannak, rakja az útvonalat idézőjelek közé!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Nem lehet hozzáadni a játékot"
|
msgstr "Nem lehet hozzáadni a játékot"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "A cím nem lehet üres."
|
msgstr "A cím nem lehet üres."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "A program nem lehet üres."
|
msgstr "A program nem lehet üres."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Nem lehet menteni a beállításokat"
|
msgstr "Nem lehet menteni a beállításokat"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} elindítva"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} elrejtve"
|
msgstr "{} elrejtve"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} elrejtése visszavonva"
|
msgstr "{} elrejtése visszavonva"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} eltávolítva"
|
msgstr "{} eltávolítva"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Az összes játék eltávolítva"
|
msgstr "Az összes játék eltávolítva"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Egy API kulcs szükséges a SteamGridDB használatához. {}Itt{} generálhat "
|
"Egy API kulcs szükséges a SteamGridDB használatához. {}Itt{} generálhat "
|
||||||
"egyet."
|
"egyet."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Borítóképek letöltése folyamatban…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Borítóképek frissítve"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "A telepítés nem található"
|
msgstr "A telepítés nem található"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Válasszon ki egy érvényes mappát."
|
msgstr "Válasszon ki egy érvényes mappát."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Figyelem"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr "Érvénytelen mappa"
|
msgstr "Érvénytelen mappa"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Mappa kiválasztása"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Rendben"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Játékok importálása folyamatban…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "A következő hibák történtek importálás közben:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Nem találhatóak új játékok"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 játék importálva"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} játék importálva"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 eltávolítva"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:352
|
#: cartridges/importer/location.py:33
|
||||||
msgid "Select the {} cache directory."
|
msgid "Select the {} cache directory."
|
||||||
msgstr "Válassza ki {} gyorsítótár mappáját."
|
msgstr "Válassza ki {} gyorsítótár mappáját."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
msgid "Select the {} configuration directory."
|
msgid "Select the {} configuration directory."
|
||||||
msgstr "Válassza ki {} konfigurációs mappáját."
|
msgstr "Válassza ki {} konfigurációs mappáját."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr "Válassza ki {} adatok mappáját."
|
msgstr "Válassza ki {} adatok mappáját."
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
msgid "Set Location"
|
msgid "No RetroArch Core Selected"
|
||||||
msgstr "Mappa kiválasztása"
|
msgstr "Nincs kiválasztott RetroArch core"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
msgstr "Rendben"
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "A következő listáknak nincs core-ja:"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "Játékok, aminek nincs kiválasztott core-ja nem lettek importálva"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "Nem lehet hitelesíteni SteamGridDB-t"
|
msgstr "Nem lehet hitelesíteni SteamGridDB-t"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Könyvtár"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Beállítások megjelenítése"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Gyorsbillentyűk"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Menü megnyitása"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Új játék hozzáadása"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Játékok importálása"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Vissza"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Játékok keresése"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Rejtett játékok keresése"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "A játék címe"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Fejlesztő"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Fájl megnyitása vagy parancs futtatása a játék indításakor"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Megerősítés"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
#~ msgstr "A Steam mappa nem található."
|
#~ msgstr "A Steam mappa nem található."
|
||||||
|
|
||||||
@@ -599,21 +731,6 @@ msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Válassza ki Lutris gyorsítótár mappáját."
|
#~ msgstr "Válassza ki Lutris gyorsítótár mappáját."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Játékok importálása folyamatban…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Borítóképek importálása folyamatban…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Nem találhatóak új játékok"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "1 játék importálva"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "{} játék importálva"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Az importáláshoz használt mappa"
|
#~ msgstr "Az importáláshoz használt mappa"
|
||||||
|
|
||||||
@@ -757,3 +874,6 @@ msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
|||||||
|
|
||||||
#~ msgid "Games Imported"
|
#~ msgid "Games Imported"
|
||||||
#~ msgstr "Játékok importálva"
|
#~ msgstr "Játékok importálva"
|
||||||
|
|
||||||
|
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||||
|
#~ msgstr "játék;indító;steam;lutris;heroic;palackok;itch;"
|
||||||
|
|||||||
555
po/it.po
@@ -4,13 +4,15 @@
|
|||||||
# Alessandro Iepure <alessandro.iepure@gmail.com>, 2023.
|
# Alessandro Iepure <alessandro.iepure@gmail.com>, 2023.
|
||||||
# albanobattistella <albano_battistella@hotmail.com>, 2023.
|
# albanobattistella <albano_battistella@hotmail.com>, 2023.
|
||||||
# kramo <contact@kramo.hu>, 2023.
|
# kramo <contact@kramo.hu>, 2023.
|
||||||
|
# Giasko <dibiame@hotmail.it>, 2023.
|
||||||
|
# Andrea Costola <lamaildiandreac@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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-07-01 15:10+0000\n"
|
"PO-Revision-Date: 2024-02-24 08:02+0000\n"
|
||||||
"Last-Translator: albanobattistella <albano_battistella@hotmail.com>\n"
|
"Last-Translator: Andrea Costola <lamaildiandreac@gmail.com>\n"
|
||||||
"Language-Team: Italian <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Italian <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/it/>\n"
|
"cartridges/it/>\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
@@ -18,11 +20,12 @@ 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.0-dev\n"
|
"X-Generator: Weblate 5.5-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartucce"
|
msgstr "Cartucce"
|
||||||
|
|
||||||
@@ -36,8 +39,10 @@ msgid "Launch all your games"
|
|||||||
msgstr "Avvia tutti i tuoi giochi"
|
msgstr "Avvia tutti i tuoi giochi"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
msgstr "gioco;launcher;steam;lutris;heroic;bottles;itch;"
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
"gioco;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -51,20 +56,18 @@ msgstr ""
|
|||||||
"organizzare e nascondere i giochi oppure scaricare le copertine da "
|
"organizzare e nascondere i giochi oppure scaricare le copertine da "
|
||||||
"StreamGridDB."
|
"StreamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Libreria"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Modifica dettagli del gioco"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Dettagli del gioco"
|
msgstr "Dettagli del gioco"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Modifica dettagli del gioco"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Preferenze"
|
msgstr "Preferenze"
|
||||||
|
|
||||||
@@ -72,245 +75,273 @@ msgstr "Preferenze"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr "Nuova copertina"
|
msgstr "Nuova copertina"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr "Elimina copertina"
|
msgstr "Elimina copertina"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titolo"
|
msgstr "Titolo"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr "Titolo del gioco"
|
msgstr "Sviluppatore (opzionale)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Sviluppatore"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Lo sviluppatore o l'editore (opzionale)"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Eseguibile"
|
msgstr "Eseguibile"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "File da aprire o comando da lanciare per avviare il gioco"
|
msgstr "Seleziona file"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Altre informazioni"
|
msgstr "Altre informazioni"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Modifica"
|
msgstr "Modifica"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Nascondi"
|
msgstr "Nascondi"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Rimuovi"
|
msgstr "Rimuovi"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Mostra"
|
msgstr "Mostra"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Generale"
|
msgstr "Generale"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Chiudi"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Cerca"
|
msgstr "Cerca"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Mostra preferenze"
|
msgstr "Scorciatoie da Tastiera"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Scorciatoie da tastiera"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Apri il menù"
|
msgstr "Esci"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Attiva/disattiva la barra laterale"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Menù Principale"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Giochi"
|
msgstr "Giochi"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Aggiungi un nuovo gioco"
|
msgstr "Aggiungi Gioco"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Importa giochi"
|
msgid "Import"
|
||||||
|
msgstr "Importa"
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Mostra giochi nascosti"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
msgid "Remove game"
|
msgid "Show Hidden Games"
|
||||||
msgstr "Rimuovi gioco"
|
msgstr "Mostra Giochi nascosti"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "Rimuovi Gioco"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Comportamento"
|
msgstr "Comportamento"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr "Esci dopo l'avvio dei giochi"
|
msgstr "Esci dopo l'avvio dei giochi"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr "La copertina avvia il gioco"
|
msgstr "La copertina avvia il gioco"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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 "Inverti il comportamento della copertina con il pulsante di avvio"
|
msgstr "Inverti il comportamento della copertina con il pulsante di avvio"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr "Immagini"
|
msgstr "Immagini"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr "Immagini di alta qualità"
|
msgstr "Immagini di alta qualità"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Salva copertine dei giochi in formato lossless, consuma più spazio su disco"
|
"Salva copertine dei giochi in formato lossless, consuma più spazio su disco"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zona di pericolo"
|
msgstr "Zona di pericolo"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr "Rimuovi tutti i giochi"
|
msgstr "Rimuovi tutti i giochi"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
#: data/gtk/preferences.blp:119
|
||||||
msgid "Import"
|
msgid "Remove Uninstalled Games"
|
||||||
msgstr "Importa"
|
msgstr "Rimuovi giochi disinstallati"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Fonti"
|
msgstr "Fonti"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Posizione di installazione"
|
msgstr "Posizione di installazione"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Posizione della cache"
|
msgstr "Posizione della cache"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Importa giochi da Steam"
|
msgstr "Importa giochi da Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Importa giochi da Flatpak"
|
msgstr "Importa giochi da Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Importa giochi da Epic Games"
|
msgstr "Importa giochi da Epic Games"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Importa giochi da GOG"
|
msgstr "Importa giochi da GOG"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importa giochi Amazon"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Importa giochi da aggiunti manualmente"
|
msgstr "Importa giochi da aggiunti manualmente"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bottles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr "Leggendari"
|
msgstr "Legendary"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "RetroArch"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr "Flatpak"
|
msgstr "Flatpak"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
msgid "Import Game Launchers"
|
#: data/gtk/preferences.blp:327
|
||||||
msgstr "Importa lanciatori di giochi"
|
msgid "System Location"
|
||||||
|
msgstr "Percorso di sistema"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Percorso utente"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr "Importa launcher di giochi"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "Elementi Desktop"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Autenticazione"
|
msgstr "Autenticazione"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "Chiave API"
|
msgstr "Chiave API"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Usa SteamGridDB"
|
msgstr "Usa SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Scarica immagini durante l'aggiunta o l'import di giochi"
|
msgstr "Scarica immagini durante l'aggiunta o l'import di giochi"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Preferisci alle immagini ufficiali"
|
msgstr "Preferisci alle immagini ufficiali"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Preferisci immagini animate"
|
msgstr "Preferisci immagini animate"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "Aggiorna copertina"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "Recupera le copertine dei giochi già presenti nella tua libreria"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Aggiorna"
|
||||||
|
|
||||||
#: 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"
|
||||||
msgstr "Nessun Gioco Trovato"
|
msgstr "Nessun Gioco Trovato"
|
||||||
@@ -335,118 +366,135 @@ msgstr "Nessun Gioco Nascosto"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "I giochi nascosti appariranno qui."
|
msgstr "I giochi nascosti appariranno qui."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "Indietro"
|
msgstr "Tutti i giochi"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr "Titolo del gioco"
|
msgstr "Aggiunto"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr "Gioca"
|
msgstr "Importato"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Aggiungi Gioco"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Menù Principale"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Giochi Nascosti"
|
msgstr "Giochi Nascosti"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Titolo del gioco"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Gioca"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Ordina per"
|
msgstr "Ordina per"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Z"
|
msgstr "A-Z"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Z-A"
|
msgstr "Z-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Più recente"
|
msgstr "Più recente"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Più vecchio"
|
msgstr "Più vecchio"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Ultimo Avvio"
|
msgstr "Ultimo Avvio"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Mostra Nascosti"
|
msgstr "Mostra Nascosti"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Scorciatoie da Tastiera"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Informazioni su Cartucce"
|
msgstr "Informazioni su Cartucce"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} avviato"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Alessandro Iepure https://ale.iepure.me"
|
msgstr "Alessandro Iepure https://ale.iepure.me"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Aggiunto il: {}"
|
msgstr "Aggiunto il: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Mai"
|
msgstr "Mai"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Ultima riproduzione: {}"
|
msgstr "Ultima riproduzione: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Applica"
|
msgstr "Applica"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Aggiungi un Nuovo Gioco"
|
msgstr "Aggiungi un Nuovo Gioco"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Conferma"
|
msgstr "Aggiungi"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Eseguibili"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "file.txt"
|
msgstr "file.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "programma"
|
msgstr "programma"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\path\\to{}"
|
msgstr "C:\\path\\to{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/percorso/to/{}"
|
msgstr "/percorso/to/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -468,105 +516,186 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Se il percorso contiene spazi, assicurarsi di avvolgerlo in doppi apici!"
|
"Se il percorso contiene spazi, assicurarsi di avvolgerlo in doppi apici!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Impossibile aggiungere il gioco"
|
msgstr "Impossibile aggiungere il gioco"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Il titolo del gioco non può essere vuoto."
|
msgstr "Il titolo del gioco non può essere vuoto."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "L'eseguibile non può essere vuoto."
|
msgstr "L'eseguibile non può essere vuoto."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Impossibile applicare le preferenze"
|
msgstr "Impossibile applicare le preferenze"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} avviato"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} nascosto"
|
msgstr "{} nascosto"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} visibile"
|
msgstr "{} visibile"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} rimosso"
|
msgstr "{} rimosso"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Tutti i giochi sono stati rimossi"
|
msgstr "Tutti i giochi sono stati rimossi"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Per utilizzare SteamGridDB è necessaria una chiave API. Puoi generarne una {}"
|
"Per utilizzare SteamGridDB è necessaria una chiave API. Puoi generarne una {}"
|
||||||
"qui{}."
|
"qui{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Download delle copertine…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "Copertine aggiornate"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Installazione non trovata"
|
msgstr "Installazione non trovata"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Seleziona una directory valida."
|
msgstr "Seleziona una directory valida."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Attenzione"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr "Directory non valida"
|
msgstr "Directory non valida"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr "Seleziona la directory della cache {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} installation directory."
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr "Selezionare la directory di installazione {}."
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Select the {} cache directory."
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr "Seleziona la directory della cache {}."
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr "Imposta percorso"
|
msgstr "Imposta percorso"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr "Chiudi"
|
msgstr "Chiudi"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Importing Games…"
|
||||||
msgstr "Impossibile eseguire l'autenticazione su SteamGridDB"
|
msgstr "Import dei giochi in corso…"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "Durante l'importazione si sono verificati i seguenti errori:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Nessun nuovo gioco trovato"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "1 gioco importato"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "{} giochi importati"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1 rimosso"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "Seleziona la directory della cache per {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "Selezionare la directory di configurazione per {}."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "Seleziona la directory dati per {}."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "Nessun core RetroArch selezionato"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "Le seguenti playlist non hanno un core di default:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "I giochi senza core selezionato non sono stati importati"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr "Impossibile autenticare SteamGridDB"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr "Verifica la tua chiave API nelle preferenze"
|
msgstr "Verifica la tua chiave API nelle preferenze"
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Libreria"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Mostra preferenze"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Scorciatoie da tastiera"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Apri il menù"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Aggiungi un nuovo gioco"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Importa giochi"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Indietro"
|
||||||
|
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Cerca giochi"
|
||||||
|
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Cerca giochi nascosti"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Il titolo del gioco"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Sviluppatore"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "File da aprire o comando da lanciare per avviare il gioco"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Conferma"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
#~ msgstr "Non è possibile trovare il percorso per Steam."
|
#~ msgstr "Non è possibile trovare il percorso per Steam."
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Confirm"
|
|
||||||
#~ msgid "Configuration"
|
#~ msgid "Configuration"
|
||||||
#~ msgstr "Conferma"
|
#~ msgstr "Conferma"
|
||||||
|
|
||||||
@@ -594,21 +723,6 @@ msgstr "Verifica la tua chiave API nelle preferenze"
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Selezionare la directory della cache di Lutris."
|
#~ msgstr "Selezionare la directory della cache di Lutris."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Import dei giochi in corso…"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Import delle copertine…"
|
|
||||||
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Nessun nuovo gioco trovato"
|
|
||||||
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "1 gioco importato"
|
|
||||||
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "{} giochi importati"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Cartella da usare per importare i giochi"
|
#~ msgstr "Cartella da usare per importare i giochi"
|
||||||
|
|
||||||
@@ -726,3 +840,6 @@ msgstr "Verifica la tua chiave API nelle preferenze"
|
|||||||
|
|
||||||
#~ msgid "Games Imported"
|
#~ msgid "Games Imported"
|
||||||
#~ msgstr "Giochi importati"
|
#~ msgstr "Giochi importati"
|
||||||
|
|
||||||
|
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||||
|
#~ msgstr "gioco;launcher;steam;lutris;heroic;bottles;itch;"
|
||||||
|
|||||||
632
po/ja.po
Normal file
@@ -0,0 +1,632 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR kramo
|
||||||
|
# This file is distributed under the same license as the Cartridges package.
|
||||||
|
# Scott Anecito <scott.anecito@linux.com>, 2024.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Cartridges\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
|
"PO-Revision-Date: 2024-01-16 06:06+0000\n"
|
||||||
|
"Last-Translator: Scott Anecito <scott.anecito@linux.com>\n"
|
||||||
|
"Language-Team: Japanese <https://hosted.weblate.org/projects/cartridges/"
|
||||||
|
"cartridges/ja/>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
"X-Generator: Weblate 5.4-dev\n"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
|
msgid "Cartridges"
|
||||||
|
msgstr "カートリッジズ"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||||
|
msgid "Game Launcher"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:5
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:7
|
||||||
|
msgid "Launch all your games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
|
msgid ""
|
||||||
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
|
"SteamGridDB."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
|
#: cartridges/details_window.py:71
|
||||||
|
msgid "Game Details"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
|
msgid "Edit Game Details"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:25
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "キャンセル"
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:55
|
||||||
|
msgid "New Cover"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:73
|
||||||
|
msgid "Delete Cover"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
|
msgid "Title"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:103
|
||||||
|
msgid "Developer (optional)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:108
|
||||||
|
msgid "Executable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:114
|
||||||
|
msgid "Select File"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/details-window.blp:125
|
||||||
|
msgid "More Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
|
msgid "Hide"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
|
msgid "Unhide"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
|
msgid "General"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
|
msgid "Search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
|
msgid "Undo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:34
|
||||||
|
msgid "Quit"
|
||||||
|
msgstr "終了"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
|
msgid "Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
|
msgid "Add Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
|
msgid "Import"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:63
|
||||||
|
msgid "Show Hidden Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:15
|
||||||
|
msgid "Exit After Launching Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:19
|
||||||
|
msgid "Cover Image Launches Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:20
|
||||||
|
msgid "Swaps the behavior of the cover image and the play button"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
|
msgid "Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:28
|
||||||
|
msgid "High Quality Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:29
|
||||||
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:34
|
||||||
|
msgid "Danger Zone"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:47
|
||||||
|
msgid "Remove All Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
|
msgid "Cache Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:182
|
||||||
|
msgid "Import Steam Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:186
|
||||||
|
msgid "Import Flatpak Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
|
msgid "Heroic"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:212
|
||||||
|
msgid "Import Epic Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
|
msgid "Legendary"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
|
msgid "Flatpak"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
|
msgid "Import Game Launchers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
|
msgid "SteamGridDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:373
|
||||||
|
msgid "Authentication"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:376
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:384
|
||||||
|
msgid "Use SteamGridDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:385
|
||||||
|
msgid "Download images when adding or importing games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:389
|
||||||
|
msgid "Prefer Over Official Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:393
|
||||||
|
msgid "Prefer Animated Images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||||
|
msgid "No Games Found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||||
|
msgid "Try a different search."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:21
|
||||||
|
msgid "No Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:22
|
||||||
|
msgid "Use the + button to add games."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:40
|
||||||
|
msgid "No Hidden Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:41
|
||||||
|
msgid "Games you hide will appear here."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
|
msgid "Added"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:141
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:230
|
||||||
|
msgid "Hidden Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
|
msgid "Sort"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:478
|
||||||
|
msgid "A-Z"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:484
|
||||||
|
msgid "Z-A"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:490
|
||||||
|
msgid "Newest"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:496
|
||||||
|
msgid "Oldest"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:502
|
||||||
|
msgid "Last Played"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:509
|
||||||
|
msgid "Show Hidden"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:518
|
||||||
|
msgid "About Cartridges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
|
#: cartridges/main.py:269
|
||||||
|
msgid "translator_credits"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the date when the game was added
|
||||||
|
#: cartridges/window.py:373
|
||||||
|
msgid "Added: {}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/window.py:376
|
||||||
|
msgid "Never"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the date when the game was last played
|
||||||
|
#: cartridges/window.py:380
|
||||||
|
msgid "Last played: {}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:76
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "適用"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:82
|
||||||
|
msgid "Add New Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:83
|
||||||
|
msgid "Add"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "file"
|
||||||
|
#: cartridges/details_window.py:108
|
||||||
|
msgid "file.txt"
|
||||||
|
msgstr "ファイル.txt"
|
||||||
|
|
||||||
|
#. As in software
|
||||||
|
#: cartridges/details_window.py:110
|
||||||
|
msgid "program"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
|
msgid "C:\\path\\to\\{}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Translate this string as you would translate "path to {}"
|
||||||
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
|
msgid "/path/to/{}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:128
|
||||||
|
msgid ""
|
||||||
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"To open the file \"{}\" with the default application, use:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
|
msgid "Couldn't Add Game"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
|
msgid "Game title cannot be empty."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
|
msgid "Executable cannot be empty."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
|
msgid "Couldn't Apply Preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} hidden"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/game.py:139
|
||||||
|
msgid "{} unhidden"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
|
msgid "{} removed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:128
|
||||||
|
msgid "All games removed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:176
|
||||||
|
msgid ""
|
||||||
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
|
msgid "Installation Not Found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:346
|
||||||
|
msgid "Select a valid directory."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "警告"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
|
msgid "Invalid Directory"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:422
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
|
msgid "Verify your API key in preferences"
|
||||||
|
msgstr ""
|
||||||
733
po/ko.po
@@ -2,13 +2,14 @@
|
|||||||
# 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.
|
||||||
# MJKim <kmj10727@gmail.com>, 2023.
|
# MJKim <kmj10727@gmail.com>, 2023.
|
||||||
|
# Seong-ho Cho <darkcircle.0426@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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-03-28 22:23+0000\n"
|
"PO-Revision-Date: 2024-03-02 19:01+0000\n"
|
||||||
"Last-Translator: MJKim <kmj10727@gmail.com>\n"
|
"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
|
||||||
"Language-Team: Korean <https://hosted.weblate.org/projects/cartridges/"
|
"Language-Team: Korean <https://hosted.weblate.org/projects/cartridges/"
|
||||||
"cartridges/ko/>\n"
|
"cartridges/ko/>\n"
|
||||||
"Language: ko\n"
|
"Language: ko\n"
|
||||||
@@ -16,11 +17,12 @@ 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=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Weblate 4.17-dev\n"
|
"X-Generator: Weblate 5.5-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "카트리지"
|
msgstr "카트리지"
|
||||||
|
|
||||||
@@ -34,432 +36,462 @@ msgid "Launch all your games"
|
|||||||
msgstr "모든 게임을 실행합니다"
|
msgstr "모든 게임을 실행합니다"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"gaming;게임;게이밍;launcher;실행기;실행프로그램;steam;스팀;lutris;루트리스;he"
|
||||||
|
"roic;히어로익;bottles;보틀즈;itch;잇치;flatpak;플랫팩;legendary;레젠더리;retr"
|
||||||
|
"oarch;레트로아키;"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
#, fuzzy
|
|
||||||
#| msgid ""
|
|
||||||
#| "Cartridges is a simple game launcher. It has support for importing your "
|
|
||||||
#| "games from Steam, Heroic and Bottles with organizational features such as "
|
|
||||||
#| "hiding and sorting by date added or last played."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cartridges is a simple game launcher for all of your games. It has support "
|
"Cartridges is a simple game launcher for all of your games. It has support "
|
||||||
"for importing games from Steam, Lutris, Heroic and more with no login "
|
"for importing games from Steam, Lutris, Heroic and more with no login "
|
||||||
"necessary. You can sort and hide games or download cover art from "
|
"necessary. You can sort and hide games or download cover art from "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"카트리지는 간단한 게임 런처입니다. 추가한 날짜 또는 마지막으로 플레이한 날짜"
|
"카트리지는 간단한 게임 실행 프로그램입니다. 스팀, 루트리스, 히어로익 등의 "
|
||||||
"별로 게임을 숨기거나 정렬하는 등의 정리 기능을 통해 Steam, Heroic 및 Bottles"
|
"사이트에서 로그인을 하지 않고 게임을 가져올 수 있습니다. 게임을 정리하고 "
|
||||||
"에서 게임을 가져올 수 있습니다."
|
"숨기거나, SteamGridDB에서 표지를 다운로드할 수 있습니다."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "라이브러리"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr ""
|
msgstr "게임 세부 정보"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "게임 세부 정보 편집"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr ""
|
msgstr "기본 설정"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:25
|
#: data/gtk/details-window.blp:25
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr "취소"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr "새 표지"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr "표지 삭제"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr ""
|
msgstr "제목"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
msgid "Developer (optional)"
|
||||||
msgstr ""
|
msgstr "개발자 (옵션)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Developer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr ""
|
msgstr "실행 가능"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr ""
|
msgstr "파일 선택"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr "추가 정보"
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr "편집"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr ""
|
msgstr "숨기기"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr ""
|
msgstr "제거"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: 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:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr "일반"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr "검색"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr ""
|
msgstr "키보드 바로 가기 키"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr ""
|
msgstr "실행 취소"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr ""
|
msgstr "끝내기"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
#, fuzzy
|
msgid "Toggle Sidebar"
|
||||||
#| msgid "No Games"
|
msgstr "가장 자리 창 표시 전환"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "메인 메뉴"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "게임이 없습니다"
|
msgstr "게임"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr ""
|
msgstr "게임 추가"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
#, fuzzy
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
#| msgid "No Games"
|
msgid "Import"
|
||||||
msgid "Import games"
|
msgstr "가져오기"
|
||||||
msgstr "게임이 없습니다"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
#, fuzzy
|
msgid "Show Hidden Games"
|
||||||
#| msgid "No Games"
|
msgstr "숨긴 게임 표시"
|
||||||
msgid "Remove game"
|
|
||||||
msgstr "게임이 없습니다"
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
msgid "Remove Game"
|
||||||
|
msgstr "게임 제거"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr ""
|
msgstr "동작"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr ""
|
msgstr "게임 실행 후 나가기"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr ""
|
msgstr "표지 그림 선택시 게임 실행"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr ""
|
msgstr "그림"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr ""
|
msgstr "고화질 그림"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
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:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr ""
|
msgstr "위험 영역"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr ""
|
msgstr "모든 게임 제거"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
|
||||||
msgid "Import"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
|
||||||
msgid "Sources"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
|
||||||
msgid "Steam"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
|
||||||
#: data/gtk/preferences.blp:234
|
|
||||||
msgid "Install Location"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
|
||||||
msgid "Lutris"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:119
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "설치 취소한 게임 제거"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:124
|
||||||
|
msgid "Sources"
|
||||||
|
msgstr "공급원"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
|
msgid "Steam"
|
||||||
|
msgstr "스팀"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
|
#: data/gtk/preferences.blp:304
|
||||||
|
msgid "Install Location"
|
||||||
|
msgstr "설치 위치"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
|
msgid "Lutris"
|
||||||
|
msgstr "루트리스"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:170
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr ""
|
msgstr "캐시 위치"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
#, fuzzy
|
|
||||||
#| msgid "No Games"
|
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "게임이 없습니다"
|
msgstr "스팀 게임 가져오기"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
|
||||||
#| msgid "No Games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "게임이 없습니다"
|
msgstr "플랫팩 게임 가져오기"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr ""
|
msgstr "히어로익"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr ""
|
msgstr "에픽 게임 가져오기"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
|
||||||
msgid "Import GOG Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
|
||||||
msgid "Import Sideloaded Games"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
|
||||||
msgid "Bottles"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
|
||||||
msgid "itch"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:216
|
||||||
|
msgid "Import GOG Games"
|
||||||
|
msgstr "GOG 게임 가져오기"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "아마존 게임 가져오기"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
|
msgid "Import Sideloaded Games"
|
||||||
|
msgstr "사이드로디드 게임 가져오기"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
|
msgid "Bottles"
|
||||||
|
msgstr "보틀즈"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
|
msgid "itch"
|
||||||
|
msgstr "잇치"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr "레젠더리"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr "레트로아키"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr "플랫팩"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
#, fuzzy
|
#: data/gtk/preferences.blp:327
|
||||||
#| msgid "Game Launcher"
|
msgid "System Location"
|
||||||
|
msgstr "시스템 위치"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "사용자 위치"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "게임 런처"
|
msgstr "게임 실행 프로그램 가져오기"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr "데스크톱 항목"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr ""
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr ""
|
msgstr "인증"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr ""
|
msgstr "API 키"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr ""
|
msgstr "SteamGridDB 활용"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr ""
|
msgstr "게임을 추가하거나 가져올 때 표지 그림 다운로드"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr ""
|
msgstr "공식 그림 우선"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr ""
|
msgstr "움직이는 그림 우선"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr "표지 그림 업데이트"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr "라이브러리에 이미 있는 게임 표지 그림 가져오기"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
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"
|
||||||
msgstr ""
|
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"
|
||||||
msgstr "게임이 없습니다"
|
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"
|
||||||
msgstr ""
|
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:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
msgid "All Games"
|
||||||
msgstr "뒤로"
|
msgstr "모든 게임"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
msgid "Added"
|
||||||
msgstr ""
|
msgstr "추가함"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
msgid "Imported"
|
||||||
msgstr ""
|
msgstr "가져옴"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr ""
|
msgstr "숨긴 게임"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "게임 제목"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "게임하기"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "정렬"
|
msgstr "정렬"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr ""
|
msgstr "오름차순"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr ""
|
msgstr "내림차순"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr ""
|
msgstr "최신순"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr ""
|
msgstr "과거순"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr ""
|
msgstr "최근 플레이"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr ""
|
msgstr "숨긴 게임 표시"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "카트리지 정보"
|
msgstr "카트리지 정보"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr "IGDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr "ProtonDB"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr "HowLongToBeat"
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} 실행함"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr ""
|
msgstr "조성호 <shcho@gnome.org>"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr ""
|
msgstr "추가: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr ""
|
msgstr "안함"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr ""
|
msgstr "최근 플레이: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr "적용"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr ""
|
msgstr "새 게임 추가"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr ""
|
msgstr "추가"
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "실행 파일"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr ""
|
msgstr "file.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr ""
|
msgstr "프로그램"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr ""
|
msgstr "C:\\디렉터리\\경로\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr ""
|
msgstr "/디렉터리/경로/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -471,92 +503,163 @@ 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"
|
||||||
|
"<tt>\"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"기본 프로그램으로 \"{}\" 파일을 열려면:\n"
|
||||||
|
"\n"
|
||||||
|
"<tt>{} \"{}\"</tt>\n"
|
||||||
|
"\n"
|
||||||
|
"경로 이름에 공백 문자가 들어가 있을 경우, 경로 이름을 큰 따옴표로 감쌌는지 "
|
||||||
|
"확인하십시오!"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr ""
|
msgstr "게임을 추가할 수 없습니다"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr ""
|
msgstr "게임 제목은 비워둘 수 없습니다."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr ""
|
msgstr "실행 파일을 비워둘 수 없습니다."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
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
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr ""
|
msgstr "{} 숨김"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr ""
|
msgstr "{} 숨김 해제함"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr ""
|
msgstr "{} 제거함"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr ""
|
msgstr "모든 게임을 제거했습니다"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr "SteamGridDB를 활용하려면 API 키가 필요합니다. {}여기{}에서 만들 수 있습니다."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "표지 그림 다운로드 중…"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr "표지 그림을 업데이트했습니다"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr ""
|
msgstr "설치한 항목이 없습니다"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr ""
|
msgstr "올바른 디렉터리를 선택하십시오."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "경고"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr "부적절한 디렉터리"
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
|
||||||
msgid "Select the {} cache directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:355
|
|
||||||
msgid "Select the {} configuration directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. The variable is the name of the source
|
|
||||||
#: src/preferences.py:358
|
|
||||||
msgid "Select the {} data directory."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/preferences.py:364
|
|
||||||
msgid "Set Location"
|
msgid "Set Location"
|
||||||
msgstr ""
|
msgstr "위치 설정"
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr ""
|
msgstr "버리기"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "게임 가져오는 중…"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr "가져오는 동안 다음 오류가 나타났습니다:"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "새 게임이 없습니다"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "게임 1건을 가져왔습니다"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "게임 {}건을 가져왔습니다"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "1건을 제거했습니다"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
|
msgid "Select the {} cache directory."
|
||||||
|
msgstr "{} 캐시 디렉터리를 선택하십시오."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:35
|
||||||
|
msgid "Select the {} configuration directory."
|
||||||
|
msgstr "{} 설정 디렉터리를 선택하십시오."
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:37
|
||||||
|
msgid "Select the {} data directory."
|
||||||
|
msgstr "{} 데이터 디렉터리를 선택하십시오."
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
|
msgid "No RetroArch Core Selected"
|
||||||
|
msgstr "선택한 레트로아키 코어가 없습니다"
|
||||||
|
|
||||||
|
#. The variable is a newline separated list of playlists
|
||||||
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr "다음 플레이 목록에 기본 코어가 없습니다:"
|
||||||
|
|
||||||
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr "코어를 선택하지 않은 게임을 가져오지 않았습니다"
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr ""
|
msgstr "SteamGridDB를 인증할 수 없습니다"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr "기본 설정에서 API 키를 검증하십시오"
|
||||||
|
|
||||||
#~ msgid "Launch your games"
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "라이브러리"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "No Games"
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "게임이 없습니다"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "뒤로"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Launch your games"
|
||||||
|
#~ msgid "Search games"
|
||||||
#~ msgstr "게임을 실행합니다"
|
#~ msgstr "게임을 실행합니다"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
i18n.gettext('cartridges', preset: 'glib')
|
i18n.gettext('cartridges', preset: 'glib', args: ['--copyright-holder=kramo', '--package-name=Cartridges'])
|
||||||
|
|||||||
561
po/nb_NO.po
@@ -7,7 +7,7 @@ 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: 2023-07-05 14:36+0200\n"
|
"POT-Creation-Date: 2023-12-12 10:32+0100\n"
|
||||||
"PO-Revision-Date: 2023-04-06 08:09+0000\n"
|
"PO-Revision-Date: 2023-04-06 08:09+0000\n"
|
||||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
|
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
|
||||||
@@ -20,8 +20,9 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 4.17-dev\n"
|
"X-Generator: Weblate 4.17-dev\n"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:6
|
||||||
#: src/main.py:162
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:32 data/gtk/window.blp:47
|
||||||
|
#: data/gtk/window.blp:80 cartridges/main.py:205
|
||||||
msgid "Cartridges"
|
msgid "Cartridges"
|
||||||
msgstr "Cartridges"
|
msgstr "Cartridges"
|
||||||
|
|
||||||
@@ -35,7 +36,8 @@ msgid "Launch all your games"
|
|||||||
msgstr "Start alle spillene dine"
|
msgstr "Start alle spillene dine"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
msgid ""
|
||||||
|
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||||
@@ -50,20 +52,18 @@ msgstr ""
|
|||||||
"innlogging. Du kan sortere og skjule spil eller laste ned omslagsbilder fra "
|
"innlogging. Du kan sortere og skjule spil eller laste ned omslagsbilder fra "
|
||||||
"SteamGridDB."
|
"SteamGridDB."
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:36 data/gtk/window.blp:290
|
||||||
msgid "Library"
|
#: cartridges/details_window.py:71
|
||||||
msgstr "Bibliotek"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
|
||||||
msgid "Edit Game Details"
|
|
||||||
msgstr "Rediger spilldetaljer"
|
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
|
||||||
msgid "Game Details"
|
msgid "Game Details"
|
||||||
msgstr "Spilldetaljer"
|
msgstr "Spilldetaljer"
|
||||||
|
|
||||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:40
|
||||||
#: src/details_window.py:239
|
msgid "Edit Game Details"
|
||||||
|
msgstr "Rediger spilldetaljer"
|
||||||
|
|
||||||
|
#: data/hu.kramo.Cartridges.metainfo.xml.in:44 data/gtk/help-overlay.blp:19
|
||||||
|
#: data/gtk/window.blp:516 cartridges/details_window.py:271
|
||||||
|
#: cartridges/importer/importer.py:319 cartridges/importer/importer.py:370
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Innstillinger"
|
msgstr "Innstillinger"
|
||||||
|
|
||||||
@@ -71,264 +71,293 @@ msgstr "Innstillinger"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Avbryt"
|
msgstr "Avbryt"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:57
|
#: data/gtk/details-window.blp:55
|
||||||
msgid "New Cover"
|
msgid "New Cover"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:75
|
#: data/gtk/details-window.blp:73
|
||||||
msgid "Delete Cover"
|
msgid "Delete Cover"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
#: data/gtk/details-window.blp:100 data/gtk/game.blp:81
|
||||||
#: data/gtk/game.blp:80
|
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Navn"
|
msgstr "Navn"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:102
|
#: data/gtk/details-window.blp:103
|
||||||
msgid "The title of the game"
|
#, fuzzy
|
||||||
msgstr "Navnet på spillet"
|
#| msgid "The developer or publisher (optional)"
|
||||||
|
msgid "Developer (optional)"
|
||||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
|
||||||
msgid "Developer"
|
|
||||||
msgstr "Utvikler"
|
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:113
|
|
||||||
msgid "The developer or publisher (optional)"
|
|
||||||
msgstr "Utvikler eller utgiver (valgfritt)"
|
msgstr "Utvikler eller utgiver (valgfritt)"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
#: data/gtk/details-window.blp:108
|
||||||
msgid "Executable"
|
msgid "Executable"
|
||||||
msgstr "Kjørbar"
|
msgstr "Kjørbar"
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:124
|
#: data/gtk/details-window.blp:114
|
||||||
msgid "File to open or command to run when launching the game"
|
msgid "Select File"
|
||||||
msgstr "Fil å åpne eller kommando å kjøre ved oppstart av spillet"
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/details-window.blp:130
|
#: data/gtk/details-window.blp:125
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:417
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Rediger"
|
msgstr "Rediger"
|
||||||
|
|
||||||
#: data/gtk/game.blp:107 src/window.py:171
|
#: data/gtk/game.blp:103 cartridges/window.py:350
|
||||||
msgid "Hide"
|
msgid "Hide"
|
||||||
msgstr "Skjul"
|
msgstr "Skjul"
|
||||||
|
|
||||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
#: data/gtk/game.blp:104 data/gtk/game.blp:112 data/gtk/window.blp:437
|
||||||
#: data/gtk/window.blp:209
|
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Fjern"
|
msgstr "Fjern"
|
||||||
|
|
||||||
#: data/gtk/game.blp:126 src/window.py:173
|
#: data/gtk/game.blp:111 cartridges/window.py:352
|
||||||
msgid "Unhide"
|
msgid "Unhide"
|
||||||
msgstr "Opphev fjerning"
|
msgstr "Opphev fjerning"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:8
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Generelt"
|
msgstr "Generelt"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:14
|
#: data/gtk/help-overlay.blp:14 data/gtk/window.blp:184 data/gtk/window.blp:200
|
||||||
msgid "Quit"
|
#: data/gtk/window.blp:244 data/gtk/window.blp:260 data/gtk/window.blp:448
|
||||||
msgstr "Avslutt"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
|
||||||
#: data/gtk/window.blp:323
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Søk"
|
msgstr "Søk"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:24
|
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:517
|
||||||
msgid "Show preferences"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Vis innstillinger"
|
msgstr "Tastatursnarveier"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:29
|
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||||
msgid "Shortcuts"
|
#: cartridges/preferences.py:129 cartridges/importer/importer.py:394
|
||||||
msgstr "Snarveier"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:34 src/game.py:102 src/preferences.py:112
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Angre"
|
msgstr "Angre"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:39
|
#: data/gtk/help-overlay.blp:34
|
||||||
msgid "Open menu"
|
msgid "Quit"
|
||||||
msgstr "Åpne meny"
|
msgstr "Avslutt"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:45
|
#: data/gtk/help-overlay.blp:39 data/gtk/window.blp:88 data/gtk/window.blp:164
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:44 data/gtk/window.blp:177 data/gtk/window.blp:237
|
||||||
|
msgid "Main Menu"
|
||||||
|
msgstr "Hovedmeny"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:50
|
||||||
msgid "Games"
|
msgid "Games"
|
||||||
msgstr "Spill"
|
msgstr "Spill"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:48
|
#: data/gtk/help-overlay.blp:53 data/gtk/window.blp:170 data/gtk/window.blp:524
|
||||||
msgid "Add new game"
|
msgid "Add Game"
|
||||||
msgstr "Legg til nytt spill"
|
msgstr "Legg til spill"
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:53
|
#: data/gtk/help-overlay.blp:58 data/gtk/preferences.blp:112
|
||||||
msgid "Import games"
|
#: data/gtk/window.blp:27 data/gtk/window.blp:528
|
||||||
msgstr "Importer spill"
|
msgid "Import"
|
||||||
|
msgstr "Importer"
|
||||||
#: data/gtk/help-overlay.blp:58
|
|
||||||
msgid "Show hidden games"
|
|
||||||
msgstr "Vis skjulte spill"
|
|
||||||
|
|
||||||
#: data/gtk/help-overlay.blp:63
|
#: data/gtk/help-overlay.blp:63
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Remove"
|
#| msgid "Show hidden games"
|
||||||
msgid "Remove game"
|
msgid "Show Hidden Games"
|
||||||
|
msgstr "Vis skjulte spill"
|
||||||
|
|
||||||
|
#: data/gtk/help-overlay.blp:68
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Remove Game"
|
||||||
msgstr "Fjern spill"
|
msgstr "Fjern spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:268
|
#: data/gtk/preferences.blp:12 data/gtk/preferences.blp:116
|
||||||
|
#: data/gtk/preferences.blp:381
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Adferd"
|
msgstr "Adferd"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:16
|
#: data/gtk/preferences.blp:15
|
||||||
msgid "Exit After Launching Games"
|
msgid "Exit After Launching Games"
|
||||||
msgstr "Avslutt etter oppstart av spill"
|
msgstr "Avslutt etter oppstart av spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:25
|
#: data/gtk/preferences.blp:19
|
||||||
msgid "Cover Image Launches Game"
|
msgid "Cover Image Launches Game"
|
||||||
msgstr "Omslagsbilde starter spill"
|
msgstr "Omslagsbilde starter spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:26
|
#: data/gtk/preferences.blp:20
|
||||||
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 "Bytter adferd for omslagsbilde og spill-knapp"
|
msgstr "Bytter adferd for omslagsbilde og spill-knapp"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
#: data/gtk/preferences.blp:25 cartridges/details_window.py:85
|
||||||
msgid "Images"
|
msgid "Images"
|
||||||
msgstr "Bilder"
|
msgstr "Bilder"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:39
|
#: data/gtk/preferences.blp:28
|
||||||
msgid "High Quality Images"
|
msgid "High Quality Images"
|
||||||
msgstr "Høykvalitetsbilder"
|
msgstr "Høykvalitetsbilder"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:40
|
#: data/gtk/preferences.blp:29
|
||||||
msgid "Save game covers losslessly at the cost of storage"
|
msgid "Save game covers losslessly at the cost of storage"
|
||||||
msgstr "Lagre spillomslag tapsfritt på bekostning av lagringsplass"
|
msgstr "Lagre spillomslag tapsfritt på bekostning av lagringsplass"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:50
|
#: data/gtk/preferences.blp:34
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Faresone"
|
msgstr "Faresone"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:53
|
#: data/gtk/preferences.blp:47
|
||||||
msgid "Remove All Games"
|
msgid "Remove All Games"
|
||||||
msgstr "Fjern alle spill"
|
msgstr "Fjern alle spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
#: data/gtk/preferences.blp:119
|
||||||
msgid "Import"
|
#, fuzzy
|
||||||
msgstr "Importer"
|
#| msgid "Remove All Games"
|
||||||
|
msgid "Remove Uninstalled Games"
|
||||||
|
msgstr "Fjern alle spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:89
|
#: data/gtk/preferences.blp:124
|
||||||
msgid "Sources"
|
msgid "Sources"
|
||||||
msgstr "Kilder"
|
msgstr "Kilder"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:92
|
#: data/gtk/preferences.blp:127 cartridges/importer/steam_source.py:114
|
||||||
msgid "Steam"
|
msgid "Steam"
|
||||||
msgstr "Steam"
|
msgstr "Steam"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
#: data/gtk/preferences.blp:136 data/gtk/preferences.blp:158
|
||||||
#: data/gtk/preferences.blp:151 data/gtk/preferences.blp:192
|
#: data/gtk/preferences.blp:200 data/gtk/preferences.blp:238
|
||||||
#: data/gtk/preferences.blp:206 data/gtk/preferences.blp:220
|
#: data/gtk/preferences.blp:260 data/gtk/preferences.blp:282
|
||||||
#: data/gtk/preferences.blp:234
|
#: data/gtk/preferences.blp:304
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Heroic Install Location"
|
|
||||||
msgid "Install Location"
|
msgid "Install Location"
|
||||||
msgstr "Installasjonssted for itch"
|
msgstr "Installasjonssted for itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:106
|
#: data/gtk/preferences.blp:149 data/gtk/window.blp:539
|
||||||
|
#: cartridges/importer/lutris_source.py:92
|
||||||
msgid "Lutris"
|
msgid "Lutris"
|
||||||
msgstr "Lutris"
|
msgstr "Lutris"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:119
|
#: data/gtk/preferences.blp:170
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Set Heroic Location"
|
|
||||||
msgid "Cache Location"
|
msgid "Cache Location"
|
||||||
msgstr "Posisjon for Lutris-hurtiglager"
|
msgstr "Posisjon for Lutris-hurtiglager"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:128
|
#: data/gtk/preferences.blp:182
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import Sideloaded Games"
|
|
||||||
msgid "Import Steam Games"
|
msgid "Import Steam Games"
|
||||||
msgstr "Importer sideinnlastede spill"
|
msgstr "Importer sideinnlastede spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:137
|
#: data/gtk/preferences.blp:186
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import Sideloaded Games"
|
|
||||||
msgid "Import Flatpak Games"
|
msgid "Import Flatpak Games"
|
||||||
msgstr "Importer sideinnlastede spill"
|
msgstr "Importer sideinnlastede spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:147
|
#: data/gtk/preferences.blp:191 cartridges/importer/heroic_source.py:355
|
||||||
msgid "Heroic"
|
msgid "Heroic"
|
||||||
msgstr "Heroic"
|
msgstr "Heroic"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:160
|
#: data/gtk/preferences.blp:212
|
||||||
msgid "Import Epic Games"
|
msgid "Import Epic Games"
|
||||||
msgstr "Importer Epic-spill"
|
msgstr "Importer Epic-spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:169
|
#: data/gtk/preferences.blp:216
|
||||||
msgid "Import GOG Games"
|
msgid "Import GOG Games"
|
||||||
msgstr "Importer GOG-spill"
|
msgstr "Importer GOG-spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:178
|
#: data/gtk/preferences.blp:220
|
||||||
|
msgid "Import Amazon Games"
|
||||||
|
msgstr "Importer Amazon-spill"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:224
|
||||||
msgid "Import Sideloaded Games"
|
msgid "Import Sideloaded Games"
|
||||||
msgstr "Importer sideinnlastede spill"
|
msgstr "Importer sideinnlastede spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:188
|
#: data/gtk/preferences.blp:229 cartridges/importer/bottles_source.py:86
|
||||||
msgid "Bottles"
|
msgid "Bottles"
|
||||||
msgstr "Bottles"
|
msgstr "Bottles"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:202
|
#: data/gtk/preferences.blp:251 cartridges/importer/itch_source.py:81
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "itch"
|
msgid "itch"
|
||||||
msgstr "itch"
|
msgstr "itch"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:216
|
#: data/gtk/preferences.blp:273 cartridges/importer/legendary_source.py:97
|
||||||
msgid "Legendary"
|
msgid "Legendary"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:230
|
#: data/gtk/preferences.blp:295 cartridges/importer/retroarch_source.py:142
|
||||||
|
msgid "RetroArch"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:317 cartridges/importer/flatpak_source.py:124
|
||||||
msgid "Flatpak"
|
msgid "Flatpak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:243
|
#. The location of the system-wide data directory
|
||||||
|
#: data/gtk/preferences.blp:327
|
||||||
|
#, fuzzy
|
||||||
|
msgid "System Location"
|
||||||
|
msgstr "Velg mappe"
|
||||||
|
|
||||||
|
#. The location of the user-specific data directory
|
||||||
|
#: data/gtk/preferences.blp:340
|
||||||
|
#, fuzzy
|
||||||
|
msgid "User Location"
|
||||||
|
msgstr "Velg mappe"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:352
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Game Launcher"
|
|
||||||
msgid "Import Game Launchers"
|
msgid "Import Game Launchers"
|
||||||
msgstr "Spillutvalgstarter"
|
msgstr "Spillutvalgstarter"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:256
|
#: data/gtk/preferences.blp:357 cartridges/importer/desktop_source.py:215
|
||||||
|
msgid "Desktop Entries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:369 data/gtk/window.blp:537
|
||||||
msgid "SteamGridDB"
|
msgid "SteamGridDB"
|
||||||
msgstr "SteamGridDB"
|
msgstr "SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:260
|
#: data/gtk/preferences.blp:373
|
||||||
msgid "Authentication"
|
msgid "Authentication"
|
||||||
msgstr "Identitetsbekreftelse"
|
msgstr "Identitetsbekreftelse"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:263
|
#: data/gtk/preferences.blp:376
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr "API-nøkkel"
|
msgstr "API-nøkkel"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:271
|
#: data/gtk/preferences.blp:384
|
||||||
msgid "Use SteamGridDB"
|
msgid "Use SteamGridDB"
|
||||||
msgstr "Bruk SteamGridDB"
|
msgstr "Bruk SteamGridDB"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:272
|
#: data/gtk/preferences.blp:385
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Directory to use when importing games"
|
|
||||||
msgid "Download images when adding or importing games"
|
msgid "Download images when adding or importing games"
|
||||||
msgstr "Mappe å bruke ved import av spill"
|
msgstr "Mappe å bruke ved import av spill"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:281
|
#: data/gtk/preferences.blp:389
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Prefer Over Official Images"
|
msgid "Prefer Over Official Images"
|
||||||
msgstr "Foretrekk over offisielle bilder"
|
msgstr "Foretrekk over offisielle bilder"
|
||||||
|
|
||||||
#: data/gtk/preferences.blp:290
|
#: data/gtk/preferences.blp:393
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Prefer Animated Images"
|
msgid "Prefer Animated Images"
|
||||||
msgstr "Foretrekk over offisielle bilder"
|
msgstr "Foretrekk over offisielle bilder"
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:399
|
||||||
|
msgid "Update Covers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:400
|
||||||
|
msgid "Fetch covers for games already in your library"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/preferences.blp:405
|
||||||
|
msgid "Update"
|
||||||
|
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"
|
||||||
msgstr "Fant ingen spill"
|
msgstr "Fant ingen spill"
|
||||||
@@ -353,118 +382,143 @@ msgstr "Ingen skjulte spill"
|
|||||||
msgid "Games you hide will appear here."
|
msgid "Games you hide will appear here."
|
||||||
msgstr "Spill du skjuler vil vises her."
|
msgstr "Spill du skjuler vil vises her."
|
||||||
|
|
||||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
#: data/gtk/window.blp:75 data/gtk/window.blp:106 cartridges/main.py:226
|
||||||
msgid "Back"
|
#, fuzzy
|
||||||
msgstr "Tilbake"
|
#| msgid "Remove All Games"
|
||||||
|
msgid "All Games"
|
||||||
|
msgstr "Fjern alle spill"
|
||||||
|
|
||||||
#: data/gtk/window.blp:121
|
#: data/gtk/window.blp:126 cartridges/main.py:228
|
||||||
msgid "Game Title"
|
#, fuzzy
|
||||||
msgstr "Spillnavn"
|
#| msgid "Added: {}"
|
||||||
|
msgid "Added"
|
||||||
|
msgstr "Tillagt: {}"
|
||||||
|
|
||||||
#: data/gtk/window.blp:176
|
#: data/gtk/window.blp:141
|
||||||
msgid "Play"
|
#, fuzzy
|
||||||
msgstr "Spill"
|
#| msgid "Import"
|
||||||
|
msgid "Imported"
|
||||||
|
msgstr "Importer"
|
||||||
|
|
||||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
#: data/gtk/window.blp:230
|
||||||
msgid "Add Game"
|
|
||||||
msgstr "Legg til spill"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
|
||||||
msgid "Main Menu"
|
|
||||||
msgstr "Hovedmeny"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:311
|
|
||||||
msgid "Hidden Games"
|
msgid "Hidden Games"
|
||||||
msgstr "Skjulte spill"
|
msgstr "Skjulte spill"
|
||||||
|
|
||||||
#: data/gtk/window.blp:374
|
#: data/gtk/window.blp:341
|
||||||
|
msgid "Game Title"
|
||||||
|
msgstr "Spillnavn"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:398
|
||||||
|
msgid "Play"
|
||||||
|
msgstr "Spill"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:475
|
||||||
msgid "Sort"
|
msgid "Sort"
|
||||||
msgstr "Sorter"
|
msgstr "Sorter"
|
||||||
|
|
||||||
#: data/gtk/window.blp:377
|
#: data/gtk/window.blp:478
|
||||||
msgid "A-Z"
|
msgid "A-Z"
|
||||||
msgstr "A-Å"
|
msgstr "A-Å"
|
||||||
|
|
||||||
#: data/gtk/window.blp:383
|
#: data/gtk/window.blp:484
|
||||||
msgid "Z-A"
|
msgid "Z-A"
|
||||||
msgstr "Å-A"
|
msgstr "Å-A"
|
||||||
|
|
||||||
#: data/gtk/window.blp:389
|
#: data/gtk/window.blp:490
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr "Nyeste"
|
msgstr "Nyeste"
|
||||||
|
|
||||||
#: data/gtk/window.blp:395
|
#: data/gtk/window.blp:496
|
||||||
msgid "Oldest"
|
msgid "Oldest"
|
||||||
msgstr "Eldste"
|
msgstr "Eldste"
|
||||||
|
|
||||||
#: data/gtk/window.blp:401
|
#: data/gtk/window.blp:502
|
||||||
msgid "Last Played"
|
msgid "Last Played"
|
||||||
msgstr "Sist spilt"
|
msgstr "Sist spilt"
|
||||||
|
|
||||||
#: data/gtk/window.blp:408
|
#: data/gtk/window.blp:509
|
||||||
msgid "Show Hidden"
|
msgid "Show Hidden"
|
||||||
msgstr "Vis skjulte"
|
msgstr "Vis skjulte"
|
||||||
|
|
||||||
#: data/gtk/window.blp:421
|
#: data/gtk/window.blp:518
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Tastatursnarveier"
|
|
||||||
|
|
||||||
#: data/gtk/window.blp:426
|
|
||||||
msgid "About Cartridges"
|
msgid "About Cartridges"
|
||||||
msgstr "Om"
|
msgstr "Om"
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:536
|
||||||
|
msgid "IGDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:538
|
||||||
|
msgid "ProtonDB"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/gtk/window.blp:540
|
||||||
|
msgid "HowLongToBeat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. The variable is the title of the game
|
||||||
|
#: cartridges/main.py:206 cartridges/game.py:125
|
||||||
|
msgid "{} launched"
|
||||||
|
msgstr "{} startet"
|
||||||
|
|
||||||
#. Translators: Replace this with your name for it to show up in the about window
|
#. Translators: Replace this with your name for it to show up in the about window
|
||||||
#: src/main.py:180
|
#: cartridges/main.py:269
|
||||||
msgid "translator_credits"
|
msgid "translator_credits"
|
||||||
msgstr "Allan Nordhøy, <epost@anotheragency.no>"
|
msgstr "Allan Nordhøy, <epost@anotheragency.no>"
|
||||||
|
|
||||||
#. The variable is the date when the game was added
|
#. The variable is the date when the game was added
|
||||||
#: src/window.py:194
|
#: cartridges/window.py:373
|
||||||
msgid "Added: {}"
|
msgid "Added: {}"
|
||||||
msgstr "Tillagt: {}"
|
msgstr "Tillagt: {}"
|
||||||
|
|
||||||
#: src/window.py:197
|
#: cartridges/window.py:376
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
msgstr "Aldri"
|
msgstr "Aldri"
|
||||||
|
|
||||||
#. The variable is the date when the game was last played
|
#. The variable is the date when the game was last played
|
||||||
#: src/window.py:201
|
#: cartridges/window.py:380
|
||||||
msgid "Last played: {}"
|
msgid "Last played: {}"
|
||||||
msgstr "Sist spilt: {}"
|
msgstr "Sist spilt: {}"
|
||||||
|
|
||||||
#: src/details_window.py:72
|
#: cartridges/details_window.py:76
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Bruk"
|
msgstr "Bruk"
|
||||||
|
|
||||||
#: src/details_window.py:78
|
#: cartridges/details_window.py:82
|
||||||
msgid "Add New Game"
|
msgid "Add New Game"
|
||||||
msgstr "Legg til nytt spill"
|
msgstr "Legg til nytt spill"
|
||||||
|
|
||||||
#: src/details_window.py:79
|
#: cartridges/details_window.py:83
|
||||||
msgid "Confirm"
|
msgid "Add"
|
||||||
msgstr "Bekreft"
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/details_window.py:93
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Executable"
|
||||||
|
msgid "Executables"
|
||||||
|
msgstr "Kjørbar"
|
||||||
|
|
||||||
#. Translate this string as you would translate "file"
|
#. Translate this string as you would translate "file"
|
||||||
#: src/details_window.py:92
|
#: cartridges/details_window.py:108
|
||||||
msgid "file.txt"
|
msgid "file.txt"
|
||||||
msgstr "fil.txt"
|
msgstr "fil.txt"
|
||||||
|
|
||||||
#. As in software
|
#. As in software
|
||||||
#: src/details_window.py:94
|
#: cartridges/details_window.py:110
|
||||||
msgid "program"
|
msgid "program"
|
||||||
msgstr "program"
|
msgstr "program"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:99 src/details_window.py:101
|
#: cartridges/details_window.py:115 cartridges/details_window.py:117
|
||||||
msgid "C:\\path\\to\\{}"
|
msgid "C:\\path\\to\\{}"
|
||||||
msgstr "C:\\sti\\til\\{}"
|
msgstr "C:\\sti\\til\\{}"
|
||||||
|
|
||||||
#. Translate this string as you would translate "path to {}"
|
#. Translate this string as you would translate "path to {}"
|
||||||
#: src/details_window.py:105 src/details_window.py:107
|
#: cartridges/details_window.py:121 cartridges/details_window.py:123
|
||||||
msgid "/path/to/{}"
|
msgid "/path/to/{}"
|
||||||
msgstr "/sti/til/{}"
|
msgstr "/sti/til/{}"
|
||||||
|
|
||||||
#: src/details_window.py:112
|
#: cartridges/details_window.py:128
|
||||||
msgid ""
|
msgid ""
|
||||||
"To launch the executable \"{}\", use the command:\n"
|
"To launch the executable \"{}\", use the command:\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -487,115 +541,203 @@ msgstr ""
|
|||||||
"Hvis stien inneholder mellomrom må du pakke den inn i doble engelske "
|
"Hvis stien inneholder mellomrom må du pakke den inn i doble engelske "
|
||||||
"sitattegn."
|
"sitattegn."
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:153
|
#: cartridges/details_window.py:171 cartridges/details_window.py:177
|
||||||
msgid "Couldn't Add Game"
|
msgid "Couldn't Add Game"
|
||||||
msgstr "Kunne ikke legge til spill"
|
msgstr "Kunne ikke legge til spill"
|
||||||
|
|
||||||
#: src/details_window.py:147 src/details_window.py:181
|
#: cartridges/details_window.py:171 cartridges/details_window.py:213
|
||||||
msgid "Game title cannot be empty."
|
msgid "Game title cannot be empty."
|
||||||
msgstr "Spillnavnet kan ikke være tomt."
|
msgstr "Spillnavnet kan ikke være tomt."
|
||||||
|
|
||||||
#: src/details_window.py:153 src/details_window.py:189
|
#: cartridges/details_window.py:177 cartridges/details_window.py:221
|
||||||
msgid "Executable cannot be empty."
|
msgid "Executable cannot be empty."
|
||||||
msgstr "Kjørbar fil må angis."
|
msgstr "Kjørbar fil må angis."
|
||||||
|
|
||||||
#: src/details_window.py:180 src/details_window.py:188
|
#: cartridges/details_window.py:212 cartridges/details_window.py:220
|
||||||
msgid "Couldn't Apply Preferences"
|
msgid "Couldn't Apply Preferences"
|
||||||
msgstr "Kunne ikke ta i bruk endringer"
|
msgstr "Kunne ikke ta i bruk endringer"
|
||||||
|
|
||||||
#. The variable is the title of the game
|
#. The variable is the title of the game
|
||||||
#: src/game.py:138
|
#: cartridges/game.py:139
|
||||||
msgid "{} launched"
|
|
||||||
msgstr "{} startet"
|
|
||||||
|
|
||||||
#. The variable is the title of the game
|
|
||||||
#: src/game.py:152
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Show Hidden"
|
|
||||||
msgid "{} hidden"
|
msgid "{} hidden"
|
||||||
msgstr "{} skjult"
|
msgstr "{} skjult"
|
||||||
|
|
||||||
#: src/game.py:152
|
#: cartridges/game.py:139
|
||||||
msgid "{} unhidden"
|
msgid "{} unhidden"
|
||||||
msgstr "{} synlig"
|
msgstr "{} synlig"
|
||||||
|
|
||||||
#: src/game.py:169
|
#. The variable is the title of the game
|
||||||
|
#. The variable is the number of games removed
|
||||||
|
#: cartridges/game.py:153 cartridges/importer/importer.py:391
|
||||||
msgid "{} removed"
|
msgid "{} removed"
|
||||||
msgstr "{} fjernet"
|
msgstr "{} fjernet"
|
||||||
|
|
||||||
#: src/preferences.py:111
|
#: cartridges/preferences.py:128
|
||||||
msgid "All games removed"
|
msgid "All games removed"
|
||||||
msgstr "Alle spill fjernet"
|
msgstr "Alle spill fjernet"
|
||||||
|
|
||||||
#: src/preferences.py:159
|
#: cartridges/preferences.py:176
|
||||||
msgid ""
|
msgid ""
|
||||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"En API-nøkkel kreves for å bruke SteamGridDB. Du kan generere en {}her{}."
|
"En API-nøkkel kreves for å bruke SteamGridDB. Du kan generere en {}her{}."
|
||||||
|
|
||||||
#: src/preferences.py:284
|
#: cartridges/preferences.py:191
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Importing Covers…"
|
||||||
|
msgid "Downloading covers…"
|
||||||
|
msgstr "Importerer omslag …"
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:210
|
||||||
|
msgid "Covers updated"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:345
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Installation Not Found"
|
|
||||||
msgid "Installation Not Found"
|
msgid "Installation Not Found"
|
||||||
msgstr "Fant ikke installasjonen"
|
msgstr "Fant ikke installasjonen"
|
||||||
|
|
||||||
#: src/preferences.py:286
|
#: cartridges/preferences.py:346
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select a valid directory."
|
msgid "Select a valid directory."
|
||||||
msgstr "Velg {}-datamappen."
|
msgstr "Velg {}-datamappen."
|
||||||
|
|
||||||
#: src/preferences.py:348
|
#: cartridges/preferences.py:382 cartridges/importer/importer.py:317
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/preferences.py:416
|
||||||
msgid "Invalid Directory"
|
msgid "Invalid Directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#: cartridges/preferences.py:422
|
||||||
#: src/preferences.py:352
|
#, fuzzy
|
||||||
|
msgid "Set Location"
|
||||||
|
msgstr "Velg mappe"
|
||||||
|
|
||||||
|
#: cartridges/utils/create_dialog.py:33 cartridges/importer/importer.py:318
|
||||||
|
msgid "Dismiss"
|
||||||
|
msgstr "Forkast"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:145
|
||||||
|
msgid "Importing Games…"
|
||||||
|
msgstr "Importerer spill …"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:338
|
||||||
|
msgid "The following errors occured during import:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:367
|
||||||
|
#, fuzzy
|
||||||
|
msgid "No new games found"
|
||||||
|
msgstr "Fant ingen spill"
|
||||||
|
|
||||||
|
#: cartridges/importer/importer.py:379
|
||||||
|
#, fuzzy
|
||||||
|
msgid "1 game imported"
|
||||||
|
msgstr "Spill importert"
|
||||||
|
|
||||||
|
#. The variable is the number of games
|
||||||
|
#: cartridges/importer/importer.py:383
|
||||||
|
#, fuzzy
|
||||||
|
msgid "{} games imported"
|
||||||
|
msgstr "Spill importert"
|
||||||
|
|
||||||
|
#. A single game removed
|
||||||
|
#: cartridges/importer/importer.py:387
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "{} removed"
|
||||||
|
msgid "1 removed"
|
||||||
|
msgstr "{} fjernet"
|
||||||
|
|
||||||
|
#. The variable is the name of the source
|
||||||
|
#: cartridges/importer/location.py:33
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} cache directory."
|
msgid "Select the {} cache directory."
|
||||||
msgstr "Velg {}-datamappen."
|
msgstr "Velg {}-datamappen."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:355
|
#: cartridges/importer/location.py:35
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Select the {} configuration directory."
|
|
||||||
msgid "Select the {} configuration directory."
|
msgid "Select the {} configuration directory."
|
||||||
msgstr "Velg {}-oppsettsmappen."
|
msgstr "Velg {}-oppsettsmappen."
|
||||||
|
|
||||||
#. The variable is the name of the source
|
#. The variable is the name of the source
|
||||||
#: src/preferences.py:358
|
#: cartridges/importer/location.py:37
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Select the {} data directory."
|
|
||||||
msgid "Select the {} data directory."
|
msgid "Select the {} data directory."
|
||||||
msgstr "Velg {}-datamappen."
|
msgstr "Velg {}-datamappen."
|
||||||
|
|
||||||
#: src/preferences.py:364
|
#: cartridges/importer/retroarch_source.py:129
|
||||||
#, fuzzy
|
msgid "No RetroArch Core Selected"
|
||||||
#| msgid "Set Steam Location"
|
msgstr ""
|
||||||
msgid "Set Location"
|
|
||||||
msgstr "Velg mappe"
|
|
||||||
|
|
||||||
#: src/utils/create_dialog.py:25
|
#. The variable is a newline separated list of playlists
|
||||||
msgid "Dismiss"
|
#: cartridges/importer/retroarch_source.py:131
|
||||||
msgstr "Forkast"
|
msgid "The following playlists have no default core:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:47
|
#: cartridges/importer/retroarch_source.py:133
|
||||||
|
msgid "Games with no core selected were not imported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cartridges/store/managers/sgdb_manager.py:46
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Couldn't Authenticate SteamGridDB"
|
msgid "Couldn't Authenticate SteamGridDB"
|
||||||
msgstr "Kunne ikke koble til SteamGridDB"
|
msgstr "Kunne ikke koble til SteamGridDB"
|
||||||
|
|
||||||
#: src/store/managers/sgdb_manager.py:48
|
#: cartridges/store/managers/sgdb_manager.py:47
|
||||||
msgid "Verify your API key in preferences"
|
msgid "Verify your API key in preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Library"
|
||||||
|
#~ msgstr "Bibliotek"
|
||||||
|
|
||||||
|
#~ msgid "Show preferences"
|
||||||
|
#~ msgstr "Vis innstillinger"
|
||||||
|
|
||||||
|
#~ msgid "Shortcuts"
|
||||||
|
#~ msgstr "Snarveier"
|
||||||
|
|
||||||
|
#~ msgid "Open menu"
|
||||||
|
#~ msgstr "Åpne meny"
|
||||||
|
|
||||||
|
#~ msgid "Add new game"
|
||||||
|
#~ msgstr "Legg til nytt spill"
|
||||||
|
|
||||||
|
#~ msgid "Import games"
|
||||||
|
#~ msgstr "Importer spill"
|
||||||
|
|
||||||
|
#~ msgid "Back"
|
||||||
|
#~ msgstr "Tilbake"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Search games"
|
||||||
|
#~ msgstr "Søk"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~| msgid "Show hidden games"
|
||||||
|
#~ msgid "Search hidden games"
|
||||||
|
#~ msgstr "Vis skjulte spill"
|
||||||
|
|
||||||
|
#~ msgid "The title of the game"
|
||||||
|
#~ msgstr "Navnet på spillet"
|
||||||
|
|
||||||
|
#~ msgid "Developer"
|
||||||
|
#~ msgstr "Utvikler"
|
||||||
|
|
||||||
|
#~ msgid "File to open or command to run when launching the game"
|
||||||
|
#~ msgstr "Fil å åpne eller kommando å kjøre ved oppstart av spillet"
|
||||||
|
|
||||||
|
#~ msgid "Confirm"
|
||||||
|
#~ msgstr "Bekreft"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "The Steam directory cannot be found."
|
|
||||||
#~ msgid "Directory not Valid"
|
#~ msgid "Directory not Valid"
|
||||||
#~ msgstr "Kunne ikke finne Steam-mappen."
|
#~ msgstr "Kunne ikke finne Steam-mappen."
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Confirm"
|
|
||||||
#~ msgid "Configuration"
|
#~ msgid "Configuration"
|
||||||
#~ msgstr "Bekreft"
|
#~ msgstr "Bekreft"
|
||||||
|
|
||||||
@@ -625,27 +767,6 @@ msgstr ""
|
|||||||
#~ msgid "Select the Lutris cache directory."
|
#~ msgid "Select the Lutris cache directory."
|
||||||
#~ msgstr "Velg {name}-datamappen."
|
#~ msgstr "Velg {name}-datamappen."
|
||||||
|
|
||||||
#~ msgid "Importing Games…"
|
|
||||||
#~ msgstr "Importerer spill …"
|
|
||||||
|
|
||||||
#~ msgid "Importing Covers…"
|
|
||||||
#~ msgstr "Importerer omslag …"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "No Games Found"
|
|
||||||
#~ msgid "No new games found"
|
|
||||||
#~ msgstr "Fant ingen spill"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Game Imported"
|
|
||||||
#~ msgid "1 game imported"
|
|
||||||
#~ msgstr "Spill importert"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "Games Imported"
|
|
||||||
#~ msgid "{} games imported"
|
|
||||||
#~ msgstr "Spill importert"
|
|
||||||
|
|
||||||
#~ msgid "Directory to use when importing games"
|
#~ msgid "Directory to use when importing games"
|
||||||
#~ msgstr "Mappe å bruke ved import av spill"
|
#~ msgstr "Mappe å bruke ved import av spill"
|
||||||
|
|
||||||
@@ -660,7 +781,6 @@ msgstr ""
|
|||||||
#~ msgstr "Tøm"
|
#~ msgstr "Tøm"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Directory to use when importing games"
|
|
||||||
#~ msgid "Directory to use when importing game covers"
|
#~ msgid "Directory to use when importing game covers"
|
||||||
#~ msgstr "Mappe å bruke ved import av spillomslag"
|
#~ msgstr "Mappe å bruke ved import av spillomslag"
|
||||||
|
|
||||||
@@ -674,7 +794,6 @@ msgstr ""
|
|||||||
#~ msgstr "Importerte ett spill."
|
#~ msgstr "Importerte ett spill."
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Successfully imported 1 game."
|
|
||||||
#~ msgid "Successfully imported {} games."
|
#~ msgid "Successfully imported {} games."
|
||||||
#~ msgstr "Importerte {} spill."
|
#~ msgstr "Importerte {} spill."
|
||||||
|
|
||||||
@@ -705,7 +824,6 @@ msgstr ""
|
|||||||
#~ msgstr "/sti/til/{file_name}"
|
#~ msgstr "/sti/til/{file_name}"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "General"
|
|
||||||
#~ msgctxt "shortcuts window"
|
#~ msgctxt "shortcuts window"
|
||||||
#~ msgid "General"
|
#~ msgid "General"
|
||||||
#~ msgstr "Generelt"
|
#~ msgstr "Generelt"
|
||||||
@@ -716,7 +834,6 @@ msgstr ""
|
|||||||
#~ msgstr "Søk"
|
#~ msgstr "Søk"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Undo"
|
|
||||||
#~ msgctxt "shortcuts window"
|
#~ msgctxt "shortcuts window"
|
||||||
#~ msgid "Undo"
|
#~ msgid "Undo"
|
||||||
#~ msgstr "Angre"
|
#~ msgstr "Angre"
|
||||||
|
|||||||