Compare commits
1 Commits
v2.3
...
yuzu-sourc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
755b733023 |
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -23,9 +23,6 @@ A clear and concise description of what you expected to happen.
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Logs**
|
||||
If applicable, attatch your logs from `Main Menu > About Cartridges > Troubleshooting > Debugging Information` to the issue.
|
||||
|
||||
**System (please complete the following information):**
|
||||
- OS: [e.g. Fedora Linux]
|
||||
- Installation method [e.g. Flatpak]
|
||||
|
||||
19
.github/workflows/flatpak-builder.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
name: CI
|
||||
jobs:
|
||||
flatpak:
|
||||
name: "Flatpak"
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: bilelmoussaoui/flatpak-github-actions:gnome-44
|
||||
options: --privileged
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||
with:
|
||||
bundle: hu.kramo.Cartridges.Devel.flatpak
|
||||
manifest-path: flatpak/hu.kramo.Cartridges.Devel.json
|
||||
cache-key: flatpak-builder-${{ github.sha }}
|
||||
45
.github/workflows/publish-release.yml
vendored
@@ -1,45 +0,0 @@
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
"*"
|
||||
name: Publish Release
|
||||
concurrency:
|
||||
group: release-${{ github.sha }}
|
||||
jobs:
|
||||
publish-release:
|
||||
name: Publish Release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Download workflow artifact
|
||||
uses: dawidd6/action-download-artifact@v2.27.0
|
||||
with:
|
||||
workflow: ci.yml
|
||||
commit: ${{ github.sha }}
|
||||
|
||||
- name: Get release notes
|
||||
shell: python
|
||||
run: |
|
||||
import re, textwrap
|
||||
open_file = open("./data/hu.kramo.Cartridges.metainfo.xml.in", "r", encoding="utf-8")
|
||||
string = open_file.read()
|
||||
open_file.close()
|
||||
string = re.findall("<release.*>\s*<description.*>\n([\s\S]*?)\s*</description>\s*<\/release>", string)[0]
|
||||
string = textwrap.dedent(string)
|
||||
open_file = open("release_notes", "w", encoding="utf-8")
|
||||
open_file.write(string)
|
||||
open_file.close()
|
||||
|
||||
- name: Get tag name
|
||||
id: get_tag_name
|
||||
run: echo tag_name=${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v0.1.15
|
||||
with:
|
||||
files: Windows Installer/Cartridges Setup.exe
|
||||
fail_on_unmatched_files: true
|
||||
tag_name: ${{ steps.get_tag_name.outputs.tag_name }}
|
||||
body_path: release_notes
|
||||
@@ -2,40 +2,20 @@ on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
name: CI
|
||||
concurrency:
|
||||
group: release-${{ github.sha }}
|
||||
name: "Build for Windows"
|
||||
jobs:
|
||||
flatpak:
|
||||
name: Flatpak
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: bilelmoussaoui/flatpak-github-actions:gnome-44
|
||||
options: --privileged
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Flatpak Builder
|
||||
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.1
|
||||
with:
|
||||
bundle: hu.kramo.Cartridges.Devel.flatpak
|
||||
manifest-path: flatpak/hu.kramo.Cartridges.Devel.json
|
||||
|
||||
windows:
|
||||
name: Windows
|
||||
name: "Build"
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup MSYS2
|
||||
- name: MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: UCRT64
|
||||
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
|
||||
|
||||
- name: Compile
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
@@ -43,18 +23,10 @@ jobs:
|
||||
ninja -C _build install
|
||||
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
|
||||
|
||||
- name: Test
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
set +e
|
||||
timeout 2 cartridges; [ "$?" -eq "124" ]
|
||||
|
||||
- name: Inno Setup
|
||||
run: iscc ".\_build\windows\Cartridges.iss"
|
||||
|
||||
- name: Upload Artifact
|
||||
- name: "Inno Setup"
|
||||
run: iscc ".\_build\Cartridges.iss"
|
||||
- name: "Upload Artifact"
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Windows Installer
|
||||
path: _build/windows/Output/Cartridges Setup.exe
|
||||
name: "Installer"
|
||||
path: "_build/Output/Cartridges Setup.exe"
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
ignore=importers
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
disable=raw-checker-failed,
|
||||
bad-inline-option,
|
||||
|
||||
@@ -1,14 +1,7 @@
|
||||
# Contributing
|
||||
|
||||
## Code
|
||||
|
||||
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.
|
||||
Fork the repository, make your changes, then create a pull request.
|
||||
|
||||
## Translations
|
||||
### Weblate
|
||||
@@ -24,13 +17,13 @@ The project can be translated on [Weblate](https://hosted.weblate.org/engage/car
|
||||
# Building
|
||||
|
||||
## GNOME Builder
|
||||
1. Install [GNOME Builder](https://flathub.org/apps/org.gnome.Builder).
|
||||
1. Install [GNOME Builder](https://flathub.org/apps/details/org.gnome.Builder).
|
||||
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.
|
||||
|
||||
## For Windows
|
||||
1. Install [MSYS2](https://www.msys2.org/).
|
||||
2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml).
|
||||
2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/windows.yml).
|
||||
3. Build it via Meson.
|
||||
|
||||
## Meson
|
||||
@@ -40,23 +33,3 @@ cd cartridges
|
||||
meson setup build
|
||||
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 via the command line.
|
||||
|
||||
56
README.md
@@ -1,30 +1,33 @@
|
||||
|
||||
[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">
|
||||
<img src="data/icons/hicolor/scalable/apps/hu.kramo.Cartridges.svg" width="128" height="128">
|
||||
|
||||
# Cartridges
|
||||
# Cartridges
|
||||
|
||||
A GTK4 + Libadwaita game launcher
|
||||
A GTK4 + Libadwaita game launcher
|
||||
|
||||
[![GNOME Circle][circle-image]][circle-url]
|
||||
[![Translation Status][weblate-image]][weblate-url]
|
||||
[![GNOME Circle][circle-image]][circle-url]
|
||||
[![Flathub][flathub-image]][flathub-url]
|
||||
[![Build status][github-actions-image]][github-actions-url]
|
||||
[![Translation Status][weblate-image]][weblate-url]
|
||||
[![License][license-image]][license-url]
|
||||
[![Code style][code-style-image]][code-style-url]
|
||||
[![Discord][discord-image]][discord-url]
|
||||
|
||||
[![Flathub][flathub-image]][flathub-url]
|
||||
[![Discord][discord-image]][discord-url]
|
||||
[![Matrix][matrix-image]][matrix-url]
|
||||
[![Installs][installs-image]][flathub-url]
|
||||
[circle-url]: https://circle.gnome.org
|
||||
[circle-image]: https://circle.gnome.org/assets/button/badge.svg
|
||||
[github-actions-url]: https://github.com/kra-mo/cartridges
|
||||
[github-actions-image]: https://github.com/kra-mo/cartridges/actions/workflows/flatpak-builder.yml/badge.svg
|
||||
[license-url]: https://github.com/kra-mo/cartridges/blob/main/LICENSE
|
||||
[license-image]: https://img.shields.io/github/license/kra-mo/cartridges
|
||||
[code-style-url]: https://github.com/psf/black
|
||||
[code-style-image]: https://img.shields.io/badge/code%20style-black-000000?style=flat
|
||||
[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
|
||||
[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">
|
||||
</div>
|
||||
@@ -36,22 +39,15 @@ Cartridges is a simple game launcher written in Python using GTK4 and Libadwaita
|
||||
## Features
|
||||
|
||||
- Manually adding and editing games
|
||||
- Importing games from various sources:
|
||||
- Steam
|
||||
- Lutris
|
||||
- Heroic
|
||||
- Bottles
|
||||
- itch
|
||||
- Legendary
|
||||
- RetroArch
|
||||
- Flatpak
|
||||
- Importing games from Steam, Lutris, Heroic, Bottles and itch
|
||||
- Support for multiple Steam install locations
|
||||
- Hiding games
|
||||
- Searching and sorting by title, date added and last played
|
||||
- Automatically downloading cover art from [SteamGridDB](https://www.steamgriddb.com/)
|
||||
- Searching for games on various databases
|
||||
- Animated covers
|
||||
|
||||
For updates and questions, join our [Discord server][discord-url] (bridged to [Matrix](https://matrix.to/#/#cartridges:matrix.org))!
|
||||
For updates and questions, join our [Discord server][discord-url]!
|
||||
|
||||
# Installation
|
||||
|
||||
|
||||
@@ -29,30 +29,6 @@ Cartridges is a simple game launcher for all of your games. It has support for i
|
||||
<foaf:accountName>kra-mo</foaf:accountName>
|
||||
</foaf:OnlineAccount>
|
||||
</foaf:account>
|
||||
<foaf:account>
|
||||
<foaf:OnlineAccount>
|
||||
<foaf:accountServiceHomepage rdf:resource="https://gitlab.gnome.org"/>
|
||||
<foaf:accountName>kramo</foaf:accountName>
|
||||
</foaf:OnlineAccount>
|
||||
</foaf:account>
|
||||
</foaf:Person>
|
||||
</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>
|
||||
|
||||
|
||||
@@ -2,159 +2,160 @@ using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $DetailsWindow : Adw.Window {
|
||||
default-width: 480; // Same as Nautilus' properties window
|
||||
default-height: -1;
|
||||
modal: true;
|
||||
default-width: 500;
|
||||
default-height: -1;
|
||||
modal: true;
|
||||
|
||||
ShortcutController {
|
||||
Shortcut {
|
||||
trigger: "Escape";
|
||||
action: "action(window.close)";
|
||||
}
|
||||
}
|
||||
|
||||
Box {
|
||||
orientation: vertical;
|
||||
|
||||
Adw.HeaderBar HeaderBar {
|
||||
show-start-title-buttons: false;
|
||||
show-end-title-buttons: false;
|
||||
|
||||
[start]
|
||||
Button cancel_button {
|
||||
label: _("Cancel");
|
||||
action-name: "window.close";
|
||||
}
|
||||
|
||||
[end]
|
||||
Button apply_button {
|
||||
styles [
|
||||
"suggested-action",
|
||||
]
|
||||
}
|
||||
ShortcutController {
|
||||
Shortcut {
|
||||
trigger: "Escape";
|
||||
action: "action(window.close)";
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesPage {
|
||||
vexpand: true;
|
||||
Box {
|
||||
orientation: vertical;
|
||||
|
||||
Adw.PreferencesGroup cover_group {
|
||||
Adw.Clamp cover_clamp {
|
||||
maximum-size: 200;
|
||||
Adw.HeaderBar HeaderBar {
|
||||
show-start-title-buttons: false;
|
||||
show-end-title-buttons: false;
|
||||
|
||||
Overlay {
|
||||
[overlay]
|
||||
Spinner spinner {
|
||||
margin-start: 72;
|
||||
margin-end: 72;
|
||||
[start]
|
||||
Button cancel_button {
|
||||
label: _("Cancel");
|
||||
action-name: "window.close";
|
||||
}
|
||||
|
||||
Overlay cover_overlay {
|
||||
halign: center;
|
||||
valign: center;
|
||||
|
||||
[overlay]
|
||||
Button cover_button_edit {
|
||||
icon-name: "document-edit-symbolic";
|
||||
tooltip-text: _("New Cover");
|
||||
halign: end;
|
||||
valign: end;
|
||||
margin-bottom: 6;
|
||||
margin-end: 6;
|
||||
|
||||
[end]
|
||||
Button apply_button {
|
||||
styles [
|
||||
"circular",
|
||||
"osd",
|
||||
"suggested-action"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Revealer cover_button_delete_revealer {
|
||||
transition-type: crossfade;
|
||||
margin-end: 40;
|
||||
Adw.PreferencesPage {
|
||||
vexpand: true;
|
||||
|
||||
Button cover_button_delete {
|
||||
icon-name: "user-trash-symbolic";
|
||||
tooltip-text: _("Delete Cover");
|
||||
halign: end;
|
||||
valign: end;
|
||||
margin-bottom: 6;
|
||||
margin-end: 6;
|
||||
Adw.PreferencesGroup cover_group {
|
||||
Adw.Clamp cover_clamp {
|
||||
maximum-size: 200;
|
||||
Overlay {
|
||||
[overlay]
|
||||
Spinner spinner {
|
||||
margin-start: 72;
|
||||
margin-end: 72;
|
||||
}
|
||||
|
||||
styles [
|
||||
"circular",
|
||||
"osd",
|
||||
]
|
||||
Overlay cover_overlay {
|
||||
halign: center;
|
||||
valign: center;
|
||||
|
||||
[overlay]
|
||||
Button cover_button_edit {
|
||||
icon-name: "document-edit-symbolic";
|
||||
tooltip-text: _("New Cover");
|
||||
halign: end;
|
||||
valign: end;
|
||||
margin-bottom: 6;
|
||||
margin-end: 6;
|
||||
|
||||
styles [
|
||||
"circular", "osd"
|
||||
]
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Revealer cover_button_delete_revealer {
|
||||
transition-type: crossfade;
|
||||
margin-end: 40;
|
||||
|
||||
Button cover_button_delete {
|
||||
icon-name: "user-trash-symbolic";
|
||||
tooltip-text: _("Delete Cover");
|
||||
halign: end;
|
||||
valign: end;
|
||||
margin-bottom: 6;
|
||||
margin-end: 6;
|
||||
|
||||
styles [
|
||||
"circular", "osd"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Picture cover {
|
||||
width-request: 200;
|
||||
height-request: 300;
|
||||
|
||||
styles [
|
||||
"card"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Picture cover {
|
||||
width-request: 200;
|
||||
height-request: 300;
|
||||
|
||||
styles [
|
||||
"card",
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesGroup {
|
||||
Adw.EntryRow name {
|
||||
title: _("Title");
|
||||
}
|
||||
|
||||
Adw.EntryRow developer {
|
||||
title: _("Developer (optional)");
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesGroup {
|
||||
Adw.EntryRow executable {
|
||||
title: _("Executable");
|
||||
|
||||
[suffix]
|
||||
Button file_chooser_button {
|
||||
valign: center;
|
||||
icon-name: "document-open-symbolic";
|
||||
tooltip-text: _("Select File");
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
]
|
||||
}
|
||||
|
||||
[suffix]
|
||||
MenuButton exec_info_button {
|
||||
valign: center;
|
||||
icon-name: "help-about-symbolic";
|
||||
tooltip-text: _("More Info");
|
||||
popover:
|
||||
Popover exec_info_popover {
|
||||
focusable: true;
|
||||
|
||||
Label exec_info_label {
|
||||
use-markup: true;
|
||||
wrap: true;
|
||||
max-width-chars: 50;
|
||||
halign: center;
|
||||
valign: center;
|
||||
margin-top: 6;
|
||||
margin-bottom: 6;
|
||||
margin-start: 6;
|
||||
margin-end: 6;
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
Adw.PreferencesGroup title_group {
|
||||
title: _("Title");
|
||||
description: _("The title of the game");
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
]
|
||||
}
|
||||
Entry name {
|
||||
accessibility {
|
||||
label: _("Title");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesGroup developer_group {
|
||||
title: _("Developer");
|
||||
description: _("The developer or publisher (optional)");
|
||||
|
||||
Entry developer {
|
||||
accessibility {
|
||||
label: _("Developer");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesGroup exec_group {
|
||||
title: _("Executable");
|
||||
description: _("File to open or command to run when launching the game");
|
||||
|
||||
[header-suffix]
|
||||
Gtk.MenuButton exec_info_button {
|
||||
valign: center;
|
||||
icon-name: "help-about-symbolic";
|
||||
tooltip-text: _("More Info");
|
||||
|
||||
popover: Popover exec_info_popover {
|
||||
|
||||
Label exec_info_label {
|
||||
use-markup: true;
|
||||
wrap: true;
|
||||
max-width-chars: 50;
|
||||
halign: center;
|
||||
valign: center;
|
||||
margin-top: 6;
|
||||
margin-bottom: 6;
|
||||
margin-start: 6;
|
||||
margin-end: 6;
|
||||
selectable: true;
|
||||
}
|
||||
};
|
||||
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
|
||||
Entry executable {
|
||||
accessibility {
|
||||
label: _("Executable");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,8 +81,8 @@ template $Game : Box {
|
||||
ellipsize: end;
|
||||
hexpand: true;
|
||||
halign: start;
|
||||
margin-top: 15;
|
||||
margin-bottom: 15;
|
||||
margin-top: 14;
|
||||
margin-bottom: 14;
|
||||
margin-start: 12;
|
||||
margin-end: 12;
|
||||
}
|
||||
|
||||
@@ -76,6 +76,7 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,19 +85,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
title: _("Import");
|
||||
icon-name: "document-save-symbolic";
|
||||
|
||||
Adw.PreferencesGroup import_behavior_group {
|
||||
title: _("Behavior");
|
||||
|
||||
Adw.ActionRow {
|
||||
title: _("Remove Uninstalled Games");
|
||||
activatable-widget: remove_missing_switch;
|
||||
|
||||
Switch remove_missing_switch {
|
||||
valign: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.PreferencesGroup sources_group {
|
||||
title: _("Sources");
|
||||
|
||||
@@ -110,9 +98,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button steam_data_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,9 +112,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button lutris_data_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,9 +121,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button lutris_cache_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,9 +153,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button heroic_config_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,15 +174,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
}
|
||||
}
|
||||
|
||||
Adw.ActionRow {
|
||||
title: _("Import Amazon Games");
|
||||
activatable-widget: heroic_import_amazon_switch;
|
||||
|
||||
Switch heroic_import_amazon_switch {
|
||||
valign: center;
|
||||
}
|
||||
}
|
||||
|
||||
Adw.ActionRow {
|
||||
title: _("Import Sideloaded Games");
|
||||
activatable-widget: heroic_import_sideload_switch;
|
||||
@@ -227,9 +194,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button bottles_data_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -244,9 +208,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button itch_config_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -261,26 +222,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button legendary_config_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.ExpanderRow retroarch_expander_row {
|
||||
title: _("RetroArch");
|
||||
show-enable-switch: true;
|
||||
|
||||
Adw.ActionRow retroarch_config_action_row {
|
||||
title: _("Install Location");
|
||||
|
||||
Button retroarch_config_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -295,9 +236,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
Button flatpak_data_file_chooser_button {
|
||||
icon-name: "folder-symbolic";
|
||||
valign: center;
|
||||
styles [
|
||||
"flat"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,15 +248,6 @@ template $PreferencesWindow : Adw.PreferencesWindow {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.ActionRow {
|
||||
title: _("Desktop Entries");
|
||||
activatable-widget: desktop_switch;
|
||||
|
||||
Switch desktop_switch {
|
||||
valign: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
|
||||
Box {
|
||||
orientation: horizontal;
|
||||
margin-top: 15;
|
||||
margin-top: 16;
|
||||
hexpand: true;
|
||||
halign: start;
|
||||
|
||||
@@ -194,19 +194,13 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
action-name: "app.edit_game";
|
||||
tooltip-text: _("Edit");
|
||||
|
||||
styles [
|
||||
"raised",
|
||||
"circular",
|
||||
]
|
||||
styles ["raised", "circular"]
|
||||
}
|
||||
|
||||
Button details_view_hide_button {
|
||||
action-name: "app.hide_game";
|
||||
|
||||
styles [
|
||||
"raised",
|
||||
"circular",
|
||||
]
|
||||
styles ["raised", "circular"]
|
||||
}
|
||||
|
||||
Button {
|
||||
@@ -214,10 +208,7 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
action-name: "app.remove_game";
|
||||
tooltip-text: _("Remove");
|
||||
|
||||
styles [
|
||||
"raised",
|
||||
"circular",
|
||||
]
|
||||
styles ["raised", "circular"]
|
||||
}
|
||||
|
||||
MenuButton {
|
||||
@@ -225,10 +216,7 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
menu-model: search;
|
||||
tooltip-text: _("Search");
|
||||
|
||||
styles [
|
||||
"raised",
|
||||
"circular",
|
||||
]
|
||||
styles ["raised", "circular"]
|
||||
}
|
||||
|
||||
styles [
|
||||
@@ -281,7 +269,6 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
tightening-threshold: 500;
|
||||
|
||||
SearchEntry search_entry {
|
||||
placeholder-text: _("Search games");
|
||||
hexpand: true;
|
||||
}
|
||||
}
|
||||
@@ -298,10 +285,10 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
valign: start;
|
||||
column-spacing: 12;
|
||||
row-spacing: 12;
|
||||
margin-top: 15;
|
||||
margin-bottom: 15;
|
||||
margin-start: 15;
|
||||
margin-end: 15;
|
||||
margin-top: 16;
|
||||
margin-bottom: 16;
|
||||
margin-start: 16;
|
||||
margin-end: 16;
|
||||
selection-mode: none;
|
||||
}
|
||||
}
|
||||
@@ -348,7 +335,6 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
tightening-threshold: 500;
|
||||
|
||||
SearchEntry hidden_search_entry {
|
||||
placeholder-text: _("Search hidden games");
|
||||
hexpand: true;
|
||||
}
|
||||
}
|
||||
@@ -365,10 +351,10 @@ template $CartridgesWindow : Adw.ApplicationWindow {
|
||||
valign: start;
|
||||
column-spacing: 12;
|
||||
row-spacing: 12;
|
||||
margin-top: 15;
|
||||
margin-bottom: 15;
|
||||
margin-start: 15;
|
||||
margin-end: 15;
|
||||
margin-top: 16;
|
||||
margin-bottom: 16;
|
||||
margin-start: 16;
|
||||
margin-end: 16;
|
||||
selection-mode: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@ Icon=@APP_ID@
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=GNOME;GTK;Game;
|
||||
Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;
|
||||
Keywords=gaming;launcher;steam;lutris;heroic;bottles;itch;
|
||||
StartupNotify=true
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist gettext-domain="cartridges">
|
||||
|
||||
<schema id="@APP_ID@" path="@PREFIX@/">
|
||||
<key name="exit-after-launch" type="b">
|
||||
<default>false</default>
|
||||
@@ -11,14 +10,11 @@
|
||||
<key name="high-quality-images" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<key name="remove-missing" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="steam" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="steam-location" type="s">
|
||||
<default>"~/.steam/steam"</default>
|
||||
<default>"~/.steam/"</default>
|
||||
</key>
|
||||
<key name="lutris" type="b">
|
||||
<default>true</default>
|
||||
@@ -47,9 +43,6 @@
|
||||
<key name="heroic-import-gog" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-amazon" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-sideload" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
@@ -71,20 +64,11 @@
|
||||
<key name="legendary-location" type="s">
|
||||
<default>"~/.config/legendary/"</default>
|
||||
</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">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="flatpak-location" type="s">
|
||||
<default>"/var/lib/flatpak/"</default>
|
||||
<default>"/var/lib/flatpak/exports/"</default>
|
||||
</key>
|
||||
<key name="flatpak-import-launchers" type="b">
|
||||
<default>false</default>
|
||||
@@ -101,11 +85,7 @@
|
||||
<key name="sgdb-animated" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<key name="library-rows" type="u">
|
||||
<default>0</default>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<schema id="@APP_ID@.State" path="@PREFIX@/State/">
|
||||
<key name="width" type="i">
|
||||
<default>1110</default>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>@APP_ID@</id>
|
||||
<id>@APP_ID@.desktop</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0-or-later</project_license>
|
||||
<name>Cartridges</name>
|
||||
@@ -44,47 +44,12 @@
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1" />
|
||||
<releases>
|
||||
<release version="2.3" date="2023-08-29">
|
||||
<release version="1.5.6" date="2023-06-19">
|
||||
<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">
|
||||
<description translatable="no">
|
||||
<p>After months of work, Cartridges 2.0 is here:</p>
|
||||
<ul>
|
||||
<li>New import source: Legendary</li>
|
||||
<li>New import source: Flatpak</li>
|
||||
<li>Importing games should be much quicker</li>
|
||||
<li>Error handling has been improved</li>
|
||||
<li>Various UX improvements</li>
|
||||
<li>Fixes an issue with importing Bottles games without covers</li>
|
||||
<li>Translations since 1.5</li>
|
||||
</ul>
|
||||
<p>Thanks to the new import backend, adding new sources is much easier and a lot more are coming soon!</p>
|
||||
</description>
|
||||
</release>
|
||||
<release version="1.5" date="2023-05-23">
|
||||
|
||||
|
Before Width: | Height: | Size: 623 KiB After Width: | Height: | Size: 683 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -49,9 +49,9 @@ Stored as a string.
|
||||
|
||||
### source
|
||||
|
||||
A unique ID for the source of the game in lowercase, without spaces or underscores.
|
||||
A unique ID for the source of the game in lowercase, without spaces.
|
||||
|
||||
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.
|
||||
If a source provides multiple internal sources, these should be separately labeled, but share a common prefix. eg. `heoic_gog`, `heroic_epic`.
|
||||
|
||||
Stored as a string.
|
||||
|
||||
|
||||
@@ -11,14 +11,12 @@
|
||||
"--device=dri",
|
||||
"--socket=wayland",
|
||||
"--talk-name=org.freedesktop.Flatpak",
|
||||
"--filesystem=host",
|
||||
"--filesystem=host:ro",
|
||||
"--filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam/:ro",
|
||||
"--filesystem=~/.var/app/net.lutris.Lutris/: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/io.itch.itch/config/itch/:ro",
|
||||
"--filesystem=~/.var/app/org.libretro.RetroArch/config/retroarch/:ro",
|
||||
"--filesystem=/var/lib/flatpak:ro"
|
||||
],
|
||||
"cleanup" : [
|
||||
@@ -99,6 +97,20 @@
|
||||
"sha256": "bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "python3-pyxdg",
|
||||
"buildsystem": "simple",
|
||||
"build-commands": [
|
||||
"pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"pyxdg\" --no-build-isolation"
|
||||
],
|
||||
"sources": [
|
||||
{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/e5/8d/cf41b66a8110670e3ad03dab9b759704eeed07fa96e90fdc0357b2ba70e2/pyxdg-0.28-py2.py3-none-any.whl",
|
||||
"sha256": "bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
12
meson.build
@@ -1,5 +1,5 @@
|
||||
project('cartridges',
|
||||
version: '2.3',
|
||||
version: '1.5.6',
|
||||
meson_version: '>= 0.59.0',
|
||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||
)
|
||||
@@ -33,9 +33,13 @@ subdir('data')
|
||||
subdir('src')
|
||||
subdir('po')
|
||||
|
||||
if host_machine.system() == 'windows'
|
||||
subdir('windows')
|
||||
endif
|
||||
configure_file(
|
||||
input: './windows/Cartridges.iss.in',
|
||||
output: 'Cartridges.iss',
|
||||
configuration: conf,
|
||||
install: true,
|
||||
install_dir: '.'
|
||||
)
|
||||
|
||||
gnome.post_install(
|
||||
glib_compile_schemas: true,
|
||||
|
||||
@@ -19,4 +19,3 @@ pl
|
||||
sv
|
||||
tr
|
||||
el
|
||||
cs
|
||||
|
||||
@@ -15,7 +15,5 @@ src/game.py
|
||||
src/preferences.py
|
||||
|
||||
src/utils/create_dialog.py
|
||||
src/importer/importer.py
|
||||
src/importer/sources/source.py
|
||||
src/importer/sources/location.py
|
||||
src/store/managers/sgdb_manager.py
|
||||
374
po/ar.po
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-27 14:03+0200\n"
|
||||
"PO-Revision-Date: 2023-08-29 10:45+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-26 18:10+0000\n"
|
||||
"Last-Translator: Ali Aljishi <ahj696@hotmail.com>\n"
|
||||
"Language-Team: Arabic <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/ar/>\n"
|
||||
@@ -18,11 +18,11 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"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"
|
||||
"X-Generator: Weblate 5.0.1-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:176
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "خراطيش"
|
||||
|
||||
@@ -36,10 +36,8 @@ 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 ""
|
||||
"لعب;مشغل;ستيم;لوترس;هروك;قوارير;إتش;هيرويك;بوتلز;لجندري;فلاتباك;رتروآرتش;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "لعب;مشغل;ستيم;لوترس;هروك;قوارير;إتش;هيرويك;بوتلز;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -56,18 +54,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "المكتبة"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:71
|
||||
msgid "Game Details"
|
||||
msgstr "تفاصيل اللعبة"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:430
|
||||
#: src/details_window.py:265 src/importer/importer.py:301
|
||||
#: src/importer/importer.py:352
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "التفضيلات"
|
||||
|
||||
@@ -75,31 +71,40 @@ msgstr "التفضيلات"
|
||||
msgid "Cancel"
|
||||
msgstr "ألغِ"
|
||||
|
||||
#: data/gtk/details-window.blp:58
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "غلاف جديد"
|
||||
|
||||
#: data/gtk/details-window.blp:77
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "احذف الغلاف"
|
||||
|
||||
#: data/gtk/details-window.blp:105 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "العنوان"
|
||||
|
||||
#: data/gtk/details-window.blp:109
|
||||
msgid "Developer (optional)"
|
||||
msgstr "المطوِّر (اختياري)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "عنوان اللعبة"
|
||||
|
||||
#: data/gtk/details-window.blp:115
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "ملفُّ التنفيذ"
|
||||
|
||||
#: data/gtk/details-window.blp:121
|
||||
msgid "Select File"
|
||||
msgstr "اختر ملفًّا"
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "الملفُّ المفتوح أو الأمر المشغَّل عند بدء اللعبة"
|
||||
|
||||
#: data/gtk/details-window.blp:132
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "معلومات أكثر"
|
||||
|
||||
@@ -107,16 +112,16 @@ msgstr "معلومات أكثر"
|
||||
msgid "Edit"
|
||||
msgstr "حرِّر"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:190
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "أخفِ"
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:215
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr "أزل"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:192
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "اكشف"
|
||||
|
||||
@@ -128,8 +133,8 @@ msgstr "عام"
|
||||
msgid "Quit"
|
||||
msgstr "أنهِ"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:226 data/gtk/window.blp:269
|
||||
#: data/gtk/window.blp:336
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "ابحث"
|
||||
|
||||
@@ -141,8 +146,7 @@ msgstr "أظهر التفضيلات"
|
||||
msgid "Shortcuts"
|
||||
msgstr "الاختصارات"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:124
|
||||
#: src/importer/importer.py:376
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "تراجع"
|
||||
|
||||
@@ -170,8 +174,7 @@ msgstr "أظهر الألعاب المخفية"
|
||||
msgid "Remove game"
|
||||
msgstr "أزل اللعبة"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:88
|
||||
#: data/gtk/preferences.blp:339
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "السلوك"
|
||||
|
||||
@@ -187,7 +190,7 @@ msgstr "تبدأ صورة الغلاف اللعبة"
|
||||
msgid "Swaps the behavior of the cover image and the play button"
|
||||
msgstr "يبدِّل سلوك صورة الغلاف وزرِّ «العب»"
|
||||
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:85
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr "الصور"
|
||||
|
||||
@@ -207,118 +210,93 @@ msgstr "منطقة خطر"
|
||||
msgid "Remove All Games"
|
||||
msgstr "أزل كلَّ الألعاب"
|
||||
|
||||
#: data/gtk/preferences.blp:84 data/gtk/window.blp:27 data/gtk/window.blp:456
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "استورد"
|
||||
|
||||
#: data/gtk/preferences.blp:91
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "أزل الألعاب المحذوفة"
|
||||
|
||||
#: data/gtk/preferences.blp:101
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "المصادر"
|
||||
|
||||
#: data/gtk/preferences.blp:104
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "ستيم"
|
||||
|
||||
#: data/gtk/preferences.blp:108 data/gtk/preferences.blp:125
|
||||
#: data/gtk/preferences.blp:172 data/gtk/preferences.blp:225
|
||||
#: data/gtk/preferences.blp:242 data/gtk/preferences.blp:259
|
||||
#: data/gtk/preferences.blp:276 data/gtk/preferences.blp:293
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "موضع التثبيت"
|
||||
msgstr "موضع تثبيت إتش"
|
||||
|
||||
#: data/gtk/preferences.blp:121
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "لوترس"
|
||||
|
||||
#: data/gtk/preferences.blp:137
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "موضع الذاكرة المؤقتة"
|
||||
msgstr "موضع ذكرة لوترس المؤقَّتة"
|
||||
|
||||
#: data/gtk/preferences.blp:149
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "استورد ألعابًا من ستيم"
|
||||
|
||||
#: data/gtk/preferences.blp:158
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "استورد ألعاب فلاتباك"
|
||||
|
||||
#: data/gtk/preferences.blp:168
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "هِرُوِك"
|
||||
|
||||
#: data/gtk/preferences.blp:184
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "استورد ألعاب أَبِك"
|
||||
|
||||
#: data/gtk/preferences.blp:193
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "استورد ألعاب جيأوجي"
|
||||
|
||||
#: data/gtk/preferences.blp:202
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "استورد ألعابًا من أمازون"
|
||||
|
||||
#: data/gtk/preferences.blp:211
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "استورد ألعابًا مثبَّتةً بغير متجر"
|
||||
|
||||
#: data/gtk/preferences.blp:221
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "قوارير"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "إتش"
|
||||
|
||||
#: data/gtk/preferences.blp:255
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "لجندري"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:272
|
||||
msgid "RetroArch"
|
||||
msgstr "رتروآرتش"
|
||||
|
||||
#: data/gtk/preferences.blp:289
|
||||
msgid "Flatpak"
|
||||
msgstr "فلاتباك"
|
||||
|
||||
#: data/gtk/preferences.blp:305
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "استورد مشغِّلات ألعاب"
|
||||
|
||||
#: data/gtk/preferences.blp:315
|
||||
msgid "Desktop Entries"
|
||||
msgstr "مدخلات سطح المكتب"
|
||||
|
||||
#: data/gtk/preferences.blp:327
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:331
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "الاستيثاق"
|
||||
|
||||
#: data/gtk/preferences.blp:334
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "مفتاح واجهة البرمجة"
|
||||
|
||||
#: data/gtk/preferences.blp:342
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "استخدم SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:343
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "نزِّل الصور حينما تنزِّل أو تستورد الألعاب"
|
||||
|
||||
#: data/gtk/preferences.blp:352
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "فضِّلها على الصور الرسمية"
|
||||
|
||||
#: data/gtk/preferences.blp:361
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "فضِّل الصور المتحرِّكة"
|
||||
|
||||
@@ -346,7 +324,7 @@ msgstr "لا توجد ألعاب مخفية"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "هنا يظهر ما أخفيت من ألعاب."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "عد"
|
||||
|
||||
@@ -358,118 +336,106 @@ msgstr "عنوان اللعبة"
|
||||
msgid "Play"
|
||||
msgstr "العب"
|
||||
|
||||
#: data/gtk/window.blp:255 data/gtk/window.blp:449
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "أضف لعبةً"
|
||||
|
||||
#: data/gtk/window.blp:262 data/gtk/window.blp:329
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "القائمة الرئيسة"
|
||||
|
||||
#: data/gtk/window.blp:284
|
||||
msgid "Search games"
|
||||
msgstr "ابحث عن ألعاب"
|
||||
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "الألعاب المخفية"
|
||||
|
||||
#: data/gtk/window.blp:351
|
||||
msgid "Search hidden games"
|
||||
msgstr "ابحث في الألعاب المخفية"
|
||||
|
||||
#: data/gtk/window.blp:388
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "رتِّب"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "أ-ي"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "ي-أ"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "الأجدد"
|
||||
|
||||
#: data/gtk/window.blp:409
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "الأقدم"
|
||||
|
||||
#: data/gtk/window.blp:415
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "لُعبت آخر مرَّة"
|
||||
|
||||
#: data/gtk/window.blp:422
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "أظهر ما أخفي"
|
||||
|
||||
#: data/gtk/window.blp:435
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "اختصارات لوحة المفاتيح"
|
||||
|
||||
#: data/gtk/window.blp:440
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "عن «خراطيش»"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:195
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Ali Aljishi <ahj696@hotmail.com>"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:213
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "أضيفت في: {}"
|
||||
|
||||
#: src/window.py:216
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "أبدًا"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:220
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "لُعبت آخر مرَّة في: {}"
|
||||
|
||||
#: src/details_window.py:76
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr "طبِّق"
|
||||
|
||||
#: src/details_window.py:82
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "أضف لعبةً جديدةً"
|
||||
|
||||
#: src/details_window.py:83
|
||||
msgid "Add"
|
||||
msgstr "أضف"
|
||||
|
||||
#: src/details_window.py:93
|
||||
msgid "Executables"
|
||||
msgstr "ملفات التنفيذ"
|
||||
#: src/details_window.py:79
|
||||
msgid "Confirm"
|
||||
msgstr "أكِّد"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:108
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "ملف.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:110
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "البرنامج"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:115 src/details_window.py:117
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\المسار\\إلى\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:121 src/details_window.py:123
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/المسار/إلى/{}"
|
||||
|
||||
#: src/details_window.py:128
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -491,19 +457,19 @@ msgstr ""
|
||||
"\n"
|
||||
"ولا تنسَ إحاطة المسار بعلامتي تنصيص مزدوجتين حالما تضمَّن مسافات!"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:177
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "تعذَّرت إضافة اللعبة"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:207
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "لا يجوز كون عنوان اللعبة فارغًا."
|
||||
|
||||
#: src/details_window.py:177 src/details_window.py:215
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "لا يجوز كون ملفِّ التنفيذ فارغًا."
|
||||
|
||||
#: src/details_window.py:206 src/details_window.py:214
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "تعذَّر تطبيق التفضيلات"
|
||||
|
||||
@@ -513,124 +479,68 @@ msgid "{} launched"
|
||||
msgstr "بُدئت {}"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "أٌخفيت {}"
|
||||
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "أٌظهرت {}"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:172 src/importer/importer.py:373
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "أزيلت {}"
|
||||
|
||||
#: src/preferences.py:123
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "أُزيلت كلُّ الألعاب"
|
||||
|
||||
#: src/preferences.py:172
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"تحتاج مفتاح واجهة برمجة حال ما أردت استخدام SteamGridDB، {}هنا تولِّده{}."
|
||||
|
||||
#: src/preferences.py:293
|
||||
msgid "Installation Not Found"
|
||||
msgstr "لم يُعثر على التثبيت"
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Select a valid directory."
|
||||
msgstr "حدِّد مجلَّدًا صالحًا."
|
||||
|
||||
#: src/preferences.py:330 src/importer/importer.py:299
|
||||
msgid "Warning"
|
||||
msgstr "تحذير"
|
||||
|
||||
#: src/preferences.py:364
|
||||
msgid "Invalid Directory"
|
||||
msgstr "مجلَّد غير صالح"
|
||||
|
||||
#: src/preferences.py:370
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "عيِّن الموضع"
|
||||
|
||||
#: src/utils/create_dialog.py:33 src/importer/importer.py:300
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "تجاهل"
|
||||
|
||||
#: src/importer/importer.py:137
|
||||
msgid "Importing Games…"
|
||||
msgstr "تُستورد الألعاب…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:320
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "طرأ هذا الخطأ أثناء الاستيراد:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:349
|
||||
msgid "No new games found"
|
||||
msgstr "لم يُعثر على ألعاب جديدة"
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "أكِّد"
|
||||
|
||||
#: src/importer/importer.py:361
|
||||
msgid "1 game imported"
|
||||
msgstr "اُستوردت لعبة واحدة"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:365
|
||||
msgid "{} games imported"
|
||||
msgstr "اُستوردت {} لعبة"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:369
|
||||
msgid "1 removed"
|
||||
msgstr "أزيل ١"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "حدِّد مجلَّد ذاكرة {} المؤقتة."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "حدِّد مجلَّد ضبط {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "حدِّد مجلَّد بيانات {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "تعذَّر استيثاق SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "تعذَّر الاتصال ب SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
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
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "تعذَّر العثور على مجلَّد ستيم."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "أكِّد"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "موضع تثبيت ستيم"
|
||||
@@ -656,9 +566,30 @@ msgstr "أكِّد مفتاح واجهة البرمجة في التفضيلات"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "حدِّد مجلَّد ذاكرة لوترس المؤقَّتة."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "لم يُعثر على التثبيت"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "حدِّد مجلَّد ضبط {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ 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"
|
||||
#~ msgstr "المجلَّد المستخدم عند استيراد الألعاب"
|
||||
|
||||
@@ -764,6 +695,9 @@ msgstr "أكِّد مفتاح واجهة البرمجة في التفضيلات"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "لم يُعثر على ألعاب جديدة في مكتبة ستيم."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "تعذَّر العثور على مجلَّد ستيم."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "يُتواصل مع ستيم"
|
||||
|
||||
|
||||
@@ -8,18 +8,18 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-27 14:03+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 22:22+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:176
|
||||
#: src/main.py:153
|
||||
msgid "Cartridges"
|
||||
msgstr ""
|
||||
|
||||
@@ -33,8 +33,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;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -49,18 +48,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:71
|
||||
msgid "Game Details"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:430
|
||||
#: src/details_window.py:265 src/importer/importer.py:301
|
||||
#: src/importer/importer.py:352
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr ""
|
||||
|
||||
@@ -68,31 +65,40 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:58
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:77
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:105 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:109
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:115
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:121
|
||||
msgid "Select File"
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:132
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -100,16 +106,16 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:190
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:215
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:192
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr ""
|
||||
|
||||
@@ -121,8 +127,8 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:226 data/gtk/window.blp:269
|
||||
#: data/gtk/window.blp:336
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
@@ -134,8 +140,7 @@ msgstr ""
|
||||
msgid "Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:124
|
||||
#: src/importer/importer.py:376
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr ""
|
||||
|
||||
@@ -163,8 +168,7 @@ msgstr ""
|
||||
msgid "Remove game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:88
|
||||
#: data/gtk/preferences.blp:339
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr ""
|
||||
|
||||
@@ -180,7 +184,7 @@ msgstr ""
|
||||
msgid "Swaps the behavior of the cover image and the play button"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:85
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr ""
|
||||
|
||||
@@ -200,118 +204,89 @@ msgstr ""
|
||||
msgid "Remove All Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:84 data/gtk/window.blp:27 data/gtk/window.blp:456
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:91
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:101
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:104
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:108 data/gtk/preferences.blp:125
|
||||
#: data/gtk/preferences.blp:172 data/gtk/preferences.blp:225
|
||||
#: data/gtk/preferences.blp:242 data/gtk/preferences.blp:259
|
||||
#: data/gtk/preferences.blp:276 data/gtk/preferences.blp:293
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
msgid "Install Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:121
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:137
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Cache Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:149
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:158
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:168
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:184
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:193
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:202
|
||||
msgid "Import Amazon Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:211
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:221
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:255
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:272
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:289
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:305
|
||||
msgid "Import Game Launchers"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:315
|
||||
msgid "Desktop Entries"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:327
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:331
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:334
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:342
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:343
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:352
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:361
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr ""
|
||||
|
||||
@@ -339,7 +314,7 @@ msgstr ""
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
@@ -351,118 +326,106 @@ msgstr ""
|
||||
msgid "Play"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:255 data/gtk/window.blp:449
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:262 data/gtk/window.blp:329
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:284
|
||||
msgid "Search games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:351
|
||||
msgid "Search hidden games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:388
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:409
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:415
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:422
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:435
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:440
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:195
|
||||
#: src/main.py:171
|
||||
msgid "translator_credits"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:213
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr ""
|
||||
|
||||
#: src/window.py:216
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:220
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:76
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:82
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:83
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:93
|
||||
msgid "Executables"
|
||||
#: src/details_window.py:79
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:108
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr ""
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:110
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:115 src/details_window.py:117
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:121 src/details_window.py:123
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:128
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -475,19 +438,19 @@ msgid ""
|
||||
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:177
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:207
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:177 src/details_window.py:215
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:206 src/details_window.py:214
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr ""
|
||||
|
||||
@@ -497,98 +460,39 @@ msgid "{} launched"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr ""
|
||||
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:172 src/importer/importer.py:373
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:123
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:172
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:293
|
||||
msgid "Installation Not Found"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Select a valid directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:330 src/importer/importer.py:299
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:364
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:370
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr ""
|
||||
|
||||
#: src/utils/create_dialog.py:33 src/importer/importer.py:300
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:137
|
||||
msgid "Importing Games…"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:320
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:349
|
||||
msgid "No new games found"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:361
|
||||
msgid "1 game imported"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:365
|
||||
msgid "{} games imported"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:369
|
||||
msgid "1 removed"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
629
po/cs.po
@@ -1,629 +0,0 @@
|
||||
# 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-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-05 08:07+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.0-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
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
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr "hraní;spouštěč;steam;lutris;heroic;láhve;itch;flatpak;legendary;"
|
||||
|
||||
#: 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:30
|
||||
msgid "Library"
|
||||
msgstr "Knihovna"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Upravit podrobnosti o hře"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Podrobnosti o hře"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
msgid "Preferences"
|
||||
msgstr "Předvolby"
|
||||
|
||||
#: data/gtk/details-window.blp:25
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušit"
|
||||
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "Nový obal"
|
||||
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "Odstranit obal"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Název"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Vývojář nebo vydavatel (nepovinné)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
msgid "Executable"
|
||||
msgstr "Spustitelný soubor"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
msgid "More Info"
|
||||
msgstr "Více informací"
|
||||
|
||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
||||
msgid "Edit"
|
||||
msgstr "Upravit"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
msgid "Hide"
|
||||
msgstr "Skrýt"
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
msgid "Unhide"
|
||||
msgstr "Odkrýt"
|
||||
|
||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
||||
msgid "General"
|
||||
msgstr "Obecné"
|
||||
|
||||
#: data/gtk/help-overlay.blp:14
|
||||
msgid "Quit"
|
||||
msgstr "Ukončit"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
msgid "Search"
|
||||
msgstr "Vyhledávání"
|
||||
|
||||
#: data/gtk/help-overlay.blp:24
|
||||
msgid "Show preferences"
|
||||
msgstr "Zobrazit předvolby"
|
||||
|
||||
#: data/gtk/help-overlay.blp:29
|
||||
msgid "Shortcuts"
|
||||
msgstr "Zkratky"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
msgid "Undo"
|
||||
msgstr "Zpět"
|
||||
|
||||
#: data/gtk/help-overlay.blp:39
|
||||
msgid "Open menu"
|
||||
msgstr "Otevřít nabídku"
|
||||
|
||||
#: data/gtk/help-overlay.blp:45
|
||||
msgid "Games"
|
||||
msgstr "Hry"
|
||||
|
||||
#: data/gtk/help-overlay.blp:48
|
||||
msgid "Add new game"
|
||||
msgstr "Přidat novou hru"
|
||||
|
||||
#: data/gtk/help-overlay.blp:53
|
||||
msgid "Import games"
|
||||
msgstr "Importovat hry"
|
||||
|
||||
#: data/gtk/help-overlay.blp:58
|
||||
msgid "Show hidden games"
|
||||
msgstr "Zobrazit skryté hry"
|
||||
|
||||
#: data/gtk/help-overlay.blp:63
|
||||
msgid "Remove game"
|
||||
msgstr "Odstranit hru"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
msgid "Behavior"
|
||||
msgstr "Chování"
|
||||
|
||||
#: data/gtk/preferences.blp:16
|
||||
msgid "Exit After Launching Games"
|
||||
msgstr "Ukončit po spuštění her"
|
||||
|
||||
#: data/gtk/preferences.blp:25
|
||||
msgid "Cover Image Launches Game"
|
||||
msgstr "Obrázek na obálce spouští hru"
|
||||
|
||||
#: data/gtk/preferences.blp:26
|
||||
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:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr "Obrázky"
|
||||
|
||||
#: data/gtk/preferences.blp:39
|
||||
msgid "High Quality Images"
|
||||
msgstr "Vysoce kvalitní obrázky"
|
||||
|
||||
#: data/gtk/preferences.blp:40
|
||||
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:50
|
||||
msgid "Danger Zone"
|
||||
msgstr "Nebezpečná zóna"
|
||||
|
||||
#: data/gtk/preferences.blp:53
|
||||
msgid "Remove All Games"
|
||||
msgstr "Odstranit všechny hry"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
msgid "Import"
|
||||
msgstr "Import"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Odstranit všechny hry"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
msgid "Sources"
|
||||
msgstr "Zdroje"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
msgid "Install Location"
|
||||
msgstr "Umístění instalace"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
msgid "Cache Location"
|
||||
msgstr "Umístění dočasných souborů"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importovat Steam hry"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importovat Flatpak hry"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importovat Epic Games hry"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importovat GOG hry"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importovat Amazon hry"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importovat ručně načtené hry"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
msgid "Bottles"
|
||||
msgstr "Láhve"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importovat spouštěče her"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
msgid "Authentication"
|
||||
msgstr "Ověření"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
msgid "API Key"
|
||||
msgstr "Klíč API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Používat SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
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:317
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Upřednostnit před oficiálními obrázky"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Upřednostnit animované obrázky"
|
||||
|
||||
#: 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:64 data/gtk/window.blp:305
|
||||
msgid "Back"
|
||||
msgstr "Zpět"
|
||||
|
||||
#: data/gtk/window.blp:121
|
||||
msgid "Game Title"
|
||||
msgstr "Název hry"
|
||||
|
||||
#: data/gtk/window.blp:176
|
||||
msgid "Play"
|
||||
msgstr "Hrát"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
msgid "Add Game"
|
||||
msgstr "Přidat hru"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
msgid "Main Menu"
|
||||
msgstr "Hlavní nabídka"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Vyhledávání"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
msgid "Hidden Games"
|
||||
msgstr "Skryté hry"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Zobrazit skryté hry"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
msgid "Sort"
|
||||
msgstr "Třídit"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
msgid "A-Z"
|
||||
msgstr "A-Ž"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
msgid "Z-A"
|
||||
msgstr "Ž-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
msgid "Newest"
|
||||
msgstr "Nejnovější"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
msgid "Oldest"
|
||||
msgstr "Nejstarší"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
msgid "Last Played"
|
||||
msgstr "Naposledy hráno"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
msgid "Show Hidden"
|
||||
msgstr "Zobrazit Skryté"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Klávesové zkratky"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
msgid "About Cartridges"
|
||||
msgstr "O Kazetách"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
msgid "translator_credits"
|
||||
msgstr "ooo.i.love.foo"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
msgid "Added: {}"
|
||||
msgstr "Přidáno: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
msgid "Never"
|
||||
msgstr "Nikdy"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
msgid "Last played: {}"
|
||||
msgstr "Naposledy hráno: {}"
|
||||
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr "Použít"
|
||||
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "Přidat novou hru"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
msgid "file.txt"
|
||||
msgstr "soubor.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\cesta\\k\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/cesta/k/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
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!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Nelze přidat hru"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Název hry nemůže být prázdný."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Spustitelný soubor nemůže být prázdný."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Nelze použít předvolby"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
msgid "{} launched"
|
||||
msgstr "{} spuštěno"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
msgid "{} hidden"
|
||||
msgstr "{} skryto"
|
||||
|
||||
#: src/game.py:153
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} odkryto"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
msgid "{} removed"
|
||||
msgstr "{} odstraněno"
|
||||
|
||||
#: src/preferences.py:119
|
||||
msgid "All games removed"
|
||||
msgstr "Všechny hry odstraněny"
|
||||
|
||||
#: src/preferences.py:168
|
||||
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{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Instalace nebyla nalezena"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Vyberte platný adresář."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Neplatný adresář"
|
||||
|
||||
#: src/preferences.py:357
|
||||
msgid "Set Location"
|
||||
msgstr "Nastavit umístění"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
msgid "Dismiss"
|
||||
msgstr "Zahodit"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
#, fuzzy
|
||||
#| msgid "Import Epic Games"
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importovat Epic Games hry"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#, fuzzy
|
||||
#| msgid "No Games Found"
|
||||
msgid "No new games found"
|
||||
msgstr "Nebyly nalezeny žádné hry"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
#, fuzzy
|
||||
#| msgid "All games removed"
|
||||
msgid "1 game imported"
|
||||
msgstr "Všechny hry odstraněny"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
#, fuzzy
|
||||
#| msgid "All games removed"
|
||||
msgid "{} games imported"
|
||||
msgstr "Všechny hry odstraněny"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} odstraněno"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Vyberte adresář {} mezipaměti."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Vyberte konfigurační adresář {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Vyberte datový adresář {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Nelze ověřit SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Ověřte váš klíč API v předvolbách"
|
||||
|
||||
#~ 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"
|
||||
372
po/de.po
@@ -4,14 +4,13 @@
|
||||
# Jummit <jummit@web.de>, 2023.
|
||||
# WebSnke <websnke@tutanota.com>, 2023.
|
||||
# Ettore Atalan <atalanttore@googlemail.com>, 2023.
|
||||
# Simon Hahne <simonhahne@web.de>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-05 08:07+0000\n"
|
||||
"Last-Translator: Simon Hahne <simonhahne@web.de>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-04-17 17:20+0000\n"
|
||||
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/de/>\n"
|
||||
"Language: de\n"
|
||||
@@ -19,11 +18,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.17\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -37,11 +36,8 @@ msgid "Launch all your games"
|
||||
msgstr "Starte all deine Spiele"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr "spiel;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +55,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliothek"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Spieldetails"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
@@ -80,35 +74,46 @@ msgstr "Abbrechen"
|
||||
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "Neues Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "Cover löschen"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Der Titel des Spiels"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Ausführbare Datei"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Datei zum Öffnen oder Befehl zum Starten des Spiels"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Weitere Informationen"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Verstecken"
|
||||
|
||||
@@ -117,7 +122,7 @@ msgstr "Verstecken"
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Unverstecken"
|
||||
|
||||
@@ -130,7 +135,7 @@ msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Suchen"
|
||||
|
||||
@@ -142,8 +147,7 @@ msgstr "Einstellungen anzeigen"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Kürzel"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Rückgängig"
|
||||
|
||||
@@ -171,8 +175,7 @@ msgstr "Ausgeblendete Spiele anzeigen"
|
||||
msgid "Remove game"
|
||||
msgstr "Spiel entfernen"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Verhalten"
|
||||
|
||||
@@ -208,116 +211,93 @@ msgstr "Gefahrenzone"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Alle Spiele entfernen"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Alle Spiele entfernen"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Quellen"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Installationsort"
|
||||
msgstr "itch-Installationsort"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Cache-Speicherort"
|
||||
msgstr "Lutris-Cacheort"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Steam-Spiele importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Flatpak-Spiele importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Epic Games importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "GOG-Spiele importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Amazon-Spiele importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Sideloaded-Spiele importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Spiele-Launcher importieren"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Authentifizierung"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API-Schlüssel"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "SteamGridDB benutzen"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Lade Bilder herunter, wenn Spiele hinzugefügt oder importiert werden"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Über offizielien Images bevorzugen"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Animierte Bilder bevorzugen"
|
||||
|
||||
@@ -345,7 +325,7 @@ msgstr "Keine versteckten Spiele"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Ausgeblendete Spiele, werden hier angezeigt."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
|
||||
@@ -357,82 +337,70 @@ msgstr "Spieltitel"
|
||||
msgid "Play"
|
||||
msgstr "Spielen"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Spiel hinzufügen"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Hauptmenü"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Suchen"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Ausgeblendete Spiele"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Ausgeblendete Spiele anzeigen"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sortierung"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Neuestes"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Älteste"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Zuletzt gespielt"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Ausgeblendete anzeigen"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Tastaturkürzel"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Über Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Feliks Weber"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Hinzugefügt: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nie"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Zuletzt gespielt: {}"
|
||||
|
||||
@@ -445,30 +413,30 @@ msgid "Add New Game"
|
||||
msgstr "Neues Spiel hinzufügen"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Bestätigen"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "datei.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "Programm"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\pfad\\zu\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/pfad/zu/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -491,163 +459,91 @@ msgstr ""
|
||||
"Falls der Pfad Leerzeichen enthält, stelle sicher ihn in doppelte "
|
||||
"Anführungszeichen zu setzen!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Konnte Spiel nicht hinzufügen"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Spieltitel kann nicht leer sein."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Ausführbare Datei darf nicht leer sein."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Einstellungen konnten nicht angewendet werden"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} gestartet"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} versteckt"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} unversteckt"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} entfernt"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Alle Spiele entfernt"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Für die Nutzung von SteamGridDB ist ein API-Schlüssel erforderlich. Sie "
|
||||
"können ihn {}hier{} generieren."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Installation nicht gefunden"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Wähle ein gültiges Verzeichnis aus."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Ungültiges Verzeichnis"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Ort festlegen"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Verstanden"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Spiele werden importiert…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "No Games Found"
|
||||
msgid "No new games found"
|
||||
msgstr "Keine Spiele gefunden"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Bestätigen"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Game Imported"
|
||||
msgid "1 game imported"
|
||||
msgstr "Spiel Importiert"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
#, fuzzy
|
||||
#| msgid "Games Imported"
|
||||
msgid "{} games imported"
|
||||
msgstr "Spiele importiert"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} entfernt"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Wähle das Cache-Verzeichnis von {} aus."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} configuration directory."
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Wähle das Konfigurationsverzeichnis von {} aus."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Wähle das Datenverzeichnis von {} aus."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Verbindung zu SteamGridDB konnte nicht hergestellt werden"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifiziere deinen API-Schlüssel in den Einstellungen"
|
||||
|
||||
#~ 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
|
||||
#~| msgid "Cache Not Found"
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Cache nicht gefunden"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Bestätigen"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam-Installationsort"
|
||||
@@ -667,12 +563,42 @@ msgstr "Verifiziere deinen API-Schlüssel in den Einstellungen"
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Gestern"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Cache nicht gefunden"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Wähle das Lutris-Cache-Verzeichnis aus."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Installation nicht gefunden"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Wähle das Konfigurationsverzeichnis von {} aus."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Wähle das Datenverzeichnis von {} 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"
|
||||
#~ msgstr "Verzeichnis, das beim Importieren von Spielen verwendet wird"
|
||||
|
||||
|
||||
347
po/el.po
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-29 18:48+0000\n"
|
||||
"Last-Translator: yiannis ioannides <sub@wai.ai>\n"
|
||||
"Language-Team: Greek <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -20,7 +20,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Κασέτες"
|
||||
|
||||
@@ -34,10 +34,7 @@ msgid "Launch all your games"
|
||||
msgstr "Εκκινήστε όλα σας τα παιχνίδια"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;εκκινητής;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -57,18 +54,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Βιβλιοθήκη"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Λεπτομέρειες Παιχνιδιού"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Προτιμήσεις"
|
||||
|
||||
@@ -84,21 +79,33 @@ msgstr "Νέο Εξώφυλλο"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Διαγραφή Εξώφυλλου"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Τίτλος"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Τίτλος Παιχνιδιού"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Προγραμματιστής"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "Προγραμματιστής ή Εκδότης (προαιρετικό)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Πρόγραμμα"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
"Αρχείο προς άνοιγμα ή εντολή προς εκτέλεση κατά την εκκίνηση παιχνιδιού"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Περισσότερες Πληροφορίες"
|
||||
|
||||
@@ -106,7 +113,7 @@ msgstr "Περισσότερες Πληροφορίες"
|
||||
msgid "Edit"
|
||||
msgstr "Επεξεργασία"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Απόκρυψη"
|
||||
|
||||
@@ -115,7 +122,7 @@ msgstr "Απόκρυψη"
|
||||
msgid "Remove"
|
||||
msgstr "Αφαίρεση"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Φανέρωση"
|
||||
|
||||
@@ -128,7 +135,7 @@ msgid "Quit"
|
||||
msgstr "Κλείσιμο"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Εύρεση"
|
||||
|
||||
@@ -140,8 +147,7 @@ msgstr "Εμφάνιση προτιμήσεων"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Συντομεύσεις"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Αναίρεση"
|
||||
|
||||
@@ -169,8 +175,7 @@ msgstr "Εμφάνιση κρυμμένων παιχνιδιών"
|
||||
msgid "Remove game"
|
||||
msgstr "Αφαίρεση παιχνιδιού"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Συμπεριφορά"
|
||||
|
||||
@@ -207,126 +212,93 @@ msgstr "Επικίνδυνη Ζώνη"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Αφαίρεση Όλων Των Παιχνιδιών"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Εισαγωγή"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Αφαίρεση Όλων Των Παιχνιδιών"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Πηγές"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Τοποθεσία Εγκατάστασης itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Τοποθεσία cache του Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών Epic"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Εισαγωγή Παιχνιδιών Μέσω Sideloading"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Πρόγραμμα Εκκίνησης Παιχνιδιών"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Επιβεβαίωση"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Κλειδί API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Χρήση SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Λήψη εικόνων κατά τη διάρκεια πρόσθεσης ή εισαγωγής παιχνιδιών"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Προτίμηση Επίσημων Εικόνων"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Προτίμηση Κινούμενων Εικόνων"
|
||||
|
||||
@@ -354,7 +326,7 @@ msgstr "Δεν υπάρχουν κρυφά παιχνίδια"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Τα παιχνίδια που κρύβετε θα εμφανίζονται εδώ."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Πίσω"
|
||||
|
||||
@@ -366,82 +338,70 @@ msgstr "Τίτλος παιχνιδιού"
|
||||
msgid "Play"
|
||||
msgstr "Παίξτε"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Προσθήκη παιχνιδιού"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Κύριο μενού"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Εύρεση"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Κρυμμένα παιχνίδια"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Εμφάνιση κρυμμένων παιχνιδιών"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Ταξινόμηση"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "Α-Ζ"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Ζ-Α"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Νεότερο"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Παλαιότερο"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Τελευταία αναπαραγωγή"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Εμφάνιση Κρυφών"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Συντομεύσεις Πληκτρολογίου"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Σχετικά με τις Κασέτες"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Yiannis Ioannides"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Προστέθηκε: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Ποτέ"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Τελευταία αναπαραγωγή: {}"
|
||||
|
||||
@@ -454,30 +414,30 @@ msgid "Add New Game"
|
||||
msgstr "Προσθήκη νέου παιχνιδιού"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Επιβεβαίωση"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "αρχειο.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "Πρόγραμμα"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\προς\\φάκελο\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/προς/φάκελο/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -501,163 +461,92 @@ msgstr ""
|
||||
"Αν η διεύθυνση φακέλου περιέχει κενά, φροντίστε να την περικλείσετε σε διπλά "
|
||||
"εισαγωγικά!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Αδυναμία προσθήκης παιχνιδιού"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Ο τίτλος παιχνιδιού δεν μπορεί να είναι κενός."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Η εφαρμογή δεν μπορεί να είναι κενή."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Αδυναμία Εφαρμογής Προτιμήσεων"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} εκκινήθη"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} αποκρύφθηκε"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} φανερώθηκε"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} αφαιρέθηκε"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Όλα τα παιχνίδια αφαιρέθηκαν"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Για τη χρήση του SteamGridDB απαιτείται ένα κλειδί API. Μπορείτε να "
|
||||
"δημιουργήσετε ένα {}εδώ{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
#, fuzzy
|
||||
#| msgid "Installation Not Found"
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Η εγκατάσταση δεν βρέθηκε"
|
||||
|
||||
#: src/preferences.py:296
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Ορίστε Τοποθεσία"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Απόρριψη"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Εισαγωγή παιχνιδιών…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Δεν βρέθηκαν νέα παιχνίδια"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 παιχνίδι εισήχθη"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} παιχνίδια εισήχθησαν"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} αφαιρέθηκε"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Επιβεβαίωση"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} configuration directory."
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Επιλέξτε τον κατάλογο διαμόρφωσης {}."
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Η σύνδεση στο SteamGridDB δεν μπόρεσε να πραγματοποιηθεί"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
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
|
||||
#~| msgid "Cache Not Found"
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Τα cache δεν βρέθηκαν"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Επιβεβαίωση"
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Τοποθεσία Εγκατάστασης Steam"
|
||||
|
||||
@@ -676,8 +565,32 @@ msgstr ""
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Χθες"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Τα cache δεν βρέθηκαν"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Επιλέξτε τη τοποθεσία cache του Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Η εγκατάσταση δεν βρέθηκε"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Επιλέξτε τον κατάλογο διαμόρφωσης {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Επιλέξτε τον κατάλογο δεδομένων {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Εισαγωγή παιχνιδιών…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Εισαγωγή εξώφυλλων…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Δεν βρέθηκαν νέα παιχνίδια"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 παιχνίδι εισήχθη"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} παιχνίδια εισήχθησαν"
|
||||
|
||||
407
po/es.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-27 14:03+0200\n"
|
||||
"PO-Revision-Date: 2023-08-29 10:45+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-28 10:11+0000\n"
|
||||
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
|
||||
"Language-Team: Spanish <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/es/>\n"
|
||||
@@ -18,11 +18,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.1-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:176
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartuchos"
|
||||
|
||||
@@ -36,11 +36,8 @@ msgid "Launch all your games"
|
||||
msgstr "Lance todos sus juegos"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr ""
|
||||
"juegos;lanzador;steam;lutris;heroico;botellas;itch;flatpak;legendario;"
|
||||
"retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -49,27 +46,25 @@ msgid ""
|
||||
"necessary. You can sort and hide games or download cover art from "
|
||||
"SteamGridDB."
|
||||
msgstr ""
|
||||
"Cartuchos es un sencillo lanzador de juegos para todos sus juegos. Tiene "
|
||||
"soporte para importar juegos de Steam, Lutris, Heroic y más sin necesidad de "
|
||||
"iniciar sesión. Puede ordenar y ocultar juegos o descargar portadas de "
|
||||
"Cartridges es un lanzador simple para todos tus juegos. Admite la "
|
||||
"importación de tus juegos de Steam, Lutris, Heroic y más sin necesidad de "
|
||||
"una cuenta. Puedes ordenar y ocultar juegos, o descargar carátulas de "
|
||||
"SteamGridDB."
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
||||
msgid "Library"
|
||||
msgstr "Biblioteca"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:71
|
||||
msgid "Game Details"
|
||||
msgstr "Detalles del juego"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:430
|
||||
#: src/details_window.py:265 src/importer/importer.py:301
|
||||
#: src/importer/importer.py:352
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferencias"
|
||||
|
||||
@@ -77,31 +72,40 @@ msgstr "Preferencias"
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: data/gtk/details-window.blp:58
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "Portada nueva"
|
||||
msgstr "Nueva caratula"
|
||||
|
||||
#: data/gtk/details-window.blp:77
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "Borrar portada"
|
||||
msgstr "Borrar la caratula"
|
||||
|
||||
#: data/gtk/details-window.blp:105 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
|
||||
#: data/gtk/details-window.blp:109
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Desarrollador (opcional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "El título del juego"
|
||||
|
||||
#: data/gtk/details-window.blp:115
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "Ejecutable"
|
||||
|
||||
#: data/gtk/details-window.blp:121
|
||||
msgid "Select File"
|
||||
msgstr "Seleccionar el archivo"
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Archivo a abrir o comando a ejecutar al iniciar el juego"
|
||||
|
||||
#: data/gtk/details-window.blp:132
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Más información"
|
||||
|
||||
@@ -109,18 +113,18 @@ msgstr "Más información"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:190
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Ocultar"
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:215
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:192
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Desocultar"
|
||||
msgstr "Mostrar"
|
||||
|
||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
||||
msgid "General"
|
||||
@@ -130,8 +134,8 @@ msgstr "General"
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:226 data/gtk/window.blp:269
|
||||
#: data/gtk/window.blp:336
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
@@ -143,8 +147,7 @@ msgstr "Mostrar preferencias"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Atajos"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:124
|
||||
#: src/importer/importer.py:376
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Deshacer"
|
||||
|
||||
@@ -158,7 +161,7 @@ msgstr "Juegos"
|
||||
|
||||
#: data/gtk/help-overlay.blp:48
|
||||
msgid "Add new game"
|
||||
msgstr "Añadir un nuevo juego"
|
||||
msgstr "Añadir juego nuevo"
|
||||
|
||||
#: data/gtk/help-overlay.blp:53
|
||||
msgid "Import games"
|
||||
@@ -172,10 +175,9 @@ msgstr "Mostrar juegos ocultos"
|
||||
msgid "Remove game"
|
||||
msgstr "Eliminar juego"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:88
|
||||
#: data/gtk/preferences.blp:339
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Comportamiento"
|
||||
msgstr "Conducta"
|
||||
|
||||
#: data/gtk/preferences.blp:16
|
||||
msgid "Exit After Launching Games"
|
||||
@@ -190,7 +192,7 @@ msgid "Swaps the behavior of the cover image and the play button"
|
||||
msgstr ""
|
||||
"Cambia el comportamiento de la imagen de portada y del botón de reproducción"
|
||||
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:85
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr "Imágenes"
|
||||
|
||||
@@ -204,124 +206,99 @@ msgstr "Guarda las partidas sin pérdidas a costa del almacenamiento"
|
||||
|
||||
#: data/gtk/preferences.blp:50
|
||||
msgid "Danger Zone"
|
||||
msgstr "Zona de peligro"
|
||||
msgstr "Zona peligrosa"
|
||||
|
||||
#: data/gtk/preferences.blp:53
|
||||
msgid "Remove All Games"
|
||||
msgstr "Eliminar todos los juegos"
|
||||
msgstr "Quitar todos los juegos"
|
||||
|
||||
#: data/gtk/preferences.blp:84 data/gtk/window.blp:27 data/gtk/window.blp:456
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
|
||||
#: data/gtk/preferences.blp:91
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Eliminar los juegos desinstalados"
|
||||
|
||||
#: data/gtk/preferences.blp:101
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Fuentes"
|
||||
|
||||
#: data/gtk/preferences.blp:104
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:108 data/gtk/preferences.blp:125
|
||||
#: data/gtk/preferences.blp:172 data/gtk/preferences.blp:225
|
||||
#: data/gtk/preferences.blp:242 data/gtk/preferences.blp:259
|
||||
#: data/gtk/preferences.blp:276 data/gtk/preferences.blp:293
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Ruta de instalación"
|
||||
msgstr "Ubicación de la instalación de itch"
|
||||
|
||||
#: data/gtk/preferences.blp:121
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:137
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Ruta de la caché"
|
||||
msgstr "Ubicación de la caché de Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:149
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importar juegos de Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:158
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importar juegos Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:168
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:184
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importar juegos de Epic"
|
||||
|
||||
#: data/gtk/preferences.blp:193
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importar juegos de GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:202
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importar de Amazon Games"
|
||||
|
||||
#: data/gtk/preferences.blp:211
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importar juegos descargados"
|
||||
|
||||
#: data/gtk/preferences.blp:221
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:255
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendario"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:272
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:289
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:305
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importar lanzadores de juegos"
|
||||
|
||||
#: data/gtk/preferences.blp:315
|
||||
msgid "Desktop Entries"
|
||||
msgstr "Entradas en el escritorio"
|
||||
|
||||
#: data/gtk/preferences.blp:327
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:331
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Autenticación"
|
||||
msgstr "Autentificación"
|
||||
|
||||
#: data/gtk/preferences.blp:334
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Clave API"
|
||||
msgstr "Código API"
|
||||
|
||||
#: data/gtk/preferences.blp:342
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Usar SteamGridDB"
|
||||
msgstr "Utiliza SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:343
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Descargar las imágenes al añadir o importar juegos"
|
||||
|
||||
#: data/gtk/preferences.blp:352
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Preferir las imágenes oficiales"
|
||||
|
||||
#: data/gtk/preferences.blp:361
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Prefiero las imágenes animadas"
|
||||
|
||||
@@ -349,7 +326,7 @@ msgstr "No hay juegos ocultos"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Los juegos que oculte aparecerán aquí."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Volver"
|
||||
|
||||
@@ -361,118 +338,106 @@ msgstr "Título del juego"
|
||||
msgid "Play"
|
||||
msgstr "Jugar"
|
||||
|
||||
#: data/gtk/window.blp:255 data/gtk/window.blp:449
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Añadir juego"
|
||||
|
||||
#: data/gtk/window.blp:262 data/gtk/window.blp:329
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menú principal"
|
||||
|
||||
#: data/gtk/window.blp:284
|
||||
msgid "Search games"
|
||||
msgstr "Buscar los juegos"
|
||||
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Juegos ocultos"
|
||||
|
||||
#: data/gtk/window.blp:351
|
||||
msgid "Search hidden games"
|
||||
msgstr "Buscar los juegos ocultos"
|
||||
|
||||
#: data/gtk/window.blp:388
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Ordenar"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Más recientes"
|
||||
|
||||
#: data/gtk/window.blp:409
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Más antiguos"
|
||||
|
||||
#: data/gtk/window.blp:415
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Último jugado"
|
||||
|
||||
#: data/gtk/window.blp:422
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Mostrar ocultos"
|
||||
|
||||
#: data/gtk/window.blp:435
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Atajos del teclado"
|
||||
|
||||
#: data/gtk/window.blp:440
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Acerca de Cartuchos"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:195
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Óscar Fernández Díaz <oscfdezdz@tuta.io>"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:213
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Añadido: {}"
|
||||
|
||||
#: src/window.py:216
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nunca"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:220
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Último jugado: {}"
|
||||
|
||||
#: src/details_window.py:76
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr "Aplicar"
|
||||
|
||||
#: src/details_window.py:82
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "Añadir un nuevo Juego"
|
||||
msgstr "Añadir juego nuevo"
|
||||
|
||||
#: src/details_window.py:83
|
||||
msgid "Add"
|
||||
msgstr "Añadir"
|
||||
|
||||
#: src/details_window.py:93
|
||||
msgid "Executables"
|
||||
msgstr "Ejecutables"
|
||||
#: src/details_window.py:79
|
||||
msgid "Confirm"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:108
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "archivo.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:110
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programa"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:115 src/details_window.py:117
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\ruta\\hasta\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:121 src/details_window.py:123
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/ruta/hasta/{}"
|
||||
|
||||
#: src/details_window.py:128
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -494,19 +459,19 @@ msgstr ""
|
||||
"\n"
|
||||
"Si la ruta contiene espacios, ¡asegúrese de entrecomillarla!"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:177
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "No se puede añadir el juego"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:207
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "El título del juego no puede estar vacío."
|
||||
|
||||
#: src/details_window.py:177 src/details_window.py:215
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "El ejecutable no puede estar vacío."
|
||||
|
||||
#: src/details_window.py:206 src/details_window.py:214
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "No se pudieron aplicar las preferencias"
|
||||
|
||||
@@ -516,123 +481,69 @@ msgid "{} launched"
|
||||
msgstr "{} comenzó"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} oculto"
|
||||
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} visible"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:172 src/importer/importer.py:373
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} eliminado"
|
||||
|
||||
#: src/preferences.py:123
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Todos los juegos eliminados"
|
||||
|
||||
#: src/preferences.py:172
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Se necesita una clave API para utilizar SteamGridDB. Puedes generar una {}"
|
||||
"aquí{}."
|
||||
|
||||
#: src/preferences.py:293
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Instalación no encontrada"
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Selecciona un directorio válido."
|
||||
|
||||
#: src/preferences.py:330 src/importer/importer.py:299
|
||||
msgid "Warning"
|
||||
msgstr "Advertencia"
|
||||
|
||||
#: src/preferences.py:364
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Directorio incorrecto"
|
||||
|
||||
#: src/preferences.py:370
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Escoger la ubicación"
|
||||
|
||||
#: src/utils/create_dialog.py:33 src/importer/importer.py:300
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Descartar"
|
||||
|
||||
#: src/importer/importer.py:137
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importando juegos…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:320
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "Han sucedido los siguientes fallos durante la importación:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:349
|
||||
msgid "No new games found"
|
||||
msgstr "No se encontraron juegos nuevos"
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#: src/importer/importer.py:361
|
||||
msgid "1 game imported"
|
||||
msgstr "1 juego importado"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:365
|
||||
msgid "{} games imported"
|
||||
msgstr "0 juegos importados"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:369
|
||||
msgid "1 removed"
|
||||
msgstr "1 eliminado"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Seleccione el directorio de la caché {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Seleccione el directorio de configuración {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Seleccione el directorio de datos {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "No se ha podido autenticar SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "No se puede conectar a SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifica tu clave API en las preferencias"
|
||||
|
||||
#~ 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
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "No se encuentra el directorio de Steam."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Confirmar"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Ubicación de la instalación de Steam"
|
||||
@@ -658,9 +569,30 @@ msgstr "Verifica tu clave API en las preferencias"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Selecciona el directorio de la caché de Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "No se encuentra la instalación"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Selecciona el directorio de la configuración {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Selecciona el directorio de los datos {}."
|
||||
|
||||
#~ 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"
|
||||
#~ msgstr "Directorio a usar para importar juegos"
|
||||
|
||||
@@ -715,16 +647,19 @@ msgstr "Verifica tu clave API en las preferencias"
|
||||
#~ msgstr "/ruta/hasta/{file_name}"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "General"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "General"
|
||||
#~ msgstr "General"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Search"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "Search"
|
||||
#~ msgstr "Buscar"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Undo"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "Undo"
|
||||
#~ msgstr "Deshacer"
|
||||
@@ -768,8 +703,8 @@ msgstr "Verifica tu clave API en las preferencias"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "No se han encontrado juegos nuevos en la biblioteca de Steam."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "No se encuentra el directorio de Steam."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Hablando con Steam"
|
||||
|
||||
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
#~ msgstr "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
290
po/fa.po
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-04-22 10:48+0000\n"
|
||||
"Last-Translator: سید حسین موسوی فرد <shmf1385@protonmail.com>\n"
|
||||
"Language-Team: Persian <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -20,7 +20,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "کارتریجها"
|
||||
|
||||
@@ -34,8 +34,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;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -53,18 +52,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "کتابخانه"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "جزییات بازی"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "ترجیحات"
|
||||
|
||||
@@ -80,19 +77,32 @@ msgstr ""
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "عنوان"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -100,7 +110,7 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr "ویرایش"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "پنهان کردن"
|
||||
|
||||
@@ -109,7 +119,7 @@ msgstr "پنهان کردن"
|
||||
msgid "Remove"
|
||||
msgstr "حذف"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "پیدا کردن"
|
||||
|
||||
@@ -122,7 +132,7 @@ msgid "Quit"
|
||||
msgstr "خروج"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "جستوجو"
|
||||
|
||||
@@ -134,8 +144,7 @@ msgstr "نمایش ترجیحات"
|
||||
msgid "Shortcuts"
|
||||
msgstr "میانبرها"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "برگردان"
|
||||
|
||||
@@ -163,8 +172,7 @@ msgstr "نمایش بازیهای پنهان"
|
||||
msgid "Remove game"
|
||||
msgstr "حذف کردن بازی"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr ""
|
||||
|
||||
@@ -200,122 +208,89 @@ msgstr "منطقهٔ خطر"
|
||||
msgid "Remove All Games"
|
||||
msgstr "حذف کردن همهٔ بازیها"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "درونریزی"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "حذف کردن همهٔ بازیها"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "منبعها"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "استیم"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
msgid "Install Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Cache Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
#| msgid "Import games"
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "درونریزی بازی"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "درونریزی بازی"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "اجراگر بازی"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr ""
|
||||
|
||||
@@ -343,7 +318,7 @@ msgstr ""
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
@@ -355,82 +330,70 @@ msgstr ""
|
||||
msgid "Play"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "جستوجو"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "نمایش بازیهای پنهان"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr ""
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr ""
|
||||
|
||||
@@ -443,30 +406,30 @@ msgid "Add New Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr ""
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -479,126 +442,87 @@ msgid ""
|
||||
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr ""
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr ""
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
#, fuzzy
|
||||
#| msgid "Import games"
|
||||
msgid "Importing Games…"
|
||||
msgstr "درونریزی بازی"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#, fuzzy
|
||||
#| msgid "Add new game"
|
||||
msgid "No new games found"
|
||||
msgstr "افزدون بازی"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
#: src/importer/sources/source.py:108
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "Remove"
|
||||
msgid "1 removed"
|
||||
msgstr "حذف"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Add new game"
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "افزدون بازی"
|
||||
|
||||
341
po/fi.po
@@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-07 15:38+0000\n"
|
||||
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
|
||||
"Language-Team: Finnish <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -24,7 +24,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -38,8 +38,7 @@ msgid "Launch all your games"
|
||||
msgstr "Käynnistä kaikki pelisi"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -63,18 +62,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Kirjasto"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Pelin tiedot"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Asetukset"
|
||||
|
||||
@@ -90,21 +87,34 @@ msgstr ""
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Nimi"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Pelin nimi"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Suoritettava"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
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ä"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -112,7 +122,7 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr "Muokkaa"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Piilota"
|
||||
|
||||
@@ -121,7 +131,7 @@ msgstr "Piilota"
|
||||
msgid "Remove"
|
||||
msgstr "Poista"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Näytä"
|
||||
|
||||
@@ -134,7 +144,7 @@ msgid "Quit"
|
||||
msgstr "Lopeta"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Etsi"
|
||||
|
||||
@@ -146,8 +156,7 @@ msgstr "Näytä asetukset"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Pikanäppäimet"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Kumoa"
|
||||
|
||||
@@ -175,8 +184,7 @@ msgstr "Näytä piilotetut pelit"
|
||||
msgid "Remove game"
|
||||
msgstr "Poista peli"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Toiminta"
|
||||
|
||||
@@ -212,126 +220,93 @@ msgstr "Vaaravyöhyke"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Poista kaikki pelit"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Tuo"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Poista kaikki pelit"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Lähteet"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "itch-asennuksen sijainti"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Lutris-välimuistin sijainti"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Tuo Steam-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Tuo Steam-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Tuo Epic-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Tuo GOG-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Tuo Steam-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Tuo Sideload-pelejä"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Pullot"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Pelin käynnistin"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Tunnistautuminen"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API-avain"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Käytä SteamGridDB:tä"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Lataa kuvat pelejä lisätessä tai tuotaessa"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Suosi virallisten kuvien sijaan"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Suosi animoituja kuvia"
|
||||
|
||||
@@ -359,7 +334,7 @@ msgstr "Ei piilotettuja pelejä"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Piilotetut pelit näkyvät täällä."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Takaisin"
|
||||
|
||||
@@ -371,82 +346,70 @@ msgstr "Pelin nimi"
|
||||
msgid "Play"
|
||||
msgstr "Pelaa"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Lisää peli"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Päävalikko"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Etsi"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Piilotetut pelit"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Näytä piilotetut pelit"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Lajittele"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Uusin"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Vanhin"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Viimeksi pelattu"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Näytä piilotetut"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Pikanäppäimet"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Tietoja - Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Linux Sauna"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Lisätty: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Ei koskaan"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Viimeksi pelattu: {}"
|
||||
|
||||
@@ -459,30 +422,30 @@ msgid "Add New Game"
|
||||
msgstr "Lisää uusi peli"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Vahvista"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "file.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "ohjelma"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\polku\\kansioon\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/polku/kansioon/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -505,162 +468,92 @@ msgstr ""
|
||||
"Jos polku sisältää välilyöntejä, varmista, että se on suljettu "
|
||||
"kaksinkertaisiin lainausmerkkeihin!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Peliä ei voitu lisätä"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Pelin nimi ei voi olla tyhjä."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Suoritettava ei voi olla tyhjä."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Asetuksia ei voitu ottaa käyttöön"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} käynnistetty"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} piilotettu"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} palautettu näkyviin"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} poistettu"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Kaikki pelit poistettu"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"API-avain on pakollinen, jos haluat käyttää SteamGridDB:tä. Voit luoda "
|
||||
"avaimen {}täällä{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
#, fuzzy
|
||||
#| msgid "Installation Not Found"
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Asennusta ei löydy"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Aseta sijainti"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Hylkää"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Tuodaan pelejä…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "No Games Found"
|
||||
msgid "No new games found"
|
||||
msgstr "Pelejä ei löydetty"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Vahvista"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Game Imported"
|
||||
msgid "1 game imported"
|
||||
msgstr "Peli tuotu"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
#, fuzzy
|
||||
#| msgid "Games Imported"
|
||||
msgid "{} games imported"
|
||||
msgstr "Pelit tuotu"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} poistettu"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Ei voitu yhdistää SteamGridDB:hen"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ 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
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Steam-hakemistoa ei löydy."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Vahvista"
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam-asennuksen sijainti"
|
||||
|
||||
@@ -682,9 +575,30 @@ msgstr ""
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Välimuistia ei löydy"
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Asennusta 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"
|
||||
#~ msgstr "Hakemisto, jota käytetään pelejä tuotaessa"
|
||||
|
||||
@@ -797,5 +711,8 @@ msgstr ""
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Steam-kirjastosta ei löytynyt uusia pelejä."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Steam-hakemistoa ei löydy."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Yhdistetään Steam-kirjastoon"
|
||||
|
||||
363
po/fr.po
@@ -6,14 +6,13 @@
|
||||
# rene-coty <irenee.thirion@e.email>, 2023.
|
||||
# John Donne <akheron@zaclys.net>, 2023.
|
||||
# "Yannick A." <pify@live.fr>, 2023.
|
||||
# Geoffrey Coulaud <geoffrey.coulaud+github@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-07-29 15:08+0000\n"
|
||||
"Last-Translator: John Donne <akheron@zaclys.net>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-28 10:11+0000\n"
|
||||
"Last-Translator: rene-coty <irenee.thirion@e.email>\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/fr/>\n"
|
||||
"Language: fr\n"
|
||||
@@ -21,13 +20,13 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartouches"
|
||||
msgstr "Cartridges"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||
msgid "Game Launcher"
|
||||
@@ -39,11 +38,8 @@ msgid "Launch all your games"
|
||||
msgstr "Lancez tous vos jeux"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr "jeu;lanceur;steam;lutris;heroic;bouteilles;itch;flatpak;legendary;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;jeux;lanceur;steam;lutris;heroic;bouteilles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -52,7 +48,7 @@ msgid ""
|
||||
"necessary. You can sort and hide games or download cover art from "
|
||||
"SteamGridDB."
|
||||
msgstr ""
|
||||
"Cartouches est un lanceur de jeux simple pour tous vos jeux. Il prend en "
|
||||
"Cartridges 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 "
|
||||
"encore, sans nécessiter de connexion. Vous pouvez trier et masquer les jeux "
|
||||
"ou télécharger la pochette depuis SteamGridDB."
|
||||
@@ -61,18 +57,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliothèque"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Détails du jeu"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Préférences"
|
||||
|
||||
@@ -88,21 +82,32 @@ msgstr "Nouvelle couverture"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Supprimer la couverture"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Titre"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Le titre du jeu"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Exécutable"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Fichier à ouvrir ou commande à exécuter au lancement du jeu"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Plus d’informations"
|
||||
|
||||
@@ -110,7 +115,7 @@ msgstr "Plus d’informations"
|
||||
msgid "Edit"
|
||||
msgstr "Modifier"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Masquer"
|
||||
|
||||
@@ -119,7 +124,7 @@ msgstr "Masquer"
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Ne plus masquer"
|
||||
|
||||
@@ -132,7 +137,7 @@ msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Rechercher"
|
||||
|
||||
@@ -144,8 +149,7 @@ msgstr "Afficher les préférences"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Raccourcis"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Annuler"
|
||||
|
||||
@@ -173,8 +177,7 @@ msgstr "Afficher les jeux masqués"
|
||||
msgid "Remove game"
|
||||
msgstr "Supprimer le jeu"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Comportement"
|
||||
|
||||
@@ -213,116 +216,93 @@ msgstr "Zone de danger"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Supprimer tous les jeux"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Supprimer tous les jeux"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Sources"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Emplacement d'installation"
|
||||
msgstr "Emplacement d’installation de Itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Emplacement du cache"
|
||||
msgstr "Emplacement du cache de Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importer les jeux de Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importer des jeux Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importer les jeux d'Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importer les jeux de GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importer les jeux Amazon"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importer des jeux Sideloaded"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bouteilles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Légendaire"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importer des lanceurs de jeux"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Authentification"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Clé API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Utiliser SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Télécharger les images lors de l’ajout ou de l’importation de jeux"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Préférer à la place des images officielles"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Préférer les images animées"
|
||||
|
||||
@@ -350,7 +330,7 @@ msgstr "Pas de jeux masqués"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Les jeux que vous masquez apparaîtront ici."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Retour"
|
||||
|
||||
@@ -362,82 +342,70 @@ msgstr "Titre du jeu"
|
||||
msgid "Play"
|
||||
msgstr "Jouer"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Ajouter un jeu"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Rechercher"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Jeux masqués"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Afficher les jeux masqués"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Trier"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Le plus récent"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Le plus ancien"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Dernière session"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Afficher les masqués"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Raccourcis clavier"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "À propos de Cartouches"
|
||||
msgstr "À propos de Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Irénée Thirion, L. Chareton"
|
||||
msgstr "Irénée Thirion"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Ajouté : {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Jamais"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Dernière session : {}"
|
||||
|
||||
@@ -450,30 +418,30 @@ msgid "Add New Game"
|
||||
msgstr "Ajouter un nouveau jeu"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Confirmer"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "fichier.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programme"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\chemin\\vers\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/chemin/vers/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -489,156 +457,99 @@ msgstr ""
|
||||
"\n"
|
||||
"<tt>\"{}\"</tt>\n"
|
||||
"\n"
|
||||
"Pour ouvrir le fichier « {} » avec l’application par défaut, utilisez :\n"
|
||||
"Pour ouvrir le fichier « {} » avec l’application par défaut, utilisez la "
|
||||
"commande :\n"
|
||||
"\n"
|
||||
"<tt>{} \"{}\"</tt>\n"
|
||||
"\n"
|
||||
"Si le chemin d'accès contient des espaces, veillez à le mettre entre "
|
||||
"guillemets !"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Impossible d’ajouter le jeu"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Le titre du jeu ne peut pas être vide."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "L’exécutable ne peut pas être vide."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Impossible d’appliquer les préférences"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} lancé"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} masqué"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} affiché"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} retiré"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Tous les jeux ont été supprimés"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Une clé API est requise pour utiliser SteamGridDB. Vous pouvez en générer "
|
||||
"une {}ici{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Installation introuvable"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Sélectionnez un répertoire valide."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Répertoire invalide"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Définir l’emplacement"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Fermer"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importation des jeux…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Aucun nouveau jeu trouvé"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 jeu importé"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} jeux importés"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} retiré"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Confirmer"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Sélectionnez le répertoire de cache de {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Sélectionnez le répertoire de configuration de {}."
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Sélectionnez le répertoire de données de {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Impossible de se connecter à SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Vérifiez votre clé API dans les préférences"
|
||||
|
||||
#~ 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
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Le répertoire Steam est introuvable."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Confirmer"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Emplacement de l’installation de Steam"
|
||||
@@ -664,9 +575,30 @@ msgstr "Vérifiez votre clé API dans les préférences"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Sélectionnez le répertoire du cache de Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Installation introuvable"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Sélectionnez le répertoire de configuration de {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Sélectionnez le répertoire de données de {}."
|
||||
|
||||
#~ 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"
|
||||
#~ msgstr "Répertoire à utiliser lors de l’importation de jeux"
|
||||
|
||||
@@ -778,6 +710,9 @@ msgstr "Vérifiez votre clé API dans les préférences"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Aucun nouveau jeu n'a été trouvé dans la bibliothèque Steam."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Le répertoire Steam est introuvable."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Parler à Steam"
|
||||
|
||||
|
||||
342
po/hu.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-16 10:45+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-26 10:05+0000\n"
|
||||
"Last-Translator: kramo <contact@kramo.hu>\n"
|
||||
"Language-Team: Hungarian <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/hu/>\n"
|
||||
@@ -18,11 +18,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18.1\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Kazetták"
|
||||
|
||||
@@ -36,10 +36,8 @@ msgid "Launch all your games"
|
||||
msgstr "Indítsa el az összes játékát"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr ""
|
||||
"játék;indító;steam;lutris;heroic;palackok;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "játék;indító;steam;lutris;heroic;palackok;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -56,18 +54,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Könyvtár"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Játék Tulajdonságai"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Beállítások"
|
||||
|
||||
@@ -83,19 +79,32 @@ msgstr "Új borító"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Borító törlése"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Cím"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Fejlesztő (nem kötelező)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "A játék címe"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "Program"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
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"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Több infó"
|
||||
|
||||
@@ -103,7 +112,7 @@ msgstr "Több infó"
|
||||
msgid "Edit"
|
||||
msgstr "Szerkesztés"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Elrejtés"
|
||||
|
||||
@@ -112,7 +121,7 @@ msgstr "Elrejtés"
|
||||
msgid "Remove"
|
||||
msgstr "Eltávolítás"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Elrejtés visszavonása"
|
||||
|
||||
@@ -125,7 +134,7 @@ msgid "Quit"
|
||||
msgstr "Kilépés"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Keresés"
|
||||
|
||||
@@ -137,8 +146,7 @@ msgstr "Beállítások megjelenítése"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Gyorsbillentyűk"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Visszavonás"
|
||||
|
||||
@@ -166,8 +174,7 @@ msgstr "Rejtett játékok megjelenítése"
|
||||
msgid "Remove game"
|
||||
msgstr "Játék eltávolítása"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Működés"
|
||||
|
||||
@@ -203,114 +210,89 @@ msgstr "Veszélyzóna"
|
||||
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:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importálás"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Nem található játékok eltávolítása"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Források"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
msgid "Install Location"
|
||||
msgstr "Telepítés helye"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Cache Location"
|
||||
msgstr "Gyorsítótár helye"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Steam játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Flatpak játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Epic Games játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "GOG játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Amazon játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Manuálisan hozzáadott játékok importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Palackok"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Játékindítók importálása"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Hitelesítés"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API kulcs"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "SteamGridDB használata"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Képek letöltése játékok hozzáadásakor és importálásakor"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "SteamGridDB képek előnyben részesítése"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Animált képek előnyben részesítése"
|
||||
|
||||
@@ -338,7 +320,7 @@ msgstr "Nincsenek rejtett játékok"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "A rejtett játékaid itt lesznek megtalálhatóak."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Vissza"
|
||||
|
||||
@@ -350,78 +332,70 @@ msgstr "Cím"
|
||||
msgid "Play"
|
||||
msgstr "Játék"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Játék hozzáadása"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Főmenü"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
msgid "Search games"
|
||||
msgstr "Játékok keresése"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Rejtett játékok"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
msgid "Search hidden games"
|
||||
msgstr "Rejtett játékok keresése"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Rendezés"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Legújabb"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Legrégebbi"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Legutóbb játszott"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Rejtett játékok"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Gyorsbillentyűk"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "A Kazetták névjegye"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "kramo https://kramo.hu"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Hozzáadva: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Soha"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Legutóbbi játékmenet: {}"
|
||||
|
||||
@@ -434,30 +408,30 @@ msgid "Add New Game"
|
||||
msgstr "Új játék hozzáadása"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr "Hozzáad"
|
||||
msgid "Confirm"
|
||||
msgstr "Megerősítés"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "fájl.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\útvonal\\ide\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/útvonal/ide/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -480,157 +454,88 @@ msgstr ""
|
||||
"\n"
|
||||
"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
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Nem lehet hozzáadni a játékot"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "A cím nem lehet üres."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "A program nem lehet üres."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Nem lehet menteni a beállításokat"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} elindítva"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} elrejtve"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} elrejtése visszavonva"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} eltávolítva"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Az összes játék eltávolítva"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Egy API kulcs szükséges a SteamGridDB használatához. {}Itt{} generálhat "
|
||||
"egyet."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "A telepítés nem található"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Válasszon ki egy érvényes mappát."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Érvénytelen mappa"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Mappa kiválasztása"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Rendben"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Játékok importálása folyamatban…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr "Adatok"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
msgstr "Figyelem"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr "Gyorsítótár"
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "A következő hibák történtek importálás közben:"
|
||||
#: src/importer/sources/source.py:108
|
||||
msgid "Configuration"
|
||||
msgstr "Konfigurációk"
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Nem találhatóak új játékok"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr "Érvénytelen {} mappa ennek a forrásnak: {{}}"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 játék importálva"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr "Válasszon egy újat, vagy kapcsolja ki a forrást a beállításokban"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} játék importálva"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
msgid "1 removed"
|
||||
msgstr "1 eltávolítva"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Válassza ki {} gyorsítótár mappáját."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Válassza ki {} konfigurációs mappáját."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Válassza ki {} adatok mappáját."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Nem lehet hitelesíteni SteamGridDB-t"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
||||
|
||||
#~ 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
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "A Steam mappa nem található."
|
||||
|
||||
#~ msgid "Data"
|
||||
#~ msgstr "Adatok"
|
||||
|
||||
#~ msgid "Cache"
|
||||
#~ msgstr "Gyorsítótár"
|
||||
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Konfigurációk"
|
||||
|
||||
#~ msgid "Invalid {} Location for {{}}"
|
||||
#~ msgstr "Érvénytelen {} mappa ennek a forrásnak: {{}}"
|
||||
|
||||
#~ msgid "Pick a new one or disable the source in preferences"
|
||||
#~ msgstr "Válasszon egy újat, vagy kapcsolja ki a forrást a beállításokban"
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam telepítés helye"
|
||||
|
||||
@@ -655,9 +560,30 @@ msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Válassza ki Lutris gyorsítótár mappáját."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Telepítés nem található"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Válassza ki {} konfigurációs mappáját."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Válassza ki {} adatainak 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"
|
||||
#~ msgstr "Az importáláshoz használt mappa"
|
||||
|
||||
@@ -762,6 +688,9 @@ msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Nem találhatóak új játékok a Steam könyvtárban."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "A Steam mappa nem található."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Adatok lekérése a Steam-ből"
|
||||
|
||||
@@ -801,6 +730,3 @@ msgstr "Ellenőrizze az API kulcsát a beállításokban"
|
||||
|
||||
#~ msgid "Games Imported"
|
||||
#~ 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;"
|
||||
|
||||
357
po/it.po
@@ -4,14 +4,13 @@
|
||||
# Alessandro Iepure <alessandro.iepure@gmail.com>, 2023.
|
||||
# albanobattistella <albano_battistella@hotmail.com>, 2023.
|
||||
# kramo <contact@kramo.hu>, 2023.
|
||||
# Giasko <dibiame@hotmail.it>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-07-21 12:16+0000\n"
|
||||
"Last-Translator: Giasko <dibiame@hotmail.it>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-26 18:10+0000\n"
|
||||
"Last-Translator: albanobattistella <albano_battistella@hotmail.com>\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/it/>\n"
|
||||
"Language: it\n"
|
||||
@@ -19,11 +18,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartucce"
|
||||
|
||||
@@ -37,11 +36,8 @@ msgid "Launch all your games"
|
||||
msgstr "Avvia tutti i tuoi giochi"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr "gioco;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gioco;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +55,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Libreria"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Dettagli del gioco"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferenze"
|
||||
|
||||
@@ -86,21 +80,32 @@ msgstr "Nuova copertina"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Elimina copertina"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Titolo"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Titolo del gioco"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Eseguibile"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "File da aprire o comando da lanciare per avviare il gioco"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Altre informazioni"
|
||||
|
||||
@@ -108,7 +113,7 @@ msgstr "Altre informazioni"
|
||||
msgid "Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Nascondi"
|
||||
|
||||
@@ -117,7 +122,7 @@ msgstr "Nascondi"
|
||||
msgid "Remove"
|
||||
msgstr "Rimuovi"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Mostra"
|
||||
|
||||
@@ -127,10 +132,10 @@ msgstr "Generale"
|
||||
|
||||
#: data/gtk/help-overlay.blp:14
|
||||
msgid "Quit"
|
||||
msgstr "Esci"
|
||||
msgstr "Chiudi"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
@@ -142,8 +147,7 @@ msgstr "Mostra preferenze"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Scorciatoie da tastiera"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Annulla"
|
||||
|
||||
@@ -171,8 +175,7 @@ msgstr "Mostra giochi nascosti"
|
||||
msgid "Remove game"
|
||||
msgstr "Rimuovi gioco"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Comportamento"
|
||||
|
||||
@@ -209,116 +212,93 @@ msgstr "Zona di pericolo"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Rimuovi tutti i giochi"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importa"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Rimuovi tutti i giochi"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Fonti"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Posizione di installazione"
|
||||
msgstr "itch Posizione di installazione"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Posizione della cache"
|
||||
msgstr "Posizione della cache di Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importa giochi da Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importa giochi da Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importa giochi da Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importa giochi da GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importa giochi Amazon"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importa giochi da aggiunti manualmente"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importa launcher di giochi"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Autenticazione"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Chiave API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Usa SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Scarica immagini durante l'aggiunta o l'import di giochi"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Preferisci alle immagini ufficiali"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Preferisci immagini animate"
|
||||
|
||||
@@ -346,7 +326,7 @@ msgstr "Nessun Gioco Nascosto"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "I giochi nascosti appariranno qui."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Indietro"
|
||||
|
||||
@@ -358,82 +338,70 @@ msgstr "Titolo del gioco"
|
||||
msgid "Play"
|
||||
msgstr "Gioca"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Aggiungi Gioco"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menù Principale"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Cerca"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Giochi Nascosti"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Mostra giochi nascosti"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Ordina per"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Più recente"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Più vecchio"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Ultimo Avvio"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Mostra Nascosti"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Scorciatoie da Tastiera"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Informazioni su Cartucce"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Alessandro Iepure https://ale.iepure.me"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Aggiunto il: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Mai"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Ultima riproduzione: {}"
|
||||
|
||||
@@ -446,30 +414,30 @@ msgid "Add New Game"
|
||||
msgstr "Aggiungi un Nuovo Gioco"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Conferma"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "file.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programma"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\path\\to{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/percorso/to/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -491,147 +459,91 @@ msgstr ""
|
||||
"\n"
|
||||
"Se il percorso contiene spazi, assicurarsi di avvolgerlo in doppi apici!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Impossibile aggiungere il gioco"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Il titolo del gioco non può essere vuoto."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "L'eseguibile non può essere vuoto."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Impossibile applicare le preferenze"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} avviato"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} nascosto"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} visibile"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} rimosso"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Tutti i giochi sono stati rimossi"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Per utilizzare SteamGridDB è necessaria una chiave API. Puoi generarne una {}"
|
||||
"qui{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Installazione non trovata"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Seleziona una directory valida."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Directory non valida"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Imposta percorso"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Chiudi"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Import dei giochi in corso…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Nessun nuovo gioco trovato"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 gioco importato"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} giochi importati"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} rimosso"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Conferma"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Seleziona la directory della cache per {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Selezionare la directory di configurazione per {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Seleziona la directory dati per {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Impossibile autenticare SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Impossibile connettersi a SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifica la tua chiave API nelle preferenze"
|
||||
|
||||
#~ 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
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Non è possibile trovare il percorso per Steam."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Conferma"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Percorso Installazione Steam"
|
||||
@@ -657,9 +569,30 @@ msgstr "Verifica la tua chiave API nelle preferenze"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Selezionare la directory della cache di Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Installazione non trovata"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Selezionare la directory di configurazione {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Selezionare la directory dei dati {}."
|
||||
|
||||
#~ 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"
|
||||
#~ msgstr "Cartella da usare per importare i giochi"
|
||||
|
||||
@@ -769,6 +702,9 @@ msgstr "Verifica la tua chiave API nelle preferenze"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Nessun nuovo gioco trovato nella libreria di Steam."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Non è possibile trovare il percorso per Steam."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Parlando con Steam"
|
||||
|
||||
@@ -777,6 +713,3 @@ msgstr "Verifica la tua chiave API nelle preferenze"
|
||||
|
||||
#~ msgid "Games Imported"
|
||||
#~ msgstr "Giochi importati"
|
||||
|
||||
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
#~ msgstr "gioco;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
280
po/ko.po
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-03-28 22:23+0000\n"
|
||||
"Last-Translator: MJKim <kmj10727@gmail.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -20,7 +20,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "카트리지"
|
||||
|
||||
@@ -34,8 +34,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;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -58,18 +57,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "라이브러리"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr ""
|
||||
|
||||
@@ -85,19 +82,32 @@ msgstr ""
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -105,7 +115,7 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
|
||||
@@ -114,7 +124,7 @@ msgstr ""
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr ""
|
||||
|
||||
@@ -127,7 +137,7 @@ msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
@@ -139,8 +149,7 @@ msgstr ""
|
||||
msgid "Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr ""
|
||||
|
||||
@@ -174,8 +183,7 @@ msgstr ""
|
||||
msgid "Remove game"
|
||||
msgstr "게임이 없습니다"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr ""
|
||||
|
||||
@@ -211,122 +219,91 @@ msgstr ""
|
||||
msgid "Remove All Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
msgid "Install Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Cache Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
#, fuzzy
|
||||
#| msgid "No Games"
|
||||
msgid "Import Steam Games"
|
||||
msgstr "게임이 없습니다"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
#| msgid "No Games"
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "게임이 없습니다"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "No Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "게임이 없습니다"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "게임 런처"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr ""
|
||||
|
||||
@@ -354,7 +331,7 @@ msgstr ""
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "뒤로"
|
||||
|
||||
@@ -366,80 +343,70 @@ msgstr ""
|
||||
msgid "Play"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Launch your games"
|
||||
msgid "Search games"
|
||||
msgstr "게임을 실행합니다"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
msgid "Search hidden games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "정렬"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "카트리지 정보"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr ""
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr ""
|
||||
|
||||
@@ -452,30 +419,30 @@ msgid "Add New Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr ""
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -488,122 +455,85 @@ msgid ""
|
||||
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr ""
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr ""
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
#, fuzzy
|
||||
#| msgid "No Games"
|
||||
msgid "Importing Games…"
|
||||
msgstr "게임이 없습니다"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
#: src/importer/sources/source.py:108
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
msgid "1 removed"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Launch your games"
|
||||
#~ msgstr "게임을 실행합니다"
|
||||
|
||||
351
po/nb_NO.po
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-04-06 08:09+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -35,8 +35,7 @@ msgid "Launch all your games"
|
||||
msgstr "Start alle spillene dine"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -55,18 +54,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliotek"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Spilldetaljer"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Innstillinger"
|
||||
|
||||
@@ -82,21 +79,32 @@ msgstr ""
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Navn"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Navnet på spillet"
|
||||
|
||||
#: 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)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Kjørbar"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Fil å åpne eller kommando å kjøre ved oppstart av spillet"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -104,7 +112,7 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr "Rediger"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Skjul"
|
||||
|
||||
@@ -113,7 +121,7 @@ msgstr "Skjul"
|
||||
msgid "Remove"
|
||||
msgstr "Fjern"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Opphev fjerning"
|
||||
|
||||
@@ -126,7 +134,7 @@ msgid "Quit"
|
||||
msgstr "Avslutt"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
#, fuzzy
|
||||
msgid "Search"
|
||||
msgstr "Søk"
|
||||
@@ -139,8 +147,7 @@ msgstr "Vis innstillinger"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Snarveier"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Angre"
|
||||
|
||||
@@ -166,11 +173,11 @@ msgstr "Vis skjulte spill"
|
||||
|
||||
#: data/gtk/help-overlay.blp:63
|
||||
#, fuzzy
|
||||
#| msgid "Remove"
|
||||
msgid "Remove game"
|
||||
msgstr "Fjern spill"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
#, fuzzy
|
||||
msgid "Behavior"
|
||||
msgstr "Adferd"
|
||||
@@ -207,125 +214,100 @@ msgstr "Faresone"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Fjern alle spill"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Fjern alle spill"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Kilder"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "Heroic Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Installasjonssted for itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Set Heroic Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Posisjon for Lutris-hurtiglager"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
#, fuzzy
|
||||
#| msgid "Import Sideloaded Games"
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importer sideinnlastede spill"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importer sideinnlastede spill"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importer Epic-spill"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importer GOG-spill"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importer Amazon-spill"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importer sideinnlastede spill"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
#, fuzzy
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Spillutvalgstarter"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Identitetsbekreftelse"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
#, fuzzy
|
||||
msgid "API Key"
|
||||
msgstr "API-nøkkel"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Bruk SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
#, fuzzy
|
||||
#| msgid "Directory to use when importing games"
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Mappe å bruke ved import av spill"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
#, fuzzy
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Foretrekk over offisielle bilder"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
#, fuzzy
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Foretrekk over offisielle bilder"
|
||||
@@ -354,7 +336,7 @@ msgstr "Ingen skjulte spill"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Spill du skjuler vil vises her."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Tilbake"
|
||||
|
||||
@@ -366,81 +348,70 @@ msgstr "Spillnavn"
|
||||
msgid "Play"
|
||||
msgstr "Spill"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Legg til spill"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Hovedmeny"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
msgid "Search games"
|
||||
msgstr "Søk"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Skjulte spill"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Vis skjulte spill"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sorter"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Å"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Å-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Nyeste"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Eldste"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Sist spilt"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Vis skjulte"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Tastatursnarveier"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Om"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Allan Nordhøy, <epost@anotheragency.no>"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Tillagt: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Aldri"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Sist spilt: {}"
|
||||
|
||||
@@ -453,30 +424,30 @@ msgid "Add New Game"
|
||||
msgstr "Legg til nytt spill"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Bekreft"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "fil.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\sti\\til\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/sti/til/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -499,158 +470,94 @@ msgstr ""
|
||||
"Hvis stien inneholder mellomrom må du pakke den inn i doble engelske "
|
||||
"sitattegn."
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Kunne ikke legge til spill"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Spillnavnet kan ikke være tomt."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Kjørbar fil må angis."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Kunne ikke ta i bruk endringer"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} startet"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
#, fuzzy
|
||||
#| msgid "Show Hidden"
|
||||
msgid "{} hidden"
|
||||
msgstr "{} skjult"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} synlig"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} fjernet"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Alle spill fjernet"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"En API-nøkkel kreves for å bruke SteamGridDB. Du kan generere en {}her{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
#, fuzzy
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Fant ikke installasjonen"
|
||||
|
||||
#: src/preferences.py:296
|
||||
#, fuzzy
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Velg {}-datamappen."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
#, fuzzy
|
||||
#| msgid "Set Steam Location"
|
||||
msgid "Set Location"
|
||||
msgstr "Velg mappe"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Forkast"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importerer spill …"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
msgid "No new games found"
|
||||
msgstr "Fant ingen spill"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Bekreft"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
#, fuzzy
|
||||
msgid "1 game imported"
|
||||
msgstr "Spill importert"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
#, fuzzy
|
||||
msgid "{} games imported"
|
||||
msgstr "Spill importert"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} fjernet"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
#, fuzzy
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Velg {}-datamappen."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
#, fuzzy
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Velg {}-oppsettsmappen."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
#, fuzzy
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Velg {}-datamappen."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Kunne ikke koble til SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ 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
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Kunne ikke finne Steam-mappen."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Bekreft"
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Installasjonssted for Steam"
|
||||
|
||||
@@ -677,9 +584,36 @@ msgstr ""
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Velg {name}-datamappen."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Fant ikke installasjonen"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Velg {}-oppsettsmappen."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Velg {}-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"
|
||||
#~ msgstr "Mappe å bruke ved import av spill"
|
||||
|
||||
@@ -694,6 +628,7 @@ msgstr ""
|
||||
#~ msgstr "Tøm"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Directory to use when importing games"
|
||||
#~ msgid "Directory to use when importing game covers"
|
||||
#~ msgstr "Mappe å bruke ved import av spillomslag"
|
||||
|
||||
@@ -707,6 +642,7 @@ msgstr ""
|
||||
#~ msgstr "Importerte ett spill."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Successfully imported 1 game."
|
||||
#~ msgid "Successfully imported {} games."
|
||||
#~ msgstr "Importerte {} spill."
|
||||
|
||||
@@ -737,6 +673,7 @@ msgstr ""
|
||||
#~ msgstr "/sti/til/{file_name}"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "General"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "General"
|
||||
#~ msgstr "Generelt"
|
||||
@@ -747,6 +684,7 @@ msgstr ""
|
||||
#~ msgstr "Søk"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Undo"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "Undo"
|
||||
#~ msgstr "Angre"
|
||||
@@ -790,6 +728,9 @@ msgstr ""
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Fant ingen nye spill i Steam-biblioteket."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Kunne ikke finne Steam-mappen."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Snakker med Steam"
|
||||
|
||||
367
po/nl.po
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-13 10:23+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-29 18:48+0000\n"
|
||||
"Last-Translator: Philip Goto <philip.goto@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/nl/>\n"
|
||||
@@ -17,11 +17,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -35,13 +35,10 @@ msgid "Launch all your games"
|
||||
msgstr "Start al uw games op"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;spelen;"
|
||||
"games;starten;opstarten;"
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;spelen;games;starten;"
|
||||
"opstarten;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +56,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliotheek"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Game-details bewerken"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Game-details"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Voorkeuren"
|
||||
|
||||
@@ -86,21 +81,33 @@ msgstr "Nieuwe cover"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Cover verwijderen"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "De titel van de game"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Ontwikkelaar"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "De ontwikkelaar of uitgever (optioneel)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Programmabestand"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
"Te openen bestand of uit te voeren opdracht bij het starten van de game"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Meer info"
|
||||
|
||||
@@ -108,7 +115,7 @@ msgstr "Meer info"
|
||||
msgid "Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Verbergen"
|
||||
|
||||
@@ -117,7 +124,7 @@ msgstr "Verbergen"
|
||||
msgid "Remove"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Niet meer verbergen"
|
||||
|
||||
@@ -127,10 +134,10 @@ msgstr "Algemeen"
|
||||
|
||||
#: data/gtk/help-overlay.blp:14
|
||||
msgid "Quit"
|
||||
msgstr "Afsluiten"
|
||||
msgstr "Sluiten"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Zoeken"
|
||||
|
||||
@@ -142,8 +149,7 @@ msgstr "Voorkeuren tonen"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Sneltoetsen"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Ongedaan maken"
|
||||
|
||||
@@ -171,8 +177,7 @@ msgstr "Verborgen games tonen"
|
||||
msgid "Remove game"
|
||||
msgstr "Game verwijderen"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Gedrag"
|
||||
|
||||
@@ -209,116 +214,93 @@ msgstr "Gevarenzone"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Alle games verwijderen"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Alle games verwijderen"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Bronnen"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Installatielocatie"
|
||||
msgstr "Installatielocatie van itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Cache-locatie"
|
||||
msgstr "Cache-locatie van Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Steam-games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Flatpak-games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Epic-games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "GOG-games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Amazon-games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Gesideloade games importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Game-launchers importeren"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Authenticatie"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API-sleutel"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "SteamGridDB gebruiken"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Afbeeldingen downloaden bij het toevoegen of importeren van games"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Voorkeur geven boven officiële afbeeldingen"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Voorkeur geven aan geanimeerde afbeeldingen"
|
||||
|
||||
@@ -328,7 +310,7 @@ msgstr "Geen games gevonden"
|
||||
|
||||
#: data/gtk/window.blp:7 data/gtk/window.blp:15
|
||||
msgid "Try a different search."
|
||||
msgstr "Probeer een andere zoekopdracht."
|
||||
msgstr "Probeer een andere zoekopdracht"
|
||||
|
||||
#: data/gtk/window.blp:21
|
||||
msgid "No Games"
|
||||
@@ -336,7 +318,7 @@ msgstr "Geen games"
|
||||
|
||||
#: data/gtk/window.blp:22
|
||||
msgid "Use the + button to add games."
|
||||
msgstr "Gebruik de plusknop om games toe te voegen."
|
||||
msgstr "Gebruik de plusknop om games toe te voegen"
|
||||
|
||||
#: data/gtk/window.blp:40
|
||||
msgid "No Hidden Games"
|
||||
@@ -344,9 +326,9 @@ msgstr "Geen verborgen games"
|
||||
|
||||
#: data/gtk/window.blp:41
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Games die u verbergt zullen hier verschijnen."
|
||||
msgstr "Games die u verbergt zullen hier verschijnen"
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
|
||||
@@ -358,82 +340,70 @@ msgstr "Game-titel"
|
||||
msgid "Play"
|
||||
msgstr "Spelen"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Game toevoegen"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Hoofdmenu"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Zoeken"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Verborgen games"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Verborgen games tonen"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sorteren"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Nieuwste"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Oudste"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Laatst gespeeld"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Verborgen games tonen"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Sneltoetsen"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Over Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Philip Goto https://flipflop97.github.io/"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Toegevoegd op {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nooit"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Laatst gespeeld: {}"
|
||||
|
||||
@@ -446,30 +416,30 @@ msgid "Add New Game"
|
||||
msgstr "Nieuwe game toevoegen"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Bevestigen"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "bestand.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programma"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\pad\\naar\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/pad/naar/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -493,150 +463,91 @@ msgstr ""
|
||||
"Indien het pad spaties bevat, zorg er dan voor dat er dubbele "
|
||||
"aanhalingstekens omheen staan!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Kon game niet toevoegen"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Game-titel mag niet leeg zijn."
|
||||
msgstr "Game-titel mag niet leeg zijn"
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Programmabestand mag niet leeg zijn."
|
||||
msgstr "Programmabestand mag niet leeg zijn"
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Kon voorkeuren niet toepassen"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} gestart"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} verborgen"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} hersteld"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} verwijderd"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Alle games verwijderd"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Een API-sleutel is vereist om SteamGridDB te gebruiken. U kunt er {}hier{} "
|
||||
"één genereren."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Installatie niet gevonden"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Selecteer een geldige map."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Ongeldige map"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Locatie instellen"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Sluiten"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Games importeren…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Geen nieuwe games gevonden"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 game geïmporteerd"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} games geïmporteerd"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} verwijderd"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Bevestigen"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Selecteer de cache-map van {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Selecteer de configuratiemap van {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Selecteer de gegevensmap van {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Kan SteamGridDB niet authenticeren"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Kan geen verbinding maken met SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifieer uw API-sleutel onder voorkeuren"
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "De titel van de game"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Ontwikkelaar"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr ""
|
||||
#~ "Te openen bestand of uit te voeren opdracht bij het starten van de game"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Bevestigen"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Steam-map kan niet worden gevonden"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Bevestigen"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Installatielocatie van Steam"
|
||||
@@ -662,9 +573,30 @@ msgstr "Verifieer uw API-sleutel onder voorkeuren"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Selecteer de cache-map van Lutris"
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Installatie niet gevonden"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Selecteer de configuratiemap van {}"
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Selecteer de gegevensmap van {}"
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Games importeren…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Covers importeren…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Geen nieuwe games gevonden"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 game geïmporteerd"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} games geïmporteerd"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Map om te gebruiken bij het importeren van games"
|
||||
|
||||
@@ -772,6 +704,9 @@ msgstr "Verifieer uw API-sleutel onder voorkeuren"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Geen nieuwe games gevonden in de Steam-bibliotheek"
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Steam-map kan niet worden gevonden"
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Steam-bibliotheek aan het ophalen"
|
||||
|
||||
|
||||
401
po/pl.po
@@ -3,15 +3,13 @@
|
||||
# This file is distributed under the same license as the Cartridges package.
|
||||
# Artur Wróblewski <krypalkora1984@gmail.com>, 2023.
|
||||
# Kshyso <Kshysio@protonmail.com>, 2023.
|
||||
# Eryk Michalak <gnu.ewm@protonmail.com>, 2023.
|
||||
# Michaks <fexwex3@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-07-24 13:05+0000\n"
|
||||
"Last-Translator: Michaks <fexwex3@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-10 16:48+0000\n"
|
||||
"Last-Translator: Kshyso <Kshysio@protonmail.com>\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/pl/>\n"
|
||||
"Language: pl\n"
|
||||
@@ -20,13 +18,13 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Kartridże"
|
||||
msgstr "Cartridges"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:4
|
||||
msgid "Game Launcher"
|
||||
@@ -38,11 +36,8 @@ msgid "Launch all your games"
|
||||
msgstr "Uruchom wszystkie swoje gry"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr "gry;gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,20 +54,18 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Biblioteka"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Edycja szczegółów gry"
|
||||
msgstr "Edytuj detale gry"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Szczegóły gry"
|
||||
msgstr "Detale gry"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferencje"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#: data/gtk/details-window.blp:25
|
||||
msgid "Cancel"
|
||||
@@ -80,35 +73,47 @@ msgstr "Anuluj"
|
||||
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "Nowa okładka"
|
||||
msgstr "Nowa Okładka"
|
||||
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "Usuń osłonę"
|
||||
msgstr "Usuń Okładkę"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Tytuł"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Tytuł gry"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Deweloper"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "Twórca lub wydawca (opcjonalnie)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Wykonywalne"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
"Plik do otwarcia lub polecenie do uruchomienia podczas uruchamiania gry"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Więcej informacji"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:102 data/gtk/game.blp:121 data/gtk/window.blp:195
|
||||
msgid "Edit"
|
||||
msgstr "Edytuj"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Ukryj"
|
||||
|
||||
@@ -117,7 +122,7 @@ msgstr "Ukryj"
|
||||
msgid "Remove"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Odkryj"
|
||||
|
||||
@@ -130,7 +135,7 @@ msgid "Quit"
|
||||
msgstr "Wyjdź"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Szukaj"
|
||||
|
||||
@@ -142,10 +147,9 @@ msgstr "Pokaż preferencje"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Skróty"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Wróć"
|
||||
msgstr "Cofnij"
|
||||
|
||||
#: data/gtk/help-overlay.blp:39
|
||||
msgid "Open menu"
|
||||
@@ -157,7 +161,7 @@ msgstr "Gry"
|
||||
|
||||
#: data/gtk/help-overlay.blp:48
|
||||
msgid "Add new game"
|
||||
msgstr "Dodaj nową gre"
|
||||
msgstr "Dodaj nową grę"
|
||||
|
||||
#: data/gtk/help-overlay.blp:53
|
||||
msgid "Import games"
|
||||
@@ -171,8 +175,7 @@ msgstr "Pokaż ukryte gry"
|
||||
msgid "Remove game"
|
||||
msgstr "Usuń grę"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Zachowanie"
|
||||
|
||||
@@ -182,7 +185,7 @@ msgstr "Wyjdź po uruchomieniu gry"
|
||||
|
||||
#: data/gtk/preferences.blp:25
|
||||
msgid "Cover Image Launches Game"
|
||||
msgstr "Obraz okładki uruchamia grę"
|
||||
msgstr "Obraz okładki startera gier"
|
||||
|
||||
#: data/gtk/preferences.blp:26
|
||||
msgid "Swaps the behavior of the cover image and the play button"
|
||||
@@ -208,118 +211,93 @@ msgstr "Strefa zagrożenia"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Usuń wszystkie gry"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importuj"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Usuń wszystkie gry"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Źródła"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Lokalizacja instalacji"
|
||||
msgstr "Położenie instalacji itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Lokalizacja pamięci podręcznej"
|
||||
msgstr "Lokalizacja Lutris Cache"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importuj gry Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importuj gry Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Zaimportuj Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importuj gry z GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importuj gry Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importuj gry w wersji Sideloaded"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Butelki"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendarne"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importuj programy uruchamiające gry"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Uwierzytelnianie"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Klucz API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Użyj SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Pobieranie obrazów podczas dodawania lub importowania gier"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Preferuj ponad Oficjalne zdjęcia"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Preferuj animowane obrazy"
|
||||
|
||||
@@ -347,9 +325,9 @@ msgstr "Brak ukrytych gier"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Gry, które ukryjesz, pojawią się tutaj."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Powrót"
|
||||
msgstr "Cofnij"
|
||||
|
||||
#: data/gtk/window.blp:121
|
||||
msgid "Game Title"
|
||||
@@ -357,84 +335,72 @@ msgstr "Tytuł gry"
|
||||
|
||||
#: data/gtk/window.blp:176
|
||||
msgid "Play"
|
||||
msgstr "Graj"
|
||||
msgstr "Uruchom"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Dodaj grę"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menu główne"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Szukaj"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Ukryte gry"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Pokaż ukryte gry"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sortuj"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Najnowsza"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Najstarszy"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Ostatnio odtwarzane"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Pokaż ukryte"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Skróty klawiaturowe"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "O Kartridżach"
|
||||
msgstr "O Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "kredyty tłumacza"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Dodano: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nigdy"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Ostatnio grane: {}"
|
||||
|
||||
@@ -444,33 +410,33 @@ msgstr "Zastosuj"
|
||||
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "Dodaj nową Grę"
|
||||
msgstr "Dodaj nową grę"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Potwierdź"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "plik.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\scieżka\\do\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/ścieżka/do/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -492,156 +458,91 @@ msgstr ""
|
||||
"\n"
|
||||
"Jeśli ścieżka zawiera spacje, pamiętaj, aby zawinąć ją w podwójne cudzysłowy!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Nie można było dodać gry"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Tytuł gry nie może być pusty."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Plik wykonywalny nie może być pusty."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Nie można zastosować preferencji"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} uruchomiony"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} ukryte"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} nieukryty"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} usunięty"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Wszystkie gry usunięte"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Do korzystania z SteamGridDB wymagany jest klucz API. Możesz go wygenerować "
|
||||
"{} tutaj{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Nie znaleziono instalacji"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Wybierz prawidłowy katalog."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Nieprawidłowy katalog"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Ustaw położenie"
|
||||
msgstr "Ustaw lokacje"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Odrzucić"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importowanie gier…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "No Games Found"
|
||||
msgid "No new games found"
|
||||
msgstr "Nie znaleziono żadnych gier"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Potwierdź"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Game Imported"
|
||||
msgid "1 game imported"
|
||||
msgstr "Gra Importowana"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
#, fuzzy
|
||||
#| msgid "Games Imported"
|
||||
msgid "{} games imported"
|
||||
msgstr "Gry Przywiezione"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} usunięty"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Wybierz katalog pamięci podręcznej {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Wybierz katalog konfiguracyjny {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Wybierz katalog z danymi {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Nie można uwierzytelnić SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Nie można połączyć się z SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Zweryfikuj swój klucz API w preferencjach"
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "Tytuł Gry"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Deweloper"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr ""
|
||||
#~ "Plik do otwarcia lub polecenie do uruchomienia podczas uruchamiania gry"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Potwierdź"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Cache Not Found"
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Nie znaleziono pamięci podręcznej"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Potwierdź"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Lokalizacja instalacji Steam"
|
||||
@@ -661,12 +562,42 @@ msgstr "Zweryfikuj swój klucz API w preferencjach"
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Wczoraj"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Nie znaleziono pamięci podręcznej"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Wybierz katalog pamięci podręcznej Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Nie znaleziono instalacji"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Wybierz {} katalog konfiguracyjny."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Wybierz {} katalog danych."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Importowanie gier…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Importowanie okładek…"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "No Games Found"
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Nie znaleziono żadnych gier"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Game Imported"
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "Gra Importowana"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Games Imported"
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "Gry Przywiezione"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Katalog używany podczas importowania gier"
|
||||
|
||||
|
||||
345
po/pt.po
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-04 22:47+0000\n"
|
||||
"Last-Translator: João Alves <joao.2003.couto@gmail.com>\n"
|
||||
"Language-Team: Portuguese <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -23,7 +23,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -37,10 +37,7 @@ msgid "Launch all your games"
|
||||
msgstr "Inicie todos os seus jogos"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;iniciador;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -59,18 +56,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Biblioteca"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Editar detalhes do jogo"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Detalhes do jogo"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferências"
|
||||
|
||||
@@ -86,21 +81,32 @@ msgstr "Nova capa"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Apagar capa"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "O título do jogo"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Desenvolvedor"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "O desenvolvedor ou publicador (opcional)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Executável"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Arquivo a ser aberto ou comando a ser executado ao iniciar o jogo"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Mais informação"
|
||||
|
||||
@@ -108,7 +114,7 @@ msgstr "Mais informação"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Ocultar"
|
||||
|
||||
@@ -117,7 +123,7 @@ msgstr "Ocultar"
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Exibir"
|
||||
|
||||
@@ -130,7 +136,7 @@ msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
@@ -142,8 +148,7 @@ msgstr "Mostrar preferências"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Atalhos"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Desfazer"
|
||||
|
||||
@@ -171,8 +176,7 @@ msgstr "Exibir jogos ocultados"
|
||||
msgid "Remove game"
|
||||
msgstr "Remover jogo"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Comportamento"
|
||||
|
||||
@@ -208,126 +212,93 @@ msgstr "Zona de perigo"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Remover todos os jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Remover todos os jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Fontes"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Local de instalação do itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Local do cache do Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importar jogos da Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importar jogos da Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importar jogos da Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importar jogos do GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importar jogos da Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importar jogos adicionados manualmente"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Iniciador de jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Autenticação"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Chave da API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Usar SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Baixa imagens ao adicionar ou importar jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Preferir mais que as imagens oficiais"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Preferir imagens animadas"
|
||||
|
||||
@@ -355,7 +326,7 @@ msgstr "Sem jogos ocultados"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Jogos ocultados vão aparecer aqui."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
|
||||
@@ -367,82 +338,70 @@ msgstr "Título do jogo"
|
||||
msgid "Play"
|
||||
msgstr "Jogar"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Adicionar jogo"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Buscar"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Jogos ocultados"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Exibir jogos ocultados"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Ordenar"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Mais novo"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Mais antigo"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Última vez jogado"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Mostrar ocultados"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Atalhos de teclado"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Sobre o Cartuchos"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Pedro Sader Azevedo"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Adicionado: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nunca"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Última vez jogado"
|
||||
|
||||
@@ -455,30 +414,30 @@ msgid "Add New Game"
|
||||
msgstr "Adicionar novo jogo"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "arquivo.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programa"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\caminho\\para\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/caminho/para/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -500,162 +459,92 @@ msgstr ""
|
||||
"\n"
|
||||
"Se o caminho contiver espaços, certifique-se de colocá-lo entre aspas duplas!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Não foi possível adicionar o jogo"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "O título do jogo não pode estar vazio."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "O executável não pode estar vazio."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Não foi possível aplicar as preferências"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} iniciado"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} está oculto"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} está exposto"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} removido"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Todos os jogos foram removidos"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Uma chave da API é necessária para usar a SteamGridDB. Você pode gerar uma "
|
||||
"chave {}aqui{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
#, fuzzy
|
||||
#| msgid "Installation Not Found"
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Instalação não encontrada"
|
||||
|
||||
#: src/preferences.py:296
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Selecione o diretório de informações de {}."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Definir local"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Dispensar"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importando jogos…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Nenhum jogo novo encontrado"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 jogo importado"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} jogos importados"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} removido"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Selecione o diretório de informações de {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} configuration directory."
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Selecione o diretório de configuração de {}."
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
#, fuzzy
|
||||
#| msgid "Select the {} data directory."
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Selecione o diretório de informações de {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Não foi possível conectar à SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "O título do jogo"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Desenvolvedor"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr "Arquivo a ser aberto ou comando a ser executado ao iniciar o jogo"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Confirmar"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "O diretório da Steam não foi encontrado."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Confirmar"
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Local de instalação da Steam"
|
||||
|
||||
@@ -680,9 +569,30 @@ msgstr ""
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Selecione o diretório de cache do Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Instalação não encontrada"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Selecione o diretório de configuração de {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Selecione o diretório de informações de {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Importando jogos…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Importando capas…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Nenhum jogo novo encontrado"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 jogo importado"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} jogos importados"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Diretório para usar ao importar jogos"
|
||||
|
||||
@@ -793,5 +703,8 @@ msgstr ""
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Nenhum jogo novo foi encontrado na biblioteca da Steam."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "O diretório da Steam não foi encontrado."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Falando com a Steam"
|
||||
|
||||
355
po/pt_BR.po
@@ -3,15 +3,13 @@
|
||||
# This file is distributed under the same license as the Cartridges package.
|
||||
# Henrique Machado <henriquecamposrj@gmail.com>, 2023.
|
||||
# Vinícius Gama Santos <vinny.stalck@protonmail.com>, 2023.
|
||||
# Vítor Fernandes Almado <vfalmado@gmail.com>, 2023.
|
||||
# Rafael Fontenelle <rafaelff@gnome.org>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-16 13:41+0000\n"
|
||||
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-02 15:40+0000\n"
|
||||
"Last-Translator: Vinícius Gama Santos <vinny.stalck@protonmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
|
||||
"cartridges/cartridges/pt_BR/>\n"
|
||||
"Language: pt_BR\n"
|
||||
@@ -19,11 +17,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartuchos"
|
||||
|
||||
@@ -37,11 +35,8 @@ msgid "Launch all your games"
|
||||
msgstr "Inicie todos os seus jogos"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr ""
|
||||
"Jogos;lançador;gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;"
|
||||
"legendary;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "jogos;gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +54,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Biblioteca"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Editar detalhes do jogo"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Detalhes do jogo"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferências"
|
||||
|
||||
@@ -86,19 +79,32 @@ msgstr "Nova capa"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Excluir capa"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Desenvolvedor (opcional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "O título do jogo"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Desenvolvedor"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "O desenvolvedor ou publicador (opcional)"
|
||||
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Executável"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Arquivo a ser aberto ou comando a ser executado ao iniciar o jogo"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Mais informações"
|
||||
|
||||
@@ -106,7 +112,7 @@ msgstr "Mais informações"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Esconder"
|
||||
|
||||
@@ -115,7 +121,7 @@ msgstr "Esconder"
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Exibir"
|
||||
|
||||
@@ -128,7 +134,7 @@ msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
@@ -140,8 +146,7 @@ msgstr "Mostrar preferências"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Atalhos"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Desfazer"
|
||||
|
||||
@@ -169,8 +174,7 @@ msgstr "Exibir jogos ocultos"
|
||||
msgid "Remove game"
|
||||
msgstr "Remover jogo"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Comportamento"
|
||||
|
||||
@@ -206,114 +210,93 @@ msgstr "Zona de Perigo"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Remover todos os jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Remover jogos desinstalados"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Fontes"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Local de instalação"
|
||||
msgstr "Local de instalação do itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Local do cache"
|
||||
msgstr "Local do cache do Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importar jogos do Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importar jogos do Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importar jogos da Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importar jogos do GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importar jogos da Amazon"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importar jogos adicionados manualmente"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Garrafas"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Lendário"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importar iniciadores de jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Autenticação"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Chave da API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Usar SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Baixar imagens ao adicionar ou importar jogos"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Preferir mais que as imagens oficiais"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Preferir imagens animadas"
|
||||
|
||||
@@ -341,7 +324,7 @@ msgstr "Sem jogos ocultos"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Os jogos ocultos aparecerão aqui."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
|
||||
@@ -353,78 +336,70 @@ msgstr "Título do jogo"
|
||||
msgid "Play"
|
||||
msgstr "Jogar"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Adicionar jogo"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Menu Principal"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
msgid "Search games"
|
||||
msgstr "Buscar jogos"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Jogos ocultos"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
msgid "Search hidden games"
|
||||
msgstr "Buscar jogos ocultos"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Ordenar"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Mais novo"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Mais antigo"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Última vez jogado"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Mostrar ocultados"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Atalhos de teclado"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Sobre o Cartuchos"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Pedro Sader Azevedo, Vinícius \"Stalck\""
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Adicionado: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Nunca"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Jogado pela última vez: {}"
|
||||
|
||||
@@ -437,30 +412,30 @@ msgid "Add New Game"
|
||||
msgstr "Adicionar novo jogo"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr "Adicionar"
|
||||
msgid "Confirm"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "arquivo.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "programa"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\caminho\\para\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/caminho/para/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -482,147 +457,91 @@ msgstr ""
|
||||
"\n"
|
||||
"Se o caminho contiver espaços, certifique-se de colocá-lo entre aspas duplas!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Não foi possível adicionar o jogo"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "O título do jogo não pode estar vazio."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "O executável não pode estar vazio."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Não foi possível aplicar as preferências"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} iniciado"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} ocultado"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} exibido"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} removido"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Todos os jogos foram removidos"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Uma chave de API é necessária para utilizar o SteamGridDB. Você pode gerar "
|
||||
"uma {}aqui{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Instalação não encontrada"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Selecione um diretório válido."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Diretório inválido"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Definir local"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Dispensar"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importando jogos…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
msgstr "Atenção"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "Ocorreram os seguintes erros durante a importação:"
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Nenhum jogo novo encontrado"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 jogo importado"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} jogos importados"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
msgid "1 removed"
|
||||
msgstr "1 removido"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Selecione o diretório de cache do(a) {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Selecione o diretório de configuração do(a) {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Selecione o diretório de dados do(a) {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Não foi possível autenticar ao SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Não foi possível conectar-se ao SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifique sua chave API nas preferências"
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "O título do jogo"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Desenvolvedor"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr "Arquivo a ser aberto ou comando a ser executado ao iniciar o jogo"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Confirmar"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Cache Not Found"
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Cache não encontrado"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Confirmar"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Local de instalação do Steam"
|
||||
@@ -642,12 +561,36 @@ msgstr "Verifique sua chave API nas preferências"
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Ontem"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Cache não encontrado"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Selecione o diretório de cache do Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Instalação não encontrada"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Selecione o diretório de configuração do(a) {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Selecione o diretório de dados do(a) {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Importando jogos…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Importando capas…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Nenhum jogo novo encontrado"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 jogo importado"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} jogos importados"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Diretório para usar ao importar jogos"
|
||||
|
||||
|
||||
284
po/ro.po
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-04-04 17:12+0000\n"
|
||||
"Last-Translator: Matt C <matei.gurzu@gmail.com>\n"
|
||||
"Language-Team: Romanian <https://hosted.weblate.org/projects/cartridges/"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartușe"
|
||||
|
||||
@@ -35,8 +35,7 @@ msgid "Launch all your games"
|
||||
msgstr "Lansați toate jocurile dvs"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr ""
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -59,18 +58,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliotecă"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Editați detaliile jocului"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Detalii joc"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Preferințe"
|
||||
|
||||
@@ -86,19 +83,32 @@ msgstr ""
|
||||
msgid "Delete Cover"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr ""
|
||||
|
||||
@@ -106,7 +116,7 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
|
||||
@@ -115,7 +125,7 @@ msgstr ""
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr ""
|
||||
|
||||
@@ -128,7 +138,7 @@ msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Căutare"
|
||||
|
||||
@@ -140,8 +150,7 @@ msgstr ""
|
||||
msgid "Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr ""
|
||||
|
||||
@@ -169,8 +178,7 @@ msgstr ""
|
||||
msgid "Remove game"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr ""
|
||||
|
||||
@@ -206,118 +214,89 @@ msgstr ""
|
||||
msgid "Remove All Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
msgid "Install Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
msgid "Cache Location"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Lansator de jocuri"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Lansator de jocuri"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr ""
|
||||
|
||||
@@ -345,7 +324,7 @@ msgstr "Fără jocuri ascunse"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Jocurile pe care le ascundeți vor apărea aici."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Înapoi"
|
||||
|
||||
@@ -357,82 +336,70 @@ msgstr "Titlul jocului"
|
||||
msgid "Play"
|
||||
msgstr "Joacă"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Adăugați joc"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Meniu principal"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Căutare"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Jocuri ascunse"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "No Hidden Games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Fără jocuri ascunse"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr ""
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr ""
|
||||
|
||||
@@ -445,30 +412,30 @@ msgid "Add New Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr ""
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -481,127 +448,90 @@ msgid ""
|
||||
"If the path contains spaces, make sure to wrap it in double quotes!"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr ""
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr ""
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr ""
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
#, fuzzy
|
||||
#| msgid "Game Launcher"
|
||||
msgid "Importing Games…"
|
||||
msgstr "Lansator de jocuri"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
#, fuzzy
|
||||
#| msgid "No Games Found"
|
||||
msgid "No new games found"
|
||||
msgstr "Nu s-au găsit jocuri"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
#: src/importer/sources/source.py:108
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
msgid "1 removed"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "No Games Found"
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Nu s-au găsit jocuri"
|
||||
|
||||
#~ msgid "Launch your games"
|
||||
#~ msgstr "Lansați-vă jocurile"
|
||||
|
||||
404
po/ru.po
@@ -3,13 +3,12 @@
|
||||
# This file is distributed under the same license as the cartridges package.
|
||||
# Сергей <asvmail.as@gmail.com>, 2023.
|
||||
# kramo <contact@kramo.hu>, 2023.
|
||||
# Сергей Ворон <voron.s.a@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-27 14:03+0200\n"
|
||||
"PO-Revision-Date: 2023-08-29 10:45+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-26 04:40+0000\n"
|
||||
"Last-Translator: Сергей <asvmail.as@gmail.com>\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/ru/>\n"
|
||||
@@ -17,13 +16,13 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.0.1-dev\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 4.18.1\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:176
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Картриджи"
|
||||
|
||||
@@ -37,11 +36,8 @@ 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 ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
"игры;стим;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;launcher;steam;lutris;heroic;bottles;itch;игры;стим;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +55,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Библиотека"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:71
|
||||
msgid "Game Details"
|
||||
msgstr "Подробности об игре"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:430
|
||||
#: src/details_window.py:265 src/importer/importer.py:301
|
||||
#: src/importer/importer.py:352
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Параметры"
|
||||
|
||||
@@ -78,31 +72,40 @@ msgstr "Параметры"
|
||||
msgid "Cancel"
|
||||
msgstr "Отменить"
|
||||
|
||||
#: data/gtk/details-window.blp:58
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "Новая обложка"
|
||||
|
||||
#: data/gtk/details-window.blp:77
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "Удалить обложку"
|
||||
|
||||
#: data/gtk/details-window.blp:105 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Название"
|
||||
|
||||
#: data/gtk/details-window.blp:109
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Разработчик (необязательно)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Название игры"
|
||||
|
||||
#: data/gtk/details-window.blp:115
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "Исполняемый"
|
||||
|
||||
#: data/gtk/details-window.blp:121
|
||||
msgid "Select File"
|
||||
msgstr "Выбрать файл"
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Файл для открытия или команда для запуска игры"
|
||||
|
||||
#: data/gtk/details-window.blp:132
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Дополнительная информация"
|
||||
|
||||
@@ -110,29 +113,29 @@ msgstr "Дополнительная информация"
|
||||
msgid "Edit"
|
||||
msgstr "Редактировать"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:190
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Скрыть"
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:215
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:192
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Показать"
|
||||
|
||||
#: data/gtk/help-overlay.blp:11 data/gtk/preferences.blp:9
|
||||
msgid "General"
|
||||
msgstr "Общее"
|
||||
msgstr "Основное"
|
||||
|
||||
#: data/gtk/help-overlay.blp:14
|
||||
msgid "Quit"
|
||||
msgstr "Выйти"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:226 data/gtk/window.blp:269
|
||||
#: data/gtk/window.blp:336
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Поиск"
|
||||
|
||||
@@ -144,8 +147,7 @@ msgstr "Показать параметры"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Комбинации клавиш"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:124
|
||||
#: src/importer/importer.py:376
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Вернуть"
|
||||
|
||||
@@ -173,24 +175,23 @@ msgstr "Показать скрытые игры"
|
||||
msgid "Remove game"
|
||||
msgstr "Удалить игру"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:88
|
||||
#: data/gtk/preferences.blp:339
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Поведение"
|
||||
|
||||
#: data/gtk/preferences.blp:16
|
||||
msgid "Exit After Launching Games"
|
||||
msgstr "Выход из приложения после запуска игры"
|
||||
msgstr "Выход после запуска игр"
|
||||
|
||||
#: data/gtk/preferences.blp:25
|
||||
msgid "Cover Image Launches Game"
|
||||
msgstr "Запускать игры используя изображение обложки"
|
||||
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:85
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr "Изображения"
|
||||
|
||||
@@ -210,118 +211,93 @@ msgstr "Небезопасная область"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Удалить все игры"
|
||||
|
||||
#: data/gtk/preferences.blp:84 data/gtk/window.blp:27 data/gtk/window.blp:456
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Импорт"
|
||||
msgstr "Импортировать"
|
||||
|
||||
#: data/gtk/preferences.blp:91
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Удалять деинсталлированные игры"
|
||||
|
||||
#: data/gtk/preferences.blp:101
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Источники"
|
||||
|
||||
#: data/gtk/preferences.blp:104
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:108 data/gtk/preferences.blp:125
|
||||
#: data/gtk/preferences.blp:172 data/gtk/preferences.blp:225
|
||||
#: data/gtk/preferences.blp:242 data/gtk/preferences.blp:259
|
||||
#: data/gtk/preferences.blp:276 data/gtk/preferences.blp:293
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Место установки"
|
||||
msgstr "Место установки itch"
|
||||
|
||||
#: data/gtk/preferences.blp:121
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:137
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Расположение кэша"
|
||||
msgstr "Расположение кэша Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:149
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Импорт игр Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:158
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Импорт игр Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:168
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:184
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Импорт игр Epic"
|
||||
|
||||
#: data/gtk/preferences.blp:193
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Импорт игр GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:202
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Импорт игр Amazon"
|
||||
|
||||
#: data/gtk/preferences.blp:211
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Импорт сторонних игр"
|
||||
|
||||
#: data/gtk/preferences.blp:221
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:255
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:272
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:289
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:305
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Импорт средств запуска игр"
|
||||
|
||||
#: data/gtk/preferences.blp:315
|
||||
msgid "Desktop Entries"
|
||||
msgstr "Интеграция в среду рабочего стола"
|
||||
|
||||
#: data/gtk/preferences.blp:327
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:331
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Аутентификация"
|
||||
|
||||
#: data/gtk/preferences.blp:334
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API-ключ"
|
||||
|
||||
#: data/gtk/preferences.blp:342
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Использовать SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:343
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Загрузка изображений при добавлении или импорте игр"
|
||||
|
||||
#: data/gtk/preferences.blp:352
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Отдавать предпочтение официальным изображениям"
|
||||
|
||||
#: data/gtk/preferences.blp:361
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Отдавать предпочтение анимированным изображениям"
|
||||
|
||||
@@ -349,7 +325,7 @@ msgstr "Нет скрытых игр"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Здесь появятся скрытые игры."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
|
||||
@@ -361,118 +337,106 @@ msgstr "Название игры"
|
||||
msgid "Play"
|
||||
msgstr "Играть"
|
||||
|
||||
#: data/gtk/window.blp:255 data/gtk/window.blp:449
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Добавить игру"
|
||||
|
||||
#: data/gtk/window.blp:262 data/gtk/window.blp:329
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Главное меню"
|
||||
|
||||
#: data/gtk/window.blp:284
|
||||
msgid "Search games"
|
||||
msgstr "Поиск игр"
|
||||
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Скрытые игры"
|
||||
|
||||
#: data/gtk/window.blp:351
|
||||
msgid "Search hidden games"
|
||||
msgstr "Поиск скрытых игр"
|
||||
|
||||
#: data/gtk/window.blp:388
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Сортировать"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "А-Я"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Я-А"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Сначала новые"
|
||||
|
||||
#: data/gtk/window.blp:409
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Сначала старые"
|
||||
|
||||
#: data/gtk/window.blp:415
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Последняя игра"
|
||||
|
||||
#: data/gtk/window.blp:422
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Показать скрытые"
|
||||
|
||||
#: data/gtk/window.blp:435
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Комбинации клавиш"
|
||||
|
||||
#: data/gtk/window.blp:440
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "О приложении"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:195
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Ser82-png"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:213
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Добавлено: {}"
|
||||
|
||||
#: src/window.py:216
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Никогда"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:220
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Последний раз запускалась: {}"
|
||||
msgstr "Последняя игра: {}"
|
||||
|
||||
#: src/details_window.py:76
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr "Применить"
|
||||
|
||||
#: src/details_window.py:82
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "Добавить новую игру"
|
||||
|
||||
#: src/details_window.py:83
|
||||
msgid "Add"
|
||||
msgstr "Добавить"
|
||||
|
||||
#: src/details_window.py:93
|
||||
msgid "Executables"
|
||||
msgstr "Исполняемые"
|
||||
#: src/details_window.py:79
|
||||
msgid "Confirm"
|
||||
msgstr "Подтвердить"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:108
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "file.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:110
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "программа"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:115 src/details_window.py:117
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\путь\\к\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:121 src/details_window.py:123
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/путь/к/{}"
|
||||
|
||||
#: src/details_window.py:128
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -494,19 +458,19 @@ msgstr ""
|
||||
"\n"
|
||||
"Если путь содержит пробелы, обязательно заключите его в двойные кавычки!"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:177
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Не удалось добавить игру"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:207
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Название игры не может быть пустым."
|
||||
|
||||
#: src/details_window.py:177 src/details_window.py:215
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Исполняемый файл не может быть пустым."
|
||||
|
||||
#: src/details_window.py:206 src/details_window.py:214
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Не удалось применить параметры"
|
||||
|
||||
@@ -516,141 +480,69 @@ msgid "{} launched"
|
||||
msgstr "{} - запущена"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} - скрытая"
|
||||
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} - не скрыта"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:172 src/importer/importer.py:373
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} удалена"
|
||||
|
||||
#: src/preferences.py:123
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Все игры удалены"
|
||||
|
||||
#: src/preferences.py:172
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Для использования SteamGridDB требуется ключ API. Вы можете сгенерировать "
|
||||
"его {}здесь{}."
|
||||
|
||||
#: src/preferences.py:293
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Установка не найдена"
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Выберите действующий каталог."
|
||||
|
||||
#: src/preferences.py:330 src/importer/importer.py:299
|
||||
msgid "Warning"
|
||||
msgstr "Предупреждение"
|
||||
|
||||
#: src/preferences.py:364
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Неверный каталог"
|
||||
|
||||
#: src/preferences.py:370
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Установить расположение"
|
||||
|
||||
#: src/utils/create_dialog.py:33 src/importer/importer.py:300
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Отклонить"
|
||||
|
||||
#: src/importer/importer.py:137
|
||||
msgid "Importing Games…"
|
||||
msgstr "Импорт игр…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:320
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "При импорте возникли следующие ошибки:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:349
|
||||
msgid "No new games found"
|
||||
msgstr "Новых игр не найдено"
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Подтвердить"
|
||||
|
||||
#: src/importer/importer.py:361
|
||||
msgid "1 game imported"
|
||||
msgstr "1 игра импортирована"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:365
|
||||
msgid "{} games imported"
|
||||
msgstr "{} игр(ы) импортировано"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:369
|
||||
msgid "1 removed"
|
||||
msgstr "1 удалена"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Выберите каталог кэша {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Выберите каталог конфигурации {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Выберите каталог данных {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Не удалось пройти аутентификацию SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Проверьте ключ API-ключ в параметрах"
|
||||
|
||||
#~ msgid "Terminal"
|
||||
#~ msgstr "Терминал"
|
||||
|
||||
#~ msgid "Used only by games that require one to run"
|
||||
#~ msgstr "Используется только играми, требующими его запуска"
|
||||
|
||||
#~ msgid "Custom"
|
||||
#~ 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
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Не удалось найти каталог Steam."
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Не удалось подключиться к SteamGridDB"
|
||||
|
||||
#~ msgid "Cache"
|
||||
#~ msgstr "Кэш"
|
||||
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Конфигурация"
|
||||
|
||||
#~ msgid "Invalid {} Location for {{}}"
|
||||
#~ msgstr "Неверное расположение {} для {{}}"
|
||||
|
||||
#~ msgid "Pick a new one or disable the source in preferences"
|
||||
#~ msgstr "Выберите новый или отключите имеющийся источник в параметрах"
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Место установки Steam"
|
||||
@@ -676,9 +568,30 @@ msgstr "Проверьте ключ API-ключ в параметрах"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Выберите каталог кэша Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Установка не найдена"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Выберите каталог конфигурации {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Выберите каталог данных {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Импорт игр…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Импорт обложек…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Новых игр не найдено"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 игра импортирована"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} игр(ы) импортировано"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Каталог для импорта игр"
|
||||
|
||||
@@ -788,5 +701,8 @@ msgstr "Проверьте ключ API-ключ в параметрах"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "В библиотеке Steam новых игр не найдено."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Не удалось найти каталог Steam."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Общение со Steam"
|
||||
|
||||
356
po/sv.po
@@ -3,14 +3,13 @@
|
||||
# This file is distributed under the same license as the Cartridges package.
|
||||
# micke <mikanybe@gmail.com>, 2023.
|
||||
# micke <micke@users.noreply.hosted.weblate.org>, 2023.
|
||||
# Luna Jernberg <droidbittin@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-07-08 14:52+0000\n"
|
||||
"Last-Translator: Luna Jernberg <droidbittin@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-02 15:40+0000\n"
|
||||
"Last-Translator: micke <micke@users.noreply.hosted.weblate.org>\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/sv/>\n"
|
||||
"Language: sv\n"
|
||||
@@ -18,11 +17,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Cartridges"
|
||||
|
||||
@@ -36,12 +35,8 @@ msgid "Launch all your games"
|
||||
msgstr "Starta alla dina spel"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgstr ""
|
||||
"gaming;spelstartare;steam;lutris;heroic;bottles;itch;flatpak;legendary;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "gaming;spelstartare;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -58,18 +53,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Bibliotek"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Redigera speldetaljer"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Speldetaljer"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Inställningar"
|
||||
|
||||
@@ -85,21 +78,32 @@ msgstr "Nytt omslag"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Ta bort omslag"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Spelets titel"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Utvecklare"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "Utvecklaren eller utgivaren (valfritt)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Körbar"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Fil som ska öppnas eller kommando som ska köras när spelet startas"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Mer info"
|
||||
|
||||
@@ -107,7 +111,7 @@ msgstr "Mer info"
|
||||
msgid "Edit"
|
||||
msgstr "Redigera"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Dölj"
|
||||
|
||||
@@ -116,7 +120,7 @@ msgstr "Dölj"
|
||||
msgid "Remove"
|
||||
msgstr "Ta bort"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Visa"
|
||||
|
||||
@@ -129,7 +133,7 @@ msgid "Quit"
|
||||
msgstr "Avsluta"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Sök"
|
||||
|
||||
@@ -141,8 +145,7 @@ msgstr "Visa inställningar"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Genvägar"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Ångra"
|
||||
|
||||
@@ -170,8 +173,7 @@ msgstr "Visa dolda spel"
|
||||
msgid "Remove game"
|
||||
msgstr "Ta bort spel"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Beteende"
|
||||
|
||||
@@ -208,116 +210,93 @@ msgstr "Farozon"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Ta bort alla spel"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Importera"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Ta bort alla spel"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Källor"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Plats för installation"
|
||||
msgstr "itch-installationsplats"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Plats för cacheminne"
|
||||
msgstr "Plats för Lutris cache"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Importera Steam-spel"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Importera Flatpak-spel"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Importera Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Importera GOG-spel"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Importera Amazon-spel"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Importera sidoladdade spel"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Importera spelstartare"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Autentisering"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API-nyckel"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Använd SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Ladda ner bilder när spel läggs till eller importeras"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Föredra framför officiella bilder"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Föredra animerade bilder"
|
||||
|
||||
@@ -345,7 +324,7 @@ msgstr "Inga dolda spel"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Spel som du döljer kommer visas här."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Bakåt"
|
||||
|
||||
@@ -357,82 +336,70 @@ msgstr "Speltitel"
|
||||
msgid "Play"
|
||||
msgstr "Spela"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Lägg till spel"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Huvudmeny"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Sök"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Dolda spel"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Visa dolda spel"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sortering"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Ö"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Ö-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Nyaste"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Äldsta"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Senast spelad"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Visa dolda"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Tangentbordsgenvägar"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Om Cartridges"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Micke"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Tillagt: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Aldrig"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Senast spelat: {}"
|
||||
|
||||
@@ -445,30 +412,30 @@ msgid "Add New Game"
|
||||
msgstr "Lägg till nytt spel"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Bekräfta"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "fil.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\sökväg\\till\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/sökväg/till/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -491,146 +458,90 @@ msgstr ""
|
||||
"Om sökvägen innehåller mellanslag, se till att den omsluts av dubbla "
|
||||
"citationstecken!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Kunde inte lägga till spelet"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Spelets titel kan inte vara tom."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Den körbara filen kan inte vara tom."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Kunde inte tillämpa inställningar"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} startat"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} dolt"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} synlig"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} borttaget"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Alla spel togs bort"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"En API-nyckel krävs för att använda SteamGridDB. Du kan generera en {}här{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Installation hittades inte"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Välj en giltig katalog."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Ogiltig katalog"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Ange plats"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Avvisa"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Importerar spel…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Inga nya spel hittades"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 spel Importerat"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} spel importerade"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} borttaget"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Bekräfta"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Välj {} cachekatalog."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Välj {} konfigurationskatalog."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Välj {} datakatalog."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Kunde inte autentisera SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Kunde inte ansluta till SteamGridDB"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Verifiera din API-nyckel i inställningar"
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "Spelets titel"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Utvecklare"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr "Fil som ska öppnas eller kommando som ska köras när spelet startas"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Bekräfta"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Cache inte hittad"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Bekräfta"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam-installationsplats"
|
||||
@@ -650,12 +561,36 @@ msgstr "Verifiera din API-nyckel i inställningar"
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Igår"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Cache inte hittad"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Välj Lutris cache-mapp."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Installationen hittades inte"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Välj konfigurationsmappen {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Välj datamappen {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Importerar spel…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Importerar omslagsbilder…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Inga nya spel hittades"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 spel Importerat"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} spel importerade"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Mapp att använda för importering av spel"
|
||||
|
||||
@@ -689,6 +624,3 @@ msgstr "Verifiera din API-nyckel i inställningar"
|
||||
#~ msgstr ""
|
||||
#~ "Du verkar ha flera Steam-bibliotek. Vill du lägga till dem i "
|
||||
#~ "inställningar?"
|
||||
|
||||
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
#~ msgstr "gaming;spelstartare;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
410
po/ta.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-27 14:03+0200\n"
|
||||
"PO-Revision-Date: 2023-08-29 10:45+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-29 18:48+0000\n"
|
||||
"Last-Translator: \"K.B.Dharun Krishna\" <kbdharunkrishna@gmail.com>\n"
|
||||
"Language-Team: Tamil <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/ta/>\n"
|
||||
@@ -18,11 +18,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.1-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:176
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "கார்ட்ரிட்ஜ்கள்"
|
||||
|
||||
@@ -36,11 +36,8 @@ 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;பாட்டில்கள்;itch;flatpak;legendary;"
|
||||
"Retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "விளையாட்டு; துவக்கி; steam;lutris;heroic;பாட்டில்கள்;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -49,27 +46,26 @@ msgid ""
|
||||
"necessary. You can sort and hide games or download cover art from "
|
||||
"SteamGridDB."
|
||||
msgstr ""
|
||||
"உங்கள் எல்லா விளையாட்டுகளுக்கும் கேட்ரிட்ஜ்கள் ஒரு எளிய விளையாட்டு துவக்கி ஆகும். Steam, "
|
||||
"Lutris, Heroic மற்றும் பலவற்றிலிருந்து விளையாட்டுகளை இறக்குமதி செய்வதற்கான ஆதரவை இது "
|
||||
"கொண்டுள்ளது. நீங்கள் விளையாட்டுகளை வரிசைப்படுத்தலாம் மற்றும் மறைக்கலாம் அல்லது SteamGridDB "
|
||||
"இலிருந்து அட்டைப்பட கலையைப் பதிவிறக்கலாம்."
|
||||
"உங்கள் எல்லா விளையாட்டுகளுக்கும் கேட்ரிட்ஜ்கள் ஒரு எளிய விளையாட்டு துவக்கி ஆகும். ஸ்டீம் "
|
||||
"(Steam), லுட்ரிஸ் (Lutris), வீரம் (Heroic) மற்றும் பலவற்றிலிருந்து விளையாட்டுகளை "
|
||||
"இறக்குமதி செய்வதற்கான ஆதரவை இது கொண்டுள்ளது. நீங்கள் விளையாட்டுகளை வரிசைப்படுத்தலாம் "
|
||||
"மற்றும் மறைக்கலாம் அல்லது ஸ்டீம்கிரிட் டிபி (SteamGridDB) இலிருந்து அட்டைப்பட கலையைப் "
|
||||
"பதிவிறக்கலாம்."
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:30
|
||||
msgid "Library"
|
||||
msgstr "நூலகம்"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:71
|
||||
msgid "Game Details"
|
||||
msgstr "விளையாட்டு விவரங்கள்"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:430
|
||||
#: src/details_window.py:265 src/importer/importer.py:301
|
||||
#: src/importer/importer.py:352
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "விருப்பங்கள்"
|
||||
|
||||
@@ -77,31 +73,40 @@ msgstr "விருப்பங்கள்"
|
||||
msgid "Cancel"
|
||||
msgstr "ரத்துசெய்"
|
||||
|
||||
#: data/gtk/details-window.blp:58
|
||||
#: data/gtk/details-window.blp:57
|
||||
msgid "New Cover"
|
||||
msgstr "புதிய அட்டை"
|
||||
|
||||
#: data/gtk/details-window.blp:77
|
||||
#: data/gtk/details-window.blp:75
|
||||
msgid "Delete Cover"
|
||||
msgstr "அட்டையை நீக்கு"
|
||||
|
||||
#: data/gtk/details-window.blp:105 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "தலைப்பு"
|
||||
|
||||
#: data/gtk/details-window.blp:109
|
||||
msgid "Developer (optional)"
|
||||
msgstr "டெவலப்பர் (விரும்பினால்)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "விளையாட்டின் தலைப்பு"
|
||||
|
||||
#: data/gtk/details-window.blp:115
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "செயல்படுத்தக்கூடியது"
|
||||
|
||||
#: data/gtk/details-window.blp:121
|
||||
msgid "Select File"
|
||||
msgstr "கோப்பைத் தேர்ந்தெடுக்கவும்"
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "விளையாட்டைத் தொடங்கும் போது திறக்க கோப்பு அல்லது இயக்க கட்டளை"
|
||||
|
||||
#: data/gtk/details-window.blp:132
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "மேலும் தகவல்"
|
||||
|
||||
@@ -109,16 +114,16 @@ msgstr "மேலும் தகவல்"
|
||||
msgid "Edit"
|
||||
msgstr "தொகு"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:190
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "மறை"
|
||||
|
||||
#: data/gtk/game.blp:112 data/gtk/game.blp:131 data/gtk/preferences.blp:56
|
||||
#: data/gtk/window.blp:215
|
||||
#: data/gtk/window.blp:209
|
||||
msgid "Remove"
|
||||
msgstr "அகற்று"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:192
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "மறை காட்டு"
|
||||
|
||||
@@ -130,8 +135,8 @@ msgstr "பொது"
|
||||
msgid "Quit"
|
||||
msgstr "வெளியேறு"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:226 data/gtk/window.blp:269
|
||||
#: data/gtk/window.blp:336
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "தேடு"
|
||||
|
||||
@@ -143,8 +148,7 @@ msgstr "விருப்பங்களைக் காட்டு"
|
||||
msgid "Shortcuts"
|
||||
msgstr "குறுக்குவழிகள்"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:124
|
||||
#: src/importer/importer.py:376
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "செயல்தவிர்"
|
||||
|
||||
@@ -172,8 +176,7 @@ msgstr "மறைக்கப்பட்ட விளையாட்டுக
|
||||
msgid "Remove game"
|
||||
msgstr "விளையாட்டை அகற்று"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:88
|
||||
#: data/gtk/preferences.blp:339
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "நடத்தை"
|
||||
|
||||
@@ -189,7 +192,7 @@ msgstr "அட்டைப் படம் விளையாட்டை தொ
|
||||
msgid "Swaps the behavior of the cover image and the play button"
|
||||
msgstr "அட்டைப் படத்தின் நடத்தை மற்றும் பிளே பட்டனை மாற்றுகிறது"
|
||||
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:85
|
||||
#: data/gtk/preferences.blp:36 src/details_window.py:81
|
||||
msgid "Images"
|
||||
msgstr "படங்கள்"
|
||||
|
||||
@@ -209,119 +212,94 @@ msgstr "ஆபத்து மண்டலம்"
|
||||
msgid "Remove All Games"
|
||||
msgstr "அனைத்து விளையாட்டுகளையும் அகற்று"
|
||||
|
||||
#: data/gtk/preferences.blp:84 data/gtk/window.blp:27 data/gtk/window.blp:456
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "இறக்குமதி"
|
||||
|
||||
#: data/gtk/preferences.blp:91
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "நிறுவல் நீக்கப்பட்ட விளையாட்டுகளை அகற்று"
|
||||
|
||||
#: data/gtk/preferences.blp:101
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "மூலங்கள்"
|
||||
|
||||
#: data/gtk/preferences.blp:104
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
msgstr "Steam (ஸ்டீம்)"
|
||||
|
||||
#: data/gtk/preferences.blp:108 data/gtk/preferences.blp:125
|
||||
#: data/gtk/preferences.blp:172 data/gtk/preferences.blp:225
|
||||
#: data/gtk/preferences.blp:242 data/gtk/preferences.blp:259
|
||||
#: data/gtk/preferences.blp:276 data/gtk/preferences.blp:293
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "நிறுவல் இடம்"
|
||||
msgstr "அரிப்பு (itch) நிறுவல் இடம்"
|
||||
|
||||
#: data/gtk/preferences.blp:121
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
msgstr "லூட்ரிஸ்"
|
||||
|
||||
#: data/gtk/preferences.blp:137
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "தற்காலிக சேமிப்பு இடம்"
|
||||
msgstr "லுட்ரிஸ் தற்காலிக சேமிப்பு இடம்"
|
||||
|
||||
#: data/gtk/preferences.blp:149
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Steam விளையாட்டுகளை இறக்குமதி செய்யவும்"
|
||||
msgstr "ஸ்டீம் (Steam) விளையாட்டுகளை இறக்குமதி செய்யவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:158
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Flatpak கேம்களை இறக்குமதி செய்யவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:168
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
msgstr "Heroic (ஹீரோயிக்)"
|
||||
|
||||
#: data/gtk/preferences.blp:184
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Epic விளையாட்டுகளை இறக்குமதி செய்"
|
||||
|
||||
#: data/gtk/preferences.blp:193
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "GOG விளையாட்டுகளை இறக்குமதி செய்யவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:202
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Amazon விளையாட்டுகளை இறக்குமதி செய்யவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:211
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "பக்க ஏற்றப்பட்ட விளையாட்டுகளை இறக்குமதி செய்யவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:221
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "பாட்டில்கள்"
|
||||
msgstr "Bottles (பாட்டில்கள்)"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
msgstr "அரிப்பு (itch)"
|
||||
|
||||
#: data/gtk/preferences.blp:255
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Legendary"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:272
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:289
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:305
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "விளையாட்டு துவக்கிகளை இறக்குமதி செய்"
|
||||
|
||||
#: data/gtk/preferences.blp:315
|
||||
msgid "Desktop Entries"
|
||||
msgstr "டெஸ்க்டாப் உள்ளீடுகள்"
|
||||
|
||||
#: data/gtk/preferences.blp:327
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB)"
|
||||
|
||||
#: data/gtk/preferences.blp:331
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "அங்கீகாரம்"
|
||||
|
||||
#: data/gtk/preferences.blp:334
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API விசை"
|
||||
|
||||
#: data/gtk/preferences.blp:342
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "SteamGridDB ஐப் பயன்படுத்தவும்"
|
||||
msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB) ஐப் பயன்படுத்தவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:343
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr ""
|
||||
"விளையாட்டுகளைச் சேர்க்கும் போது அல்லது இறக்குமதி செய்யும் போது படங்களைப் பதிவிறக்கவும்"
|
||||
|
||||
#: data/gtk/preferences.blp:352
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "அதிகாரப்பூர்வ படங்களை விட முன்னுரிமை"
|
||||
|
||||
#: data/gtk/preferences.blp:361
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "இயங்குபடம் செய்யப்பட்ட படங்களுக்கு முன்னுரிமை கொடுங்கள்"
|
||||
|
||||
@@ -349,7 +327,7 @@ msgstr "மறைக்கப்பட்ட விளையாட்டுக
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "நீங்கள் மறைக்கும் விளையாட்டுகள் இங்கே தோன்றும்."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "மீண்டும்"
|
||||
|
||||
@@ -361,118 +339,106 @@ msgstr "விளையாட்டு தலைப்பு"
|
||||
msgid "Play"
|
||||
msgstr "விளையாடு"
|
||||
|
||||
#: data/gtk/window.blp:255 data/gtk/window.blp:449
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "விளையாட்டைச் சேர்க்கவும்"
|
||||
|
||||
#: data/gtk/window.blp:262 data/gtk/window.blp:329
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "முதன்மை பட்டியல்"
|
||||
|
||||
#: data/gtk/window.blp:284
|
||||
msgid "Search games"
|
||||
msgstr "விளையாட்டுகளைத் தேடுங்கள்"
|
||||
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "மறைக்கப்பட்ட விளையாட்டுகள்"
|
||||
|
||||
#: data/gtk/window.blp:351
|
||||
msgid "Search hidden games"
|
||||
msgstr "மறைக்கப்பட்ட விளையாட்டுகளைத் தேடுங்கள்"
|
||||
|
||||
#: data/gtk/window.blp:388
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "வகைபடுத்து"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "புதியது"
|
||||
|
||||
#: data/gtk/window.blp:409
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "பழமையானது"
|
||||
|
||||
#: data/gtk/window.blp:415
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "கடைசியாக விளையாடியது"
|
||||
|
||||
#: data/gtk/window.blp:422
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "மறைக்கப்பட்டதைக் காட்டு"
|
||||
|
||||
#: data/gtk/window.blp:435
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "விசைப்பலகை குறுக்குவழிகள்"
|
||||
|
||||
#: data/gtk/window.blp:440
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "கார்ட்ரிட்ஜ்கள் பற்றி"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:195
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "K.B.Dharun Krishna <kbdharunkrishna@gmail.com>"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:213
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "சேர்க்கப்பட்டது: {}"
|
||||
|
||||
#: src/window.py:216
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "ஒருபோதும் இல்லை"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:220
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "கடைசியாக விளையாடியது: {}"
|
||||
|
||||
#: src/details_window.py:76
|
||||
#: src/details_window.py:72
|
||||
msgid "Apply"
|
||||
msgstr "விண்ணப்பி"
|
||||
|
||||
#: src/details_window.py:82
|
||||
#: src/details_window.py:78
|
||||
msgid "Add New Game"
|
||||
msgstr "புதிய விளையாட்டைச் சேர்க்கவும்"
|
||||
|
||||
#: src/details_window.py:83
|
||||
msgid "Add"
|
||||
msgstr "சேர்"
|
||||
|
||||
#: src/details_window.py:93
|
||||
msgid "Executables"
|
||||
msgstr "செயல்படுத்தக்கூடியவை"
|
||||
#: src/details_window.py:79
|
||||
msgid "Confirm"
|
||||
msgstr "உறுதிப்படுத்தவும்"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:108
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "கோப்பு.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:110
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "பயன்பாடு"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:115 src/details_window.py:117
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\பாதை\\டு \\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:121 src/details_window.py:123
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/பாதை/டு/ {}"
|
||||
|
||||
#: src/details_window.py:128
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -494,21 +460,21 @@ msgstr ""
|
||||
"\n"
|
||||
"பாதையில் இடைவெளிகள் இருந்தால், அதை இரட்டை மேற்கோள்களில் போர்த்துவதை உறுதிசெய்யவும்!"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:177
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "விளையாட்டைச் சேர்க்க முடியவில்லை"
|
||||
|
||||
#: src/details_window.py:171 src/details_window.py:207
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "விளையாட்டு தலைப்பு காலியாக இருக்கக்கூடாது."
|
||||
|
||||
#: src/details_window.py:177 src/details_window.py:215
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "இயங்கக்கூடியது காலியாக இருக்க முடியாது."
|
||||
|
||||
#: src/details_window.py:206 src/details_window.py:214
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "விருப்பங்களைப் பயன்படுத்த முடியவில்லை"
|
||||
msgstr "விருப்பத்தேர்வுகளைப் பயன்படுத்த முடியவில்லை"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:141
|
||||
@@ -516,121 +482,69 @@ msgid "{} launched"
|
||||
msgstr "{} தொடங்கப்பட்டது"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} மறைக்கப்பட்டுள்ளது"
|
||||
|
||||
#: src/game.py:155
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} மறைக்கப்படாதது"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:172 src/importer/importer.py:373
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} அகற்றப்பட்டது"
|
||||
|
||||
#: src/preferences.py:123
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "அனைத்து விளையாட்டுகளும் அகற்றப்பட்டன"
|
||||
|
||||
#: src/preferences.py:172
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr "SteamGridDB ஐப் பயன்படுத்த API விசை தேவை. நீங்கள் ஒன்றை {}இங்கே{} உருவாக்கலாம்."
|
||||
msgstr ""
|
||||
"ஸ்டீம்கிரிட் டிபி (SteamGridDB) ஐப் பயன்படுத்த API விசை தேவை. நீங்கள் ஒன்றை {}இங்கே{} "
|
||||
"உருவாக்கலாம்."
|
||||
|
||||
#: src/preferences.py:293
|
||||
msgid "Installation Not Found"
|
||||
msgstr "நிறுவல் கிடைக்கவில்லை"
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Select a valid directory."
|
||||
msgstr "சரியான கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#: src/preferences.py:330 src/importer/importer.py:299
|
||||
msgid "Warning"
|
||||
msgstr "எச்சரிக்கை"
|
||||
|
||||
#: src/preferences.py:364
|
||||
msgid "Invalid Directory"
|
||||
msgstr "தவறான கோப்பகம்"
|
||||
|
||||
#: src/preferences.py:370
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "இருப்பிடத்தை அமைக்கவும்"
|
||||
|
||||
#: src/utils/create_dialog.py:33 src/importer/importer.py:300
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "நிராகரி"
|
||||
|
||||
#: src/importer/importer.py:137
|
||||
msgid "Importing Games…"
|
||||
msgstr "விளையாட்டுகளை இறக்குமதி செய்கிறது…"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:320
|
||||
msgid "The following errors occured during import:"
|
||||
msgstr "இறக்குமதியின் போது பின்வரும் பிழைகள் ஏற்பட்டன:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:349
|
||||
msgid "No new games found"
|
||||
msgstr "புதிய விளையாட்டுகள் எதுவும் கண்டறியப்படவில்லை"
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "உறுதிப்படுத்தவும்"
|
||||
|
||||
#: src/importer/importer.py:361
|
||||
msgid "1 game imported"
|
||||
msgstr "1 விளையாட்டு இறக்குமதி செய்யப்பட்டது"
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:365
|
||||
msgid "{} games imported"
|
||||
msgstr "{} விளையாட்டுகள் இறக்குமதி செய்யப்பட்டன"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:369
|
||||
msgid "1 removed"
|
||||
msgstr "1 அகற்றப்பட்டது"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "{} கேச் கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "{} கட்டமைப்பு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "{} தரவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "SteamGridDB ஐ அங்கீகரிக்க முடியவில்லை"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "ஸ்டீம்கிரிட் டிபி (SteamGridDB) உடன் இணைக்க முடியவில்லை"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "உங்கள் API விசையை விருப்பங்களில் சரிபார்க்கவும்"
|
||||
|
||||
#~ 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
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Steam (ஸ்டீம்) கோப்பகத்தைக் கண்டறிய முடியவில்லை."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "உறுதிப்படுத்தவும்"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam (ஸ்டீம்) நிறுவல் இடம்"
|
||||
@@ -656,9 +570,30 @@ msgstr "உங்கள் API விசையை விருப்பங்க
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "லூட்ரிஸ் தற்காலிக சேமிப்பு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "நிறுவல் கிடைக்கவில்லை"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "{} உள்ளமைவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "{} தரவு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "விளையாட்டுகளை இறக்குமதி செய்கிறது…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "அட்டைகளை இறக்குமதி செய்கிறது…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "புதிய விளையாட்டுகள் எதுவும் கண்டறியப்படவில்லை"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 விளையாட்டு இறக்குமதி செய்யப்பட்டது"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} விளையாட்டுகள் இறக்குமதி செய்யப்பட்டன"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "விளையாட்டுகளை இறக்குமதி செய்யும் போது பயன்படுத்த வேண்டிய அடைவு"
|
||||
|
||||
@@ -713,16 +648,19 @@ msgstr "உங்கள் API விசையை விருப்பங்க
|
||||
#~ msgstr "/பாதை/டு /{file_name}"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "General"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "General"
|
||||
#~ msgstr "பொது"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Search"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "Search"
|
||||
#~ msgstr "தேடு"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Undo"
|
||||
#~ msgctxt "shortcuts window"
|
||||
#~ msgid "Undo"
|
||||
#~ msgstr "செயல்தவிர்"
|
||||
@@ -766,6 +704,9 @@ msgstr "உங்கள் API விசையை விருப்பங்க
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "Steam (ஸ்டீம்) நூலகத்தில் புதிய விளையாட்டுகள் எதுவும் இல்லை."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Steam (ஸ்டீம்) கோப்பகத்தைக் கண்டறிய முடியவில்லை."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "ஸ்டிமுடன் (Steam) பேசுகிறேன்"
|
||||
|
||||
@@ -785,6 +726,3 @@ msgstr "உங்கள் API விசையை விருப்பங்க
|
||||
|
||||
#~ msgid "kramo"
|
||||
#~ msgstr "கிராமோ"
|
||||
|
||||
#~ msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
#~ msgstr "விளையாட்டு; துவக்கி; steam;lutris;heroic;பாட்டில்கள்;itch;"
|
||||
|
||||
351
po/tr.po
@@ -6,8 +6,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-07-15 22:51+0000\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-05-26 18:10+0000\n"
|
||||
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
|
||||
"Language-Team: Turkish <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/tr/>\n"
|
||||
@@ -16,11 +16,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Kartuşlar"
|
||||
|
||||
@@ -34,10 +34,7 @@ msgid "Launch all your games"
|
||||
msgstr "Tüm oyunlarınızı başlatın"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:11
|
||||
#, fuzzy
|
||||
#| msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgid ""
|
||||
"gaming;launcher;steam;lutris;heroic;bottles;itch;flatpak;legendary;retroarch;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "oyun;başlatıcı;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
@@ -56,18 +53,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Kütüphane"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34 src/details_window.py:67
|
||||
msgid "Edit Game Details"
|
||||
msgstr "Oyun Ayrıntılarını Düzenle"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:38 data/gtk/window.blp:71
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Oyun Ayrıntıları"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Tercihler"
|
||||
|
||||
@@ -83,21 +78,32 @@ msgstr "Yeni Kapak"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Kapağı Sil"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Başlık"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
#, fuzzy
|
||||
#| msgid "The developer or publisher (optional)"
|
||||
msgid "Developer (optional)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Oyunun başlığı"
|
||||
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
msgid "Developer"
|
||||
msgstr "Geliştirici"
|
||||
|
||||
#: data/gtk/details-window.blp:113
|
||||
msgid "The developer or publisher (optional)"
|
||||
msgstr "Geliştirici veya yayıncı (isteğe bağlı)"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:123 data/gtk/details-window.blp:155
|
||||
msgid "Executable"
|
||||
msgstr "Yürütülebilir"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Oyun başlatılırken açılacak dosya veya çalıştırılacak komut"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Daha Fazla Bilgi"
|
||||
|
||||
@@ -105,7 +111,7 @@ msgstr "Daha Fazla Bilgi"
|
||||
msgid "Edit"
|
||||
msgstr "Düzenle"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Gizle"
|
||||
|
||||
@@ -114,7 +120,7 @@ msgstr "Gizle"
|
||||
msgid "Remove"
|
||||
msgstr "Kaldır"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Göster"
|
||||
|
||||
@@ -127,7 +133,7 @@ msgid "Quit"
|
||||
msgstr "Çık"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Ara"
|
||||
|
||||
@@ -139,8 +145,7 @@ msgstr "Tercihleri göster"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Kısayollar"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Geri Al"
|
||||
|
||||
@@ -168,8 +173,7 @@ msgstr "Gizli oyunları göster"
|
||||
msgid "Remove game"
|
||||
msgstr "Oyunu kaldır"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Davranış"
|
||||
|
||||
@@ -207,118 +211,93 @@ msgstr "Tehlikeli Bölge"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Tüm Oyunları Kaldır"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Tüm Oyunları Kaldır"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Kaynaklar"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Kurulu Konumu"
|
||||
msgstr "itch Kurulu Konumu"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Önbellek Konumu"
|
||||
msgstr "Lutris Önbellek Konumu"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Steam Oyunlarını İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Flatpak Oyunlarını İçe Aktarın"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Epic Oyunlarını İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "GOG Oyunlarını İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
#, fuzzy
|
||||
#| msgid "Import Steam Games"
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Steam Oyunlarını İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Yandan Yüklenmiş Oyunları İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Şişeler"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Efsanevi"
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Oyun Başlatıcıları İçe Aktar"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Kimlik Doğrulaması"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "API anahtarı"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "SteamGridDB Kullan"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Oyun eklerken veya içe aktarırken görüntüleri indir"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Resmî Görsellere Yeğle"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Hareketli Görselleri Yeğle"
|
||||
|
||||
@@ -346,7 +325,7 @@ msgstr "Gizli Oyun Yok"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Gizlediğiniz oyunlar burada belirecek."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Geri"
|
||||
|
||||
@@ -358,82 +337,70 @@ msgstr "Oyun Başlığı"
|
||||
msgid "Play"
|
||||
msgstr "Oyna"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Oyun Ekle"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Ana Menü"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search games"
|
||||
msgstr "Ara"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Gizli Oyunlar"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
#, fuzzy
|
||||
#| msgid "Show hidden games"
|
||||
msgid "Search hidden games"
|
||||
msgstr "Gizli oyunları göster"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Sırala"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "A-Z"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Z-A"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "En Yeni"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "En Eski"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Son Oynanan"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Gizlileri Göster"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Klavye Kısayolları"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Kartuşlar Hakkında"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "Sabri Ünal <libreajans@gmail.com>"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Eklendi: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Asla"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Son oynanma: {}"
|
||||
|
||||
@@ -446,30 +413,30 @@ msgid "Add New Game"
|
||||
msgstr "Yeni Oyun Ekle"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgid "Confirm"
|
||||
msgstr "Doğrula"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "dosya.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "program"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\yol\\klasör\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/yol/klasör/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -491,149 +458,91 @@ msgstr ""
|
||||
"\n"
|
||||
"Yol boşluk içeriyorsa, çift tırnak içine aldığınızdan emin olun!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Oyun Eklenemedi"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Oyun başlığı boş olamaz."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Çalıştırılabilir boş olamaz."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Tercihler Uygulanamadı"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} başlatıldı"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} gizli"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} görünür"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} kaldırıldı"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Tüm oyunlar kaldırıldı"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"SteamGridDBʼyi kullanmak için API anahtarı gereklidir. {}Buradan{} bir tane "
|
||||
"oluşturabilirsiniz."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Kurulum Bulunamadı"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Geçerli bir dizin seçin."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Geçersiz Dizin"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Konum Ayarla"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Vazgeç"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Oyunlar İçe Aktarılıyor…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Yeni oyun bulunamadı"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 oyun içe aktarıldı"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} oyun içe aktarıldı"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} kaldırıldı"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Doğrula"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "{} önbellek dizinini seç."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "{} yapılandırma dizinini seç."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "{} veri dizinini seç."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "SteamGridDB Kimlik Doğrulaması Yapılamadı"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "SteamGridDBʼye bağlanılamadı"
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Tercihlerde API anahtarınızı doğrulayın"
|
||||
|
||||
#~ msgid "The title of the game"
|
||||
#~ msgstr "Oyunun başlığı"
|
||||
|
||||
#~ msgid "Developer"
|
||||
#~ msgstr "Geliştirici"
|
||||
|
||||
#~ msgid "File to open or command to run when launching the game"
|
||||
#~ msgstr "Oyun başlatılırken açılacak dosya veya çalıştırılacak komut"
|
||||
|
||||
#~ msgid "Confirm"
|
||||
#~ msgstr "Doğrula"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Cache Not Found"
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Önbellek Bulunamadı"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Confirm"
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Doğrula"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Steam Kurulu Konumu"
|
||||
@@ -653,8 +562,32 @@ msgstr "Tercihlerde API anahtarınızı doğrulayın"
|
||||
#~ msgid "Yesterday"
|
||||
#~ msgstr "Dün"
|
||||
|
||||
#~ msgid "Cache Not Found"
|
||||
#~ msgstr "Önbellek Bulunamadı"
|
||||
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Lutris önbellek dizinini seç."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Kurulum Bulunamadı"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "{} yapılandırma dizinini seç."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "{} veri dizinini seç."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Oyunlar İçe Aktarılıyor…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Kapaklar İçe Aktarılıyor…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Yeni oyun bulunamadı"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 oyun içe aktarıldı"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} oyun içe aktarıldı"
|
||||
|
||||
359
po/uk.po
@@ -4,14 +4,13 @@
|
||||
# kramo <contact@kramo.hu>, 2023.
|
||||
# Dan <denqwerta@gmail.com>, 2023.
|
||||
# Вова Смірнов <vovasmirnon5895@gmail.com>, 2023.
|
||||
# Dan <jonweblin2205@protonmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-08-16 11:06+0200\n"
|
||||
"PO-Revision-Date: 2023-08-15 04:05+0000\n"
|
||||
"Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
|
||||
"POT-Creation-Date: 2023-06-26 12:01+0200\n"
|
||||
"PO-Revision-Date: 2023-06-03 18:51+0000\n"
|
||||
"Last-Translator: Вова Смірнов <vovasmirnon5895@gmail.com>\n"
|
||||
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/uk/>\n"
|
||||
"Language: uk\n"
|
||||
@@ -20,11 +19,11 @@ msgstr ""
|
||||
"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.0-dev\n"
|
||||
"X-Generator: Weblate 4.18-dev\n"
|
||||
|
||||
#: data/hu.kramo.Cartridges.desktop.in:3
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:6 data/gtk/window.blp:47
|
||||
#: src/main.py:169
|
||||
#: src/main.py:146
|
||||
msgid "Cartridges"
|
||||
msgstr "Картриджі"
|
||||
|
||||
@@ -38,10 +37,8 @@ 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;"
|
||||
msgid "gaming;launcher;steam;lutris;heroic;bottles;itch;"
|
||||
msgstr "ігри;лаунчер;steam;lutris;heroic;bottles;itch;"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:9
|
||||
msgid ""
|
||||
@@ -59,18 +56,16 @@ msgstr ""
|
||||
msgid "Library"
|
||||
msgstr "Бібліотека"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:34
|
||||
#: 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
|
||||
#: src/details_window.py:67
|
||||
msgid "Game Details"
|
||||
msgstr "Подробиці гри"
|
||||
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:418
|
||||
#: src/details_window.py:241 src/importer/importer.py:292
|
||||
#: src/importer/importer.py:342
|
||||
#: data/hu.kramo.Cartridges.metainfo.xml.in:42 data/gtk/window.blp:416
|
||||
#: src/details_window.py:239
|
||||
msgid "Preferences"
|
||||
msgstr "Параметри"
|
||||
|
||||
@@ -86,19 +81,32 @@ msgstr "Нова обкладинка"
|
||||
msgid "Delete Cover"
|
||||
msgstr "Видалити обкладинку"
|
||||
|
||||
#: data/gtk/details-window.blp:102 data/gtk/game.blp:80
|
||||
#: data/gtk/details-window.blp:101 data/gtk/details-window.blp:106
|
||||
#: data/gtk/game.blp:80
|
||||
msgid "Title"
|
||||
msgstr "Назва"
|
||||
|
||||
#: data/gtk/details-window.blp:105
|
||||
msgid "Developer (optional)"
|
||||
msgstr "Розробник (необов'язково)"
|
||||
#: data/gtk/details-window.blp:102
|
||||
msgid "The title of the game"
|
||||
msgstr "Назва гри"
|
||||
|
||||
#: data/gtk/details-window.blp:110
|
||||
#: data/gtk/details-window.blp:112 data/gtk/details-window.blp:117
|
||||
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"
|
||||
msgstr "Виконуваний"
|
||||
|
||||
#: data/gtk/details-window.blp:116
|
||||
#: data/gtk/details-window.blp:124
|
||||
msgid "File to open or command to run when launching the game"
|
||||
msgstr "Файл для відкриття або команда для запуску під час запуску гри"
|
||||
|
||||
#: data/gtk/details-window.blp:130
|
||||
msgid "More Info"
|
||||
msgstr "Більше інформації"
|
||||
|
||||
@@ -106,7 +114,7 @@ msgstr "Більше інформації"
|
||||
msgid "Edit"
|
||||
msgstr "Редагувати"
|
||||
|
||||
#: data/gtk/game.blp:107 src/window.py:171
|
||||
#: data/gtk/game.blp:107 src/window.py:169
|
||||
msgid "Hide"
|
||||
msgstr "Приховати"
|
||||
|
||||
@@ -115,7 +123,7 @@ msgstr "Приховати"
|
||||
msgid "Remove"
|
||||
msgstr "Видалити"
|
||||
|
||||
#: data/gtk/game.blp:126 src/window.py:173
|
||||
#: data/gtk/game.blp:126 src/window.py:171
|
||||
msgid "Unhide"
|
||||
msgstr "Показати"
|
||||
|
||||
@@ -128,7 +136,7 @@ msgid "Quit"
|
||||
msgstr "Вийти"
|
||||
|
||||
#: data/gtk/help-overlay.blp:19 data/gtk/window.blp:217 data/gtk/window.blp:257
|
||||
#: data/gtk/window.blp:324
|
||||
#: data/gtk/window.blp:323
|
||||
msgid "Search"
|
||||
msgstr "Пошук"
|
||||
|
||||
@@ -140,8 +148,7 @@ msgstr "Показати параметри"
|
||||
msgid "Shortcuts"
|
||||
msgstr "Ярлики"
|
||||
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:103 src/preferences.py:120
|
||||
#: src/importer/importer.py:366
|
||||
#: data/gtk/help-overlay.blp:34 src/game.py:105 src/preferences.py:103
|
||||
msgid "Undo"
|
||||
msgstr "Відмінити"
|
||||
|
||||
@@ -169,8 +176,7 @@ msgstr "Показати приховані ігри"
|
||||
msgid "Remove game"
|
||||
msgstr "Видалити гру"
|
||||
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:89
|
||||
#: data/gtk/preferences.blp:304
|
||||
#: data/gtk/preferences.blp:13 data/gtk/preferences.blp:236
|
||||
msgid "Behavior"
|
||||
msgstr "Поведінка"
|
||||
|
||||
@@ -206,116 +212,93 @@ msgstr "Небезпечна зона"
|
||||
msgid "Remove All Games"
|
||||
msgstr "Видалити всі ігри"
|
||||
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:444
|
||||
#: data/gtk/preferences.blp:85 data/gtk/window.blp:27 data/gtk/window.blp:442
|
||||
msgid "Import"
|
||||
msgstr "Імпорт"
|
||||
|
||||
#: data/gtk/preferences.blp:92
|
||||
#, fuzzy
|
||||
#| msgid "Remove All Games"
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "Видалити всі ігри"
|
||||
|
||||
#: data/gtk/preferences.blp:102
|
||||
#: data/gtk/preferences.blp:89
|
||||
msgid "Sources"
|
||||
msgstr "Джерела"
|
||||
|
||||
#: data/gtk/preferences.blp:105
|
||||
#: data/gtk/preferences.blp:92
|
||||
msgid "Steam"
|
||||
msgstr "Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:109 data/gtk/preferences.blp:123
|
||||
#: data/gtk/preferences.blp:164 data/gtk/preferences.blp:214
|
||||
#: data/gtk/preferences.blp:228 data/gtk/preferences.blp:242
|
||||
#: data/gtk/preferences.blp:256 data/gtk/preferences.blp:270
|
||||
#: data/gtk/preferences.blp:96 data/gtk/preferences.blp:110
|
||||
#: data/gtk/preferences.blp:142 data/gtk/preferences.blp:183
|
||||
#: data/gtk/preferences.blp:197 data/gtk/preferences.blp:211
|
||||
#, fuzzy
|
||||
#| msgid "itch Install Location"
|
||||
msgid "Install Location"
|
||||
msgstr "Місце встановлення"
|
||||
msgstr "Місце встановлення itch"
|
||||
|
||||
#: data/gtk/preferences.blp:119
|
||||
#: data/gtk/preferences.blp:106
|
||||
msgid "Lutris"
|
||||
msgstr "Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:132
|
||||
#: data/gtk/preferences.blp:119
|
||||
#, fuzzy
|
||||
#| msgid "Lutris Cache Location"
|
||||
msgid "Cache Location"
|
||||
msgstr "Розташування кешу"
|
||||
msgstr "Розташування сховища Lutris"
|
||||
|
||||
#: data/gtk/preferences.blp:141
|
||||
#: data/gtk/preferences.blp:128
|
||||
msgid "Import Steam Games"
|
||||
msgstr "Імпорт ігор Steam"
|
||||
|
||||
#: data/gtk/preferences.blp:150
|
||||
msgid "Import Flatpak Games"
|
||||
msgstr "Імпортувати ігри Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:160
|
||||
#: data/gtk/preferences.blp:138
|
||||
msgid "Heroic"
|
||||
msgstr "Heroic"
|
||||
|
||||
#: data/gtk/preferences.blp:173
|
||||
#: data/gtk/preferences.blp:151
|
||||
msgid "Import Epic Games"
|
||||
msgstr "Імпорт Epic Games"
|
||||
|
||||
#: data/gtk/preferences.blp:182
|
||||
#: data/gtk/preferences.blp:160
|
||||
msgid "Import GOG Games"
|
||||
msgstr "Імпорт ігор GOG"
|
||||
|
||||
#: data/gtk/preferences.blp:191
|
||||
msgid "Import Amazon Games"
|
||||
msgstr "Імпортувати ігри Amazon"
|
||||
|
||||
#: data/gtk/preferences.blp:200
|
||||
#: data/gtk/preferences.blp:169
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "Імпорт сторонніх ігор"
|
||||
|
||||
#: data/gtk/preferences.blp:210
|
||||
#: data/gtk/preferences.blp:179
|
||||
msgid "Bottles"
|
||||
msgstr "Bottles"
|
||||
|
||||
#: data/gtk/preferences.blp:224
|
||||
#: data/gtk/preferences.blp:193
|
||||
msgid "itch"
|
||||
msgstr "itch"
|
||||
|
||||
#: data/gtk/preferences.blp:238
|
||||
#: data/gtk/preferences.blp:207
|
||||
msgid "Legendary"
|
||||
msgstr "Легендарний"
|
||||
msgstr ""
|
||||
|
||||
#: data/gtk/preferences.blp:252
|
||||
msgid "RetroArch"
|
||||
msgstr "RetroArch"
|
||||
|
||||
#: data/gtk/preferences.blp:266
|
||||
msgid "Flatpak"
|
||||
msgstr "Flatpak"
|
||||
|
||||
#: data/gtk/preferences.blp:279
|
||||
msgid "Import Game Launchers"
|
||||
msgstr "Імпортувати ігрові лаунчери"
|
||||
|
||||
#: data/gtk/preferences.blp:292
|
||||
#: data/gtk/preferences.blp:224
|
||||
msgid "SteamGridDB"
|
||||
msgstr "SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:296
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Authentication"
|
||||
msgstr "Аутентифікація"
|
||||
|
||||
#: data/gtk/preferences.blp:299
|
||||
#: data/gtk/preferences.blp:231
|
||||
msgid "API Key"
|
||||
msgstr "Ключ API"
|
||||
|
||||
#: data/gtk/preferences.blp:307
|
||||
#: data/gtk/preferences.blp:239
|
||||
msgid "Use SteamGridDB"
|
||||
msgstr "Використовувати SteamGridDB"
|
||||
|
||||
#: data/gtk/preferences.blp:308
|
||||
#: data/gtk/preferences.blp:240
|
||||
msgid "Download images when adding or importing games"
|
||||
msgstr "Завантаження зображень під час додавання або імпорту ігор"
|
||||
|
||||
#: data/gtk/preferences.blp:317
|
||||
#: data/gtk/preferences.blp:249
|
||||
msgid "Prefer Over Official Images"
|
||||
msgstr "Надавати перевагу офіційним зображенням"
|
||||
|
||||
#: data/gtk/preferences.blp:326
|
||||
#: data/gtk/preferences.blp:258
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "Надавати перевагу анімованим зображенням"
|
||||
|
||||
@@ -343,7 +326,7 @@ msgstr "Ніяких прихованих ігор"
|
||||
msgid "Games you hide will appear here."
|
||||
msgstr "Ігри, які ви сховали, з'являться тут."
|
||||
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:305
|
||||
#: data/gtk/window.blp:64 data/gtk/window.blp:304
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
|
||||
@@ -355,78 +338,70 @@ msgstr "Назва гри"
|
||||
msgid "Play"
|
||||
msgstr "Грати"
|
||||
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:437
|
||||
#: data/gtk/window.blp:243 data/gtk/window.blp:435
|
||||
msgid "Add Game"
|
||||
msgstr "Додати гру"
|
||||
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:317
|
||||
#: data/gtk/window.blp:250 data/gtk/window.blp:316
|
||||
msgid "Main Menu"
|
||||
msgstr "Головне меню"
|
||||
|
||||
#: data/gtk/window.blp:272
|
||||
msgid "Search games"
|
||||
msgstr "Пошук ігор"
|
||||
|
||||
#: data/gtk/window.blp:312
|
||||
#: data/gtk/window.blp:311
|
||||
msgid "Hidden Games"
|
||||
msgstr "Приховані ігри"
|
||||
|
||||
#: data/gtk/window.blp:339
|
||||
msgid "Search hidden games"
|
||||
msgstr "Пошук прихованих ігор"
|
||||
|
||||
#: data/gtk/window.blp:376
|
||||
#: data/gtk/window.blp:374
|
||||
msgid "Sort"
|
||||
msgstr "Сортувати"
|
||||
|
||||
#: data/gtk/window.blp:379
|
||||
#: data/gtk/window.blp:377
|
||||
msgid "A-Z"
|
||||
msgstr "А-Я"
|
||||
|
||||
#: data/gtk/window.blp:385
|
||||
#: data/gtk/window.blp:383
|
||||
msgid "Z-A"
|
||||
msgstr "Я-А"
|
||||
|
||||
#: data/gtk/window.blp:391
|
||||
#: data/gtk/window.blp:389
|
||||
msgid "Newest"
|
||||
msgstr "Найновіші"
|
||||
|
||||
#: data/gtk/window.blp:397
|
||||
#: data/gtk/window.blp:395
|
||||
msgid "Oldest"
|
||||
msgstr "Найстаріші"
|
||||
|
||||
#: data/gtk/window.blp:403
|
||||
#: data/gtk/window.blp:401
|
||||
msgid "Last Played"
|
||||
msgstr "Остання гра"
|
||||
|
||||
#: data/gtk/window.blp:410
|
||||
#: data/gtk/window.blp:408
|
||||
msgid "Show Hidden"
|
||||
msgstr "Показати приховане"
|
||||
|
||||
#: data/gtk/window.blp:423
|
||||
#: data/gtk/window.blp:421
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Комбінації клавіш"
|
||||
|
||||
#: data/gtk/window.blp:428
|
||||
#: data/gtk/window.blp:426
|
||||
msgid "About Cartridges"
|
||||
msgstr "Про Картриджі"
|
||||
|
||||
#. Translators: Replace this with your name for it to show up in the about window
|
||||
#: src/main.py:188
|
||||
#: src/main.py:164
|
||||
msgid "translator_credits"
|
||||
msgstr "kefir2105"
|
||||
|
||||
#. The variable is the date when the game was added
|
||||
#: src/window.py:194
|
||||
#: src/window.py:192
|
||||
msgid "Added: {}"
|
||||
msgstr "Додано: {}"
|
||||
|
||||
#: src/window.py:197
|
||||
#: src/window.py:195
|
||||
msgid "Never"
|
||||
msgstr "Ніколи"
|
||||
|
||||
#. The variable is the date when the game was last played
|
||||
#: src/window.py:201
|
||||
#: src/window.py:199
|
||||
msgid "Last played: {}"
|
||||
msgstr "Востаннє грали: {}"
|
||||
|
||||
@@ -439,30 +414,30 @@ msgid "Add New Game"
|
||||
msgstr "Додати нову гру"
|
||||
|
||||
#: src/details_window.py:79
|
||||
msgid "Add"
|
||||
msgstr "Додати"
|
||||
msgid "Confirm"
|
||||
msgstr "Підтвердити"
|
||||
|
||||
#. Translate this string as you would translate "file"
|
||||
#: src/details_window.py:92
|
||||
#: src/details_window.py:91
|
||||
msgid "file.txt"
|
||||
msgstr "file.txt"
|
||||
|
||||
#. As in software
|
||||
#: src/details_window.py:94
|
||||
#: src/details_window.py:93
|
||||
msgid "program"
|
||||
msgstr "програма"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:99 src/details_window.py:101
|
||||
#: src/details_window.py:98 src/details_window.py:100
|
||||
msgid "C:\\path\\to\\{}"
|
||||
msgstr "C:\\шлях\\до\\{}"
|
||||
|
||||
#. Translate this string as you would translate "path to {}"
|
||||
#: src/details_window.py:105 src/details_window.py:107
|
||||
#: src/details_window.py:104 src/details_window.py:106
|
||||
msgid "/path/to/{}"
|
||||
msgstr "/path/to/{}"
|
||||
|
||||
#: src/details_window.py:112
|
||||
#: src/details_window.py:111
|
||||
msgid ""
|
||||
"To launch the executable \"{}\", use the command:\n"
|
||||
"\n"
|
||||
@@ -485,159 +460,91 @@ msgstr ""
|
||||
"\n"
|
||||
"Якщо шлях містить пробіли, обов'язково візьміть його в подвійні лапки!"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:153
|
||||
#: src/details_window.py:146 src/details_window.py:152
|
||||
msgid "Couldn't Add Game"
|
||||
msgstr "Не вдалося додати гру"
|
||||
|
||||
#: src/details_window.py:147 src/details_window.py:183
|
||||
#: src/details_window.py:146 src/details_window.py:181
|
||||
msgid "Game title cannot be empty."
|
||||
msgstr "Назва гри не може бути порожньою."
|
||||
|
||||
#: src/details_window.py:153 src/details_window.py:191
|
||||
#: src/details_window.py:152 src/details_window.py:189
|
||||
msgid "Executable cannot be empty."
|
||||
msgstr "Виконуваний файл не може бути порожнім."
|
||||
|
||||
#: src/details_window.py:182 src/details_window.py:190
|
||||
#: src/details_window.py:180 src/details_window.py:188
|
||||
msgid "Couldn't Apply Preferences"
|
||||
msgstr "Не вдалося застосувати параметри"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:139
|
||||
#: src/game.py:141
|
||||
msgid "{} launched"
|
||||
msgstr "{} запущено"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} hidden"
|
||||
msgstr "{} приховано"
|
||||
|
||||
#: src/game.py:153
|
||||
#: src/game.py:154
|
||||
msgid "{} unhidden"
|
||||
msgstr "{} показано"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#. The variable is the number of games removed
|
||||
#: src/game.py:170 src/importer/importer.py:363
|
||||
#: src/game.py:171
|
||||
msgid "{} removed"
|
||||
msgstr "{} видалено"
|
||||
|
||||
#: src/preferences.py:119
|
||||
#: src/preferences.py:102
|
||||
msgid "All games removed"
|
||||
msgstr "Всі ігри видалено"
|
||||
|
||||
#: src/preferences.py:168
|
||||
#: src/preferences.py:149
|
||||
msgid ""
|
||||
"An API key is required to use SteamGridDB. You can generate one {}here{}."
|
||||
msgstr ""
|
||||
"Для використання SteamGridDB потрібен ключ API. Ви можете згенерувати його {}"
|
||||
"тут{}."
|
||||
|
||||
#: src/preferences.py:294
|
||||
msgid "Installation Not Found"
|
||||
msgstr "Встановлення не знайдено"
|
||||
|
||||
#: src/preferences.py:296
|
||||
msgid "Select a valid directory."
|
||||
msgstr "Виберіть правильний каталог."
|
||||
|
||||
#: src/preferences.py:351
|
||||
msgid "Invalid Directory"
|
||||
msgstr "Неправильний каталог"
|
||||
|
||||
#: src/preferences.py:357
|
||||
#: src/preferences.py:289
|
||||
msgid "Set Location"
|
||||
msgstr "Встановити місцезнаходження"
|
||||
|
||||
#: src/utils/create_dialog.py:25 src/importer/importer.py:291
|
||||
#: src/utils/create_dialog.py:25
|
||||
msgid "Dismiss"
|
||||
msgstr "Відхилити"
|
||||
|
||||
#: src/importer/importer.py:128
|
||||
msgid "Importing Games…"
|
||||
msgstr "Імпорт ігор…"
|
||||
|
||||
#: src/importer/importer.py:290
|
||||
msgid "Warning"
|
||||
#: src/importer/sources/source.py:106
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:311
|
||||
msgid "The following errors occured during import:"
|
||||
#: src/importer/sources/source.py:107
|
||||
msgid "Cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/importer/importer.py:339
|
||||
msgid "No new games found"
|
||||
msgstr "Нових ігор не знайдено"
|
||||
|
||||
#: src/importer/importer.py:351
|
||||
msgid "1 game imported"
|
||||
msgstr "1 гру імпортовано"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: src/importer/importer.py:355
|
||||
msgid "{} games imported"
|
||||
msgstr "{} гри імпортовано"
|
||||
|
||||
#. A single game removed
|
||||
#: src/importer/importer.py:359
|
||||
#: src/importer/sources/source.py:108
|
||||
#, fuzzy
|
||||
#| msgid "{} removed"
|
||||
msgid "1 removed"
|
||||
msgstr "{} видалено"
|
||||
#| msgid "Confirm"
|
||||
msgid "Configuration"
|
||||
msgstr "Підтвердити"
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:33
|
||||
msgid "Select the {} cache directory."
|
||||
msgstr "Виберіть каталог кешу {}."
|
||||
#. The variables are the type of location (eg. cache) and the source's name (eg. Steam)
|
||||
#: src/importer/sources/source.py:119
|
||||
msgid "Invalid {} Location for {{}}"
|
||||
msgstr ""
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:35
|
||||
msgid "Select the {} configuration directory."
|
||||
msgstr "Виберіть каталог конфігурації {}."
|
||||
|
||||
#. The variable is the name of the source
|
||||
#: src/importer/sources/location.py:37
|
||||
msgid "Select the {} data directory."
|
||||
msgstr "Виберіть каталог даних {}."
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:46
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Не вдалося автентифікувати SteamGridDB"
|
||||
#: src/importer/sources/source.py:120
|
||||
msgid "Pick a new one or disable the source in preferences"
|
||||
msgstr ""
|
||||
|
||||
#: src/store/managers/sgdb_manager.py:47
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr "Перевірте свій API-ключ у параметрах"
|
||||
|
||||
#~ 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
|
||||
#~| msgid "The Steam directory cannot be found."
|
||||
#~ msgid "Directory not Valid"
|
||||
#~ msgstr "Каталог Steam знайти неможливо."
|
||||
#| msgid "Couldn't Connect to SteamGridDB"
|
||||
msgid "Couldn't Authenticate SteamGridDB"
|
||||
msgstr "Не вдалося підключитися до SteamGridDB"
|
||||
|
||||
#~ msgid "Data"
|
||||
#~ msgstr "Дані"
|
||||
|
||||
#~ msgid "Cache"
|
||||
#~ msgstr "Кеш"
|
||||
|
||||
#~ msgid "Configuration"
|
||||
#~ msgstr "Конфігурація"
|
||||
|
||||
#~ msgid "Invalid {} Location for {{}}"
|
||||
#~ msgstr "Недійсний {} Місце для {{}}"
|
||||
|
||||
#~ msgid "Pick a new one or disable the source in preferences"
|
||||
#~ msgstr "Виберіть новий або вимкніть джерело у параметрах"
|
||||
#: src/store/managers/sgdb_manager.py:48
|
||||
msgid "Verify your API key in preferences"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Steam Install Location"
|
||||
#~ msgstr "Місце встановлення Steam"
|
||||
@@ -663,9 +570,30 @@ msgstr "Перевірте свій API-ключ у параметрах"
|
||||
#~ msgid "Select the Lutris cache directory."
|
||||
#~ msgstr "Виберіть каталог кешу Lutris."
|
||||
|
||||
#~ msgid "Installation Not Found"
|
||||
#~ msgstr "Встановлення не знайдено"
|
||||
|
||||
#~ msgid "Select the {} configuration directory."
|
||||
#~ msgstr "Виберіть каталог конфігурації {}."
|
||||
|
||||
#~ msgid "Select the {} data directory."
|
||||
#~ msgstr "Виберіть каталог даних {}."
|
||||
|
||||
#~ msgid "Importing Games…"
|
||||
#~ msgstr "Імпорт ігор…"
|
||||
|
||||
#~ msgid "Importing Covers…"
|
||||
#~ msgstr "Імпорт обкладинок…"
|
||||
|
||||
#~ msgid "No new games found"
|
||||
#~ msgstr "Нових ігор не знайдено"
|
||||
|
||||
#~ msgid "1 game imported"
|
||||
#~ msgstr "1 гру імпортовано"
|
||||
|
||||
#~ msgid "{} games imported"
|
||||
#~ msgstr "{} гри імпортовано"
|
||||
|
||||
#~ msgid "Directory to use when importing games"
|
||||
#~ msgstr "Каталог для імпорту ігор"
|
||||
|
||||
@@ -775,6 +703,9 @@ msgstr "Перевірте свій API-ключ у параметрах"
|
||||
#~ msgid "No new games were found in the Steam library."
|
||||
#~ msgstr "У бібліотеці Steam не знайдено жодної нової гри."
|
||||
|
||||
#~ msgid "The Steam directory cannot be found."
|
||||
#~ msgstr "Каталог Steam знайти неможливо."
|
||||
|
||||
#~ msgid "Talking to Steam"
|
||||
#~ msgstr "Спілкування зі Steam"
|
||||
|
||||
|
||||
@@ -18,22 +18,18 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import os
|
||||
import shlex
|
||||
from pathlib import Path
|
||||
from time import time
|
||||
from typing import Any, Optional
|
||||
|
||||
from gi.repository import Adw, Gio, GLib, Gtk
|
||||
from PIL import Image, UnidentifiedImageError
|
||||
from PIL import Image
|
||||
|
||||
from src import shared
|
||||
from src.errors.friendly_error import FriendlyError
|
||||
from src.game import Game
|
||||
from src.game_cover import GameCover
|
||||
from src.store.managers.cover_manager import CoverManager
|
||||
from src.store.managers.sgdb_manager import SGDBManager
|
||||
from src.utils.create_dialog import create_dialog
|
||||
from src.utils.save_cover import convert_cover, save_cover
|
||||
from src.utils.save_cover import resize_cover, save_cover
|
||||
|
||||
|
||||
@Gtk.Template(resource_path=shared.PREFIX + "/gtk/details-window.ui")
|
||||
@@ -53,22 +49,22 @@ class DetailsWindow(Adw.Window):
|
||||
|
||||
exec_info_label = Gtk.Template.Child()
|
||||
exec_info_popover = Gtk.Template.Child()
|
||||
file_chooser_button = Gtk.Template.Child()
|
||||
|
||||
apply_button = Gtk.Template.Child()
|
||||
|
||||
cover_changed: bool = False
|
||||
cover_changed = False
|
||||
|
||||
def __init__(self, game: Optional[Game] = None, **kwargs: Any):
|
||||
def __init__(self, game=None, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.game: Game = game
|
||||
self.game_cover: GameCover = GameCover({self.cover})
|
||||
self.win = shared.win
|
||||
self.game = game
|
||||
self.game_cover = GameCover({self.cover})
|
||||
|
||||
self.set_transient_for(shared.win)
|
||||
self.set_transient_for(self.win)
|
||||
|
||||
if self.game:
|
||||
self.set_title(_("Game Details"))
|
||||
self.set_title(_("Edit Game Details"))
|
||||
self.name.set_text(self.game.name)
|
||||
if self.game.developer:
|
||||
self.developer.set_text(self.game.developer)
|
||||
@@ -80,29 +76,16 @@ class DetailsWindow(Adw.Window):
|
||||
self.cover_button_delete_revealer.set_reveal_child(True)
|
||||
else:
|
||||
self.set_title(_("Add New Game"))
|
||||
self.apply_button.set_label(_("Add"))
|
||||
self.apply_button.set_label(_("Confirm"))
|
||||
|
||||
image_filter = Gtk.FileFilter(name=_("Images"))
|
||||
for extension in Image.registered_extensions():
|
||||
image_filter.add_suffix(extension[1:])
|
||||
image_filter.add_suffix("svg") # Gdk.Texture supports .svg but PIL doesn't
|
||||
|
||||
image_filters = Gio.ListStore.new(Gtk.FileFilter)
|
||||
image_filters.append(image_filter)
|
||||
|
||||
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)
|
||||
file_filters = Gio.ListStore.new(Gtk.FileFilter)
|
||||
file_filters.append(image_filter)
|
||||
self.file_dialog = Gtk.FileDialog()
|
||||
self.file_dialog.set_filters(file_filters)
|
||||
|
||||
# Translate this string as you would translate "file"
|
||||
file_name = _("file.txt")
|
||||
@@ -130,37 +113,29 @@ class DetailsWindow(Adw.Window):
|
||||
|
||||
self.exec_info_label.set_label(exec_info_text)
|
||||
|
||||
self.exec_info_popover.update_property(
|
||||
(Gtk.AccessibleProperty.LABEL,),
|
||||
(
|
||||
exec_info_text.replace("<tt>", "").replace("</tt>", ""),
|
||||
), # Remove formatting, else the screen reader reads it
|
||||
)
|
||||
def clear_info_selection(*_args):
|
||||
self.exec_info_label.select_region(0, 0)
|
||||
|
||||
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.exec_info_popover.connect("show", clear_info_selection)
|
||||
|
||||
self.cover_button_delete.connect("clicked", self.delete_pixbuf)
|
||||
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.name.connect("entry-activated", self.focus_executable)
|
||||
self.developer.connect("entry-activated", self.focus_executable)
|
||||
self.executable.connect("entry-activated", self.apply_preferences)
|
||||
self.name.connect("activate", self.focus_executable)
|
||||
self.developer.connect("activate", self.focus_executable)
|
||||
self.executable.connect("activate", self.apply_preferences)
|
||||
|
||||
self.set_focus(self.name)
|
||||
self.present()
|
||||
|
||||
def delete_pixbuf(self, *_args: Any) -> None:
|
||||
def delete_pixbuf(self, *_args):
|
||||
self.game_cover.new_cover()
|
||||
|
||||
self.cover_button_delete_revealer.set_reveal_child(False)
|
||||
self.cover_changed = True
|
||||
|
||||
def apply_preferences(self, *_args: Any) -> None:
|
||||
def apply_preferences(self, *_args):
|
||||
final_name = self.name.get_text()
|
||||
final_developer = self.developer.get_text()
|
||||
final_executable = self.executable.get_text()
|
||||
@@ -179,22 +154,20 @@ class DetailsWindow(Adw.Window):
|
||||
return
|
||||
|
||||
# Increment the number after the game id (eg. imported_1, imported_2)
|
||||
source_id = "imported"
|
||||
numbers = [0]
|
||||
game_id: str
|
||||
for game_id in shared.store.source_games.get(source_id, set()):
|
||||
for game_id in shared.store.games:
|
||||
prefix = "imported_"
|
||||
if not game_id.startswith(prefix):
|
||||
continue
|
||||
numbers.append(int(game_id.replace(prefix, "", 1)))
|
||||
|
||||
game_number = max(numbers) + 1
|
||||
|
||||
self.game = Game(
|
||||
{
|
||||
"game_id": f"imported_{game_number}",
|
||||
"hidden": False,
|
||||
"source": source_id,
|
||||
"source": "imported",
|
||||
"added": int(time()),
|
||||
}
|
||||
)
|
||||
@@ -220,10 +193,10 @@ class DetailsWindow(Adw.Window):
|
||||
self.game.developer = final_developer or None
|
||||
self.game.executable = final_executable
|
||||
|
||||
if self.game.game_id in shared.win.game_covers.keys():
|
||||
shared.win.game_covers[self.game.game_id].animation = None
|
||||
if self.game.game_id in self.win.game_covers.keys():
|
||||
self.win.game_covers[self.game.game_id].animation = None
|
||||
|
||||
shared.win.game_covers[self.game.game_id] = self.game_cover
|
||||
self.win.game_covers[self.game.game_id] = self.game_cover
|
||||
|
||||
if self.cover_changed:
|
||||
save_cover(
|
||||
@@ -246,9 +219,9 @@ class DetailsWindow(Adw.Window):
|
||||
self.game_cover.pictures.remove(self.cover)
|
||||
|
||||
self.close()
|
||||
shared.win.show_details_view(self.game)
|
||||
self.win.show_details_view(self.game)
|
||||
|
||||
def update_cover_callback(self, manager: SGDBManager) -> None:
|
||||
def update_cover_callback(self, manager: SGDBManager):
|
||||
# Set the game as not loading
|
||||
self.game.set_loading(-1)
|
||||
self.game.update()
|
||||
@@ -265,61 +238,33 @@ class DetailsWindow(Adw.Window):
|
||||
_("Preferences"),
|
||||
).connect("response", self.update_cover_error_response)
|
||||
|
||||
def update_cover_error_response(self, _widget: Any, response: str) -> None:
|
||||
def update_cover_error_response(self, _widget, response):
|
||||
if response == "open_preferences":
|
||||
shared.win.get_application().on_preferences_action(page_name="sgdb")
|
||||
|
||||
def focus_executable(self, *_args: Any) -> None:
|
||||
def focus_executable(self, *_args):
|
||||
self.set_focus(self.executable)
|
||||
|
||||
def toggle_loading(self) -> None:
|
||||
def toggle_loading(self):
|
||||
self.apply_button.set_sensitive(not self.apply_button.get_sensitive())
|
||||
self.spinner.set_spinning(not self.spinner.get_spinning())
|
||||
self.cover_overlay.set_opacity(not self.cover_overlay.get_opacity())
|
||||
|
||||
def set_cover(self, _source: Any, result: Gio.Task, *_args: Any) -> None:
|
||||
def set_cover(self, _source, result, *_args):
|
||||
try:
|
||||
path = self.image_file_dialog.open_finish(result).get_path()
|
||||
path = self.file_dialog.open_finish(result).get_path()
|
||||
except GLib.GError:
|
||||
return
|
||||
|
||||
def thread_func() -> None:
|
||||
new_path = None
|
||||
|
||||
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)
|
||||
def resize():
|
||||
if cover := resize_cover(path):
|
||||
self.game_cover.new_cover(cover)
|
||||
self.cover_button_delete_revealer.set_reveal_child(True)
|
||||
self.cover_changed = True
|
||||
|
||||
self.toggle_loading()
|
||||
|
||||
self.toggle_loading()
|
||||
GLib.Thread.new(None, thread_func)
|
||||
GLib.Thread.new(None, resize)
|
||||
|
||||
def set_executable(self, _source: Any, result: Gio.Task, *_args: Any) -> None:
|
||||
try:
|
||||
path = self.exec_file_dialog.open_finish(result).get_path()
|
||||
except GLib.GError:
|
||||
return
|
||||
|
||||
self.executable.set_text(shlex.quote(path))
|
||||
|
||||
def choose_executable(self, *_args: Any) -> None:
|
||||
self.exec_file_dialog.open(self, None, self.set_executable)
|
||||
|
||||
def choose_cover(self, *_args: Any) -> None:
|
||||
self.image_file_dialog.open(self, None, self.set_cover)
|
||||
def choose_cover(self, *_args):
|
||||
self.file_dialog.open(self, None, self.set_cover)
|
||||
|
||||
@@ -8,14 +8,14 @@ class ErrorProducer:
|
||||
Specifies the report_error and collect_errors methods in a thread-safe manner.
|
||||
"""
|
||||
|
||||
errors: list[Exception]
|
||||
errors_lock: Lock
|
||||
errors: list[Exception] = None
|
||||
errors_lock: Lock = None
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.errors = []
|
||||
self.errors_lock = Lock()
|
||||
|
||||
def report_error(self, error: Exception) -> None:
|
||||
def report_error(self, error: Exception):
|
||||
"""Report an error"""
|
||||
with self.errors_lock:
|
||||
self.errors.append(error)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Iterable, Optional
|
||||
from typing import Iterable
|
||||
|
||||
|
||||
class FriendlyError(Exception):
|
||||
@@ -27,8 +27,8 @@ class FriendlyError(Exception):
|
||||
self,
|
||||
title: str,
|
||||
subtitle: str,
|
||||
title_args: Optional[Iterable[str]] = None,
|
||||
subtitle_args: Optional[Iterable[str]] = None,
|
||||
title_args: Iterable[str] = None,
|
||||
subtitle_args: Iterable[str] = None,
|
||||
) -> None:
|
||||
"""Create a friendly error
|
||||
|
||||
|
||||
81
src/game.py
@@ -23,12 +23,10 @@ import shlex
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from time import time
|
||||
from typing import Any, Optional
|
||||
|
||||
from gi.repository import Adw, GLib, GObject, Gtk
|
||||
|
||||
from src import shared
|
||||
from src.game_cover import GameCover
|
||||
|
||||
|
||||
# pylint: disable=too-many-instance-attributes
|
||||
@@ -47,23 +45,23 @@ class Game(Gtk.Box):
|
||||
game_options = Gtk.Template.Child()
|
||||
hidden_game_options = Gtk.Template.Child()
|
||||
|
||||
loading: int = 0
|
||||
filtered: bool = False
|
||||
loading = 0
|
||||
filtered = False
|
||||
|
||||
added: int
|
||||
executable: str
|
||||
game_id: str
|
||||
source: str
|
||||
hidden: bool = False
|
||||
last_played: int = 0
|
||||
name: str
|
||||
developer: Optional[str] = None
|
||||
removed: bool = False
|
||||
blacklisted: bool = False
|
||||
game_cover: GameCover = None
|
||||
version: int = 0
|
||||
added = None
|
||||
executable = None
|
||||
game_id = None
|
||||
source = None
|
||||
hidden = False
|
||||
last_played = 0
|
||||
name = None
|
||||
developer = None
|
||||
removed = False
|
||||
blacklisted = False
|
||||
game_cover = None
|
||||
version = 0
|
||||
|
||||
def __init__(self, data: dict[str, Any], **kwargs: Any) -> None:
|
||||
def __init__(self, data, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.win = shared.win
|
||||
@@ -71,7 +69,6 @@ class Game(Gtk.Box):
|
||||
self.version = shared.SPEC_VERSION
|
||||
|
||||
self.update_values(data)
|
||||
self.base_source = self.source.split("_")[0]
|
||||
|
||||
self.set_play_icon()
|
||||
|
||||
@@ -84,20 +81,20 @@ class Game(Gtk.Box):
|
||||
|
||||
shared.schema.connect("changed", self.schema_changed)
|
||||
|
||||
def update_values(self, data: dict[str, Any]) -> None:
|
||||
def update_values(self, data):
|
||||
for key, value in data.items():
|
||||
# Convert executables to strings
|
||||
if key == "executable" and isinstance(value, list):
|
||||
value = shlex.join(value)
|
||||
setattr(self, key, value)
|
||||
|
||||
def update(self) -> None:
|
||||
def update(self):
|
||||
self.emit("update-ready", {})
|
||||
|
||||
def save(self) -> None:
|
||||
def save(self):
|
||||
self.emit("save-ready", {})
|
||||
|
||||
def create_toast(self, title: str, action: Optional[str] = None) -> None:
|
||||
def create_toast(self, title, action=None):
|
||||
toast = Adw.Toast.new(title.format(self.name))
|
||||
toast.set_priority(Adw.ToastPriority.HIGH)
|
||||
|
||||
@@ -113,7 +110,7 @@ class Game(Gtk.Box):
|
||||
|
||||
self.win.toast_overlay.add_toast(toast)
|
||||
|
||||
def launch(self) -> None:
|
||||
def launch(self):
|
||||
self.last_played = int(time())
|
||||
self.save()
|
||||
self.update()
|
||||
@@ -128,10 +125,10 @@ class Game(Gtk.Box):
|
||||
# pylint: disable=consider-using-with
|
||||
subprocess.Popen(
|
||||
args,
|
||||
cwd=shared.home,
|
||||
cwd=Path.home(),
|
||||
shell=True,
|
||||
start_new_session=True,
|
||||
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0, # type: ignore
|
||||
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0,
|
||||
)
|
||||
|
||||
if shared.schema.get_boolean("exit-after-launch"):
|
||||
@@ -140,15 +137,14 @@ class Game(Gtk.Box):
|
||||
# The variable is the title of the game
|
||||
self.create_toast(_("{} launched"))
|
||||
|
||||
def toggle_hidden(self, toast: bool = True) -> None:
|
||||
def toggle_hidden(self, toast=True):
|
||||
self.hidden = not self.hidden
|
||||
self.save()
|
||||
self.update()
|
||||
|
||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
||||
self.win.on_go_back_action()
|
||||
|
||||
self.update()
|
||||
|
||||
if toast:
|
||||
self.create_toast(
|
||||
# The variable is the title of the game
|
||||
@@ -158,7 +154,7 @@ class Game(Gtk.Box):
|
||||
"hide",
|
||||
)
|
||||
|
||||
def remove_game(self) -> None:
|
||||
def remove_game(self):
|
||||
# Add "removed=True" to the game properties so it can be deleted on next init
|
||||
self.removed = True
|
||||
self.save()
|
||||
@@ -167,58 +163,55 @@ class Game(Gtk.Box):
|
||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
||||
self.win.on_go_back_action()
|
||||
|
||||
# The variable is the title of the game
|
||||
self.create_toast(
|
||||
# The variable is the title of the game
|
||||
_("{} removed").format(GLib.markup_escape_text(self.name)),
|
||||
"remove",
|
||||
_("{} removed").format(GLib.markup_escape_text(self.name)), "remove"
|
||||
)
|
||||
|
||||
def set_loading(self, state: int) -> None:
|
||||
def set_loading(self, state):
|
||||
self.loading += state
|
||||
loading = self.loading > 0
|
||||
|
||||
self.cover.set_opacity(int(not loading))
|
||||
self.spinner.set_spinning(loading)
|
||||
|
||||
def get_cover_path(self) -> Optional[Path]:
|
||||
def get_cover_path(self):
|
||||
cover_path = shared.covers_dir / f"{self.game_id}.gif"
|
||||
if cover_path.is_file():
|
||||
return cover_path # type: ignore
|
||||
return cover_path
|
||||
|
||||
cover_path = shared.covers_dir / f"{self.game_id}.tiff"
|
||||
if cover_path.is_file():
|
||||
return cover_path # type: ignore
|
||||
return cover_path
|
||||
|
||||
return None
|
||||
|
||||
def toggle_play(
|
||||
self, _widget: Any, _prop1: Any, _prop2: Any, state: bool = True
|
||||
) -> None:
|
||||
def toggle_play(self, _widget, _prop1, _prop2, state=True):
|
||||
if not self.menu_button.get_active():
|
||||
self.play_revealer.set_reveal_child(not state)
|
||||
self.menu_revealer.set_reveal_child(not state)
|
||||
|
||||
def main_button_clicked(self, _widget: Any, button: bool) -> None:
|
||||
def main_button_clicked(self, _widget, button):
|
||||
if shared.schema.get_boolean("cover-launches-game") ^ button:
|
||||
self.launch()
|
||||
else:
|
||||
self.win.show_details_view(self)
|
||||
|
||||
def set_play_icon(self) -> None:
|
||||
def set_play_icon(self):
|
||||
self.play_button.set_icon_name(
|
||||
"help-about-symbolic"
|
||||
if shared.schema.get_boolean("cover-launches-game")
|
||||
else "media-playback-start-symbolic"
|
||||
)
|
||||
|
||||
def schema_changed(self, _settings: Any, key: str) -> None:
|
||||
def schema_changed(self, _settings, key):
|
||||
if key == "cover-launches-game":
|
||||
self.set_play_icon()
|
||||
|
||||
@GObject.Signal(name="update-ready", arg_types=[object])
|
||||
def update_ready(self, _additional_data): # type: ignore
|
||||
def update_ready(self, _additional_data) -> None:
|
||||
"""Signal emitted when the game needs updating"""
|
||||
|
||||
@GObject.Signal(name="save-ready", arg_types=[object])
|
||||
def save_ready(self, _additional_data): # type: ignore
|
||||
def save_ready(self, _additional_data) -> None:
|
||||
"""Signal emitted when the game needs saving"""
|
||||
|
||||
@@ -17,22 +17,19 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from gi.repository import Gdk, GdkPixbuf, Gio, GLib, Gtk
|
||||
from gi.repository import Gdk, GdkPixbuf, Gio, GLib
|
||||
from PIL import Image, ImageFilter, ImageStat
|
||||
|
||||
from src import shared
|
||||
|
||||
|
||||
class GameCover:
|
||||
texture: Optional[Gdk.Texture]
|
||||
blurred: Optional[Gdk.Texture]
|
||||
luminance: Optional[tuple[float, float]]
|
||||
path: Optional[Path]
|
||||
animation: Optional[GdkPixbuf.PixbufAnimation]
|
||||
anim_iter: Optional[GdkPixbuf.PixbufAnimationIter]
|
||||
texture = None
|
||||
blurred = None
|
||||
luminance = None
|
||||
path = None
|
||||
animation = None
|
||||
anim_iter = None
|
||||
|
||||
placeholder = Gdk.Texture.new_from_resource(
|
||||
shared.PREFIX + "/library_placeholder.svg"
|
||||
@@ -41,11 +38,21 @@ class GameCover:
|
||||
shared.PREFIX + "/library_placeholder_small.svg"
|
||||
)
|
||||
|
||||
def __init__(self, pictures: set[Gtk.Picture], path: Optional[Path] = None) -> None:
|
||||
def __init__(self, pictures, path=None):
|
||||
self.pictures = pictures
|
||||
self.new_cover(path)
|
||||
|
||||
def new_cover(self, path: Optional[Path] = None) -> None:
|
||||
# Wrap the function in another one as Gio.Task.run_in_thread does not allow for passing args
|
||||
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.texture = None
|
||||
self.blurred = None
|
||||
@@ -54,26 +61,22 @@ class GameCover:
|
||||
|
||||
if path:
|
||||
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.run_in_thread(
|
||||
lambda *_: self.update_animation((self.task, self.animation))
|
||||
)
|
||||
task = Gio.Task.new()
|
||||
task.run_in_thread(self.create_func(self.path))
|
||||
else:
|
||||
self.texture = Gdk.Texture.new_from_filename(str(path))
|
||||
|
||||
if not self.animation:
|
||||
self.set_texture(self.texture)
|
||||
|
||||
def get_texture(self) -> Gdk.Texture:
|
||||
def get_texture(self):
|
||||
return (
|
||||
Gdk.Texture.new_for_pixbuf(self.animation.get_static_image())
|
||||
if self.animation
|
||||
else self.texture
|
||||
)
|
||||
|
||||
def get_blurred(self) -> Gdk.Texture:
|
||||
def get_blurred(self):
|
||||
if not self.blurred:
|
||||
if self.path:
|
||||
with Image.open(self.path) as image:
|
||||
@@ -91,24 +94,22 @@ class GameCover:
|
||||
stat = ImageStat.Stat(image.convert("L"))
|
||||
|
||||
# Luminance values for light and dark mode
|
||||
self.luminance = (
|
||||
self.luminance = [
|
||||
min((stat.mean[0] + stat.extrema[0][0]) / 510, 0.7),
|
||||
max((stat.mean[0] + stat.extrema[0][1]) / 510, 0.3),
|
||||
)
|
||||
]
|
||||
else:
|
||||
self.blurred = self.placeholder_small
|
||||
self.luminance = (0.3, 0.5)
|
||||
|
||||
return self.blurred
|
||||
|
||||
def add_picture(self, picture: Gtk.Picture) -> None:
|
||||
def add_picture(self, picture):
|
||||
self.pictures.add(picture)
|
||||
if not self.animation:
|
||||
self.set_texture(self.texture)
|
||||
else:
|
||||
self.update_animation((self.task, self.animation))
|
||||
|
||||
def set_texture(self, texture: Gdk.Texture) -> None:
|
||||
def set_texture(self, texture):
|
||||
self.pictures.discard(
|
||||
picture for picture in self.pictures if not picture.is_visible()
|
||||
)
|
||||
@@ -118,15 +119,17 @@ class GameCover:
|
||||
for picture in self.pictures:
|
||||
picture.set_paintable(texture or self.placeholder)
|
||||
|
||||
def update_animation(self, data: GdkPixbuf.PixbufAnimation) -> None:
|
||||
def update_animation(self, data):
|
||||
if self.animation == data[1]:
|
||||
self.anim_iter.advance() # type: ignore
|
||||
self.anim_iter.advance()
|
||||
|
||||
self.set_texture(Gdk.Texture.new_for_pixbuf(self.anim_iter.get_pixbuf())) # type: ignore
|
||||
self.set_texture(Gdk.Texture.new_for_pixbuf(self.anim_iter.get_pixbuf()))
|
||||
|
||||
delay_time = self.anim_iter.get_delay_time() # type: ignore
|
||||
delay_time = self.anim_iter.get_delay_time()
|
||||
GLib.timeout_add(
|
||||
20 if delay_time < 20 else delay_time,
|
||||
self.update_animation,
|
||||
data,
|
||||
)
|
||||
else:
|
||||
data[0].return_value(False)
|
||||
|
||||
@@ -19,10 +19,8 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import logging
|
||||
from time import time
|
||||
from typing import Any, Optional
|
||||
|
||||
from gi.repository import Adw, Gio, GLib, Gtk
|
||||
from gi.repository import Adw, GLib, Gtk
|
||||
|
||||
from src import shared
|
||||
from src.errors.error_producer import ErrorProducer
|
||||
@@ -32,60 +30,48 @@ from src.importer.sources.location import UnresolvableLocationError
|
||||
from src.importer.sources.source import Source
|
||||
from src.store.managers.async_manager import AsyncManager
|
||||
from src.store.pipeline import Pipeline
|
||||
from src.utils.task import Task
|
||||
|
||||
|
||||
# pylint: disable=too-many-instance-attributes
|
||||
class Importer(ErrorProducer):
|
||||
"""A class in charge of scanning sources for games"""
|
||||
|
||||
progressbar: Gtk.ProgressBar
|
||||
import_statuspage: Adw.StatusPage
|
||||
import_dialog: Adw.MessageDialog
|
||||
summary_toast: Optional[Adw.Toast] = None
|
||||
progressbar = None
|
||||
import_statuspage = None
|
||||
import_dialog = None
|
||||
summary_toast = None
|
||||
|
||||
sources: set[Source]
|
||||
sources: set[Source] = None
|
||||
|
||||
n_source_tasks_created: int = 0
|
||||
n_source_tasks_done: int = 0
|
||||
n_pipelines_done: int = 0
|
||||
game_pipelines: set[Pipeline]
|
||||
game_pipelines: set[Pipeline] = None
|
||||
|
||||
removed_game_ids: set[str]
|
||||
imported_game_ids: set[str]
|
||||
|
||||
def __init__(self) -> None:
|
||||
def __init__(self):
|
||||
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.sources = set()
|
||||
|
||||
@property
|
||||
def n_games_added(self) -> int:
|
||||
def n_games_added(self):
|
||||
return sum(
|
||||
1 if not (pipeline.game.blacklisted or pipeline.game.removed) else 0
|
||||
for pipeline in self.game_pipelines
|
||||
)
|
||||
|
||||
@property
|
||||
def pipelines_progress(self) -> float:
|
||||
def pipelines_progress(self):
|
||||
progress = sum(pipeline.progress for pipeline in self.game_pipelines)
|
||||
try:
|
||||
progress = progress / len(self.game_pipelines)
|
||||
except ZeroDivisionError:
|
||||
progress = 0
|
||||
return progress # type: ignore
|
||||
return progress
|
||||
|
||||
@property
|
||||
def sources_progress(self) -> float:
|
||||
def sources_progress(self):
|
||||
try:
|
||||
progress = self.n_source_tasks_done / self.n_source_tasks_created
|
||||
except ZeroDivisionError:
|
||||
@@ -93,23 +79,18 @@ class Importer(ErrorProducer):
|
||||
return progress
|
||||
|
||||
@property
|
||||
def finished(self) -> bool:
|
||||
def finished(self):
|
||||
return (
|
||||
self.n_source_tasks_created == self.n_source_tasks_done
|
||||
and len(self.game_pipelines) == self.n_pipelines_done
|
||||
)
|
||||
|
||||
def add_source(self, source: Source) -> None:
|
||||
def add_source(self, source):
|
||||
self.sources.add(source)
|
||||
|
||||
def run(self) -> None:
|
||||
def run(self):
|
||||
"""Use several Gio.Task to import games from added sources"""
|
||||
|
||||
if self.__class__.summary_toast:
|
||||
self.__class__.summary_toast.dismiss()
|
||||
|
||||
shared.win.get_application().lookup_action("import").set_enabled(False)
|
||||
|
||||
self.create_dialog()
|
||||
|
||||
# Collect all errors and reset the cancellables for the managers
|
||||
@@ -122,18 +103,15 @@ class Importer(ErrorProducer):
|
||||
manager.reset_cancellable()
|
||||
|
||||
for source in self.sources:
|
||||
logging.debug("Importing games from source %s", source.source_id)
|
||||
task = Gio.Task.new(None, None, self.source_callback, (source,))
|
||||
logging.debug("Importing games from source %s", source.id)
|
||||
task = Task.new(None, None, self.source_callback, (source,))
|
||||
self.n_source_tasks_created += 1
|
||||
task.run_in_thread(
|
||||
lambda _task, _obj, _data, _cancellable, src=source: self.source_task_thread_func(
|
||||
(src,)
|
||||
)
|
||||
)
|
||||
task.set_task_data((source,))
|
||||
task.run_in_thread(self.source_task_thread_func)
|
||||
|
||||
self.progress_changed_callback()
|
||||
|
||||
def create_dialog(self) -> None:
|
||||
def create_dialog(self):
|
||||
"""Create the import dialog"""
|
||||
self.progressbar = Gtk.ProgressBar(margin_start=12, margin_end=12)
|
||||
self.import_statuspage = Adw.StatusPage(
|
||||
@@ -150,7 +128,7 @@ class Importer(ErrorProducer):
|
||||
)
|
||||
self.import_dialog.present()
|
||||
|
||||
def source_task_thread_func(self, data: tuple) -> None:
|
||||
def source_task_thread_func(self, _task, _obj, data, _cancellable):
|
||||
"""Source import task code"""
|
||||
|
||||
source: Source
|
||||
@@ -158,16 +136,16 @@ class Importer(ErrorProducer):
|
||||
|
||||
# Early exit if not available or not installed
|
||||
if not source.is_available:
|
||||
logging.info("Source %s skipped, not available", source.source_id)
|
||||
logging.info("Source %s skipped, not available", source.id)
|
||||
return
|
||||
try:
|
||||
iterator = iter(source)
|
||||
except UnresolvableLocationError:
|
||||
logging.info("Source %s skipped, bad location", source.source_id)
|
||||
logging.info("Source %s skipped, bad location", source.id)
|
||||
return
|
||||
|
||||
# Get games from source
|
||||
logging.info("Scanning source %s", source.source_id)
|
||||
logging.info("Scanning source %s", source.id)
|
||||
while True:
|
||||
# Handle exceptions raised when iterating
|
||||
try:
|
||||
@@ -175,7 +153,7 @@ class Importer(ErrorProducer):
|
||||
except StopIteration:
|
||||
break
|
||||
except Exception as error: # pylint: disable=broad-exception-caught
|
||||
logging.exception("%s in %s", type(error).__name__, source.source_id)
|
||||
logging.exception("%s in %s", type(error).__name__, source.id)
|
||||
self.report_error(error)
|
||||
continue
|
||||
|
||||
@@ -192,7 +170,7 @@ class Importer(ErrorProducer):
|
||||
# Should not happen on production code
|
||||
logging.warning(
|
||||
"%s produced an invalid iteration return type %s",
|
||||
source.source_id,
|
||||
source.id,
|
||||
type(iteration_result),
|
||||
)
|
||||
continue
|
||||
@@ -204,27 +182,27 @@ class Importer(ErrorProducer):
|
||||
pipeline.connect("advanced", self.pipeline_advanced_callback)
|
||||
self.game_pipelines.add(pipeline)
|
||||
|
||||
def update_progressbar(self) -> None:
|
||||
def update_progressbar(self):
|
||||
"""Update the progressbar to show the overall import progress"""
|
||||
# Reserve 10% for the sources discovery, the rest is the pipelines
|
||||
self.progressbar.set_fraction(
|
||||
(0.1 * self.sources_progress) + (0.9 * self.pipelines_progress)
|
||||
)
|
||||
|
||||
def source_callback(self, _obj: Any, _result: Any, data: tuple) -> None:
|
||||
def source_callback(self, _obj, _result, data):
|
||||
"""Callback executed when a source is fully scanned"""
|
||||
source, *_rest = data
|
||||
logging.debug("Import done for source %s", source.source_id)
|
||||
logging.debug("Import done for source %s", source.id)
|
||||
self.n_source_tasks_done += 1
|
||||
self.progress_changed_callback()
|
||||
|
||||
def pipeline_advanced_callback(self, pipeline: Pipeline) -> None:
|
||||
def pipeline_advanced_callback(self, pipeline: Pipeline):
|
||||
"""Callback called when a pipeline for a game has advanced"""
|
||||
if pipeline.is_done:
|
||||
self.n_pipelines_done += 1
|
||||
self.progress_changed_callback()
|
||||
|
||||
def progress_changed_callback(self) -> None:
|
||||
def progress_changed_callback(self):
|
||||
"""
|
||||
Callback called when the import process has progressed
|
||||
|
||||
@@ -237,47 +215,18 @@ class Importer(ErrorProducer):
|
||||
if self.finished:
|
||||
self.import_callback()
|
||||
|
||||
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:
|
||||
def import_callback(self):
|
||||
"""Callback called when importing has finished"""
|
||||
logging.info("Import done")
|
||||
self.remove_games()
|
||||
self.imported_game_ids = shared.store.new_game_ids
|
||||
shared.store.new_game_ids = set()
|
||||
shared.store.duplicate_game_ids = set()
|
||||
self.import_dialog.close()
|
||||
self.__class__.summary_toast = self.create_summary_toast()
|
||||
self.summary_toast = self.create_summary_toast()
|
||||
self.create_error_dialog()
|
||||
shared.win.get_application().lookup_action("import").set_enabled(True)
|
||||
|
||||
def create_error_dialog(self) -> None:
|
||||
def create_error_dialog(self):
|
||||
"""Dialog containing all errors raised by importers"""
|
||||
|
||||
# Collect all errors that happened in the importer and the managers
|
||||
errors = []
|
||||
errors: list[Exception] = []
|
||||
errors.extend(self.collect_errors())
|
||||
for manager in shared.store.managers.values():
|
||||
errors.extend(manager.collect_errors())
|
||||
@@ -314,7 +263,7 @@ class Importer(ErrorProducer):
|
||||
list_box = Gtk.ListBox()
|
||||
list_box.set_selection_mode(Gtk.SelectionMode.NONE)
|
||||
list_box.set_css_classes(["boxed-list"])
|
||||
list_box.set_margin_top(9)
|
||||
list_box.set_margin_top(8)
|
||||
for error in errors:
|
||||
row = Adw.ActionRow.new()
|
||||
row.set_title(error[0])
|
||||
@@ -325,80 +274,41 @@ class Importer(ErrorProducer):
|
||||
|
||||
dialog.present()
|
||||
|
||||
def undo_import(self, *_args: Any) -> None:
|
||||
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"""
|
||||
def create_summary_toast(self):
|
||||
"""N games imported toast"""
|
||||
|
||||
toast = Adw.Toast(timeout=0, priority=Adw.ToastPriority.HIGH)
|
||||
|
||||
if not self.n_games_added:
|
||||
toast_title = _("No new games found")
|
||||
|
||||
if not self.removed_game_ids:
|
||||
toast.set_button_label(_("Preferences"))
|
||||
toast.connect(
|
||||
"button-clicked",
|
||||
self.dialog_response_callback,
|
||||
"open_preferences",
|
||||
"import",
|
||||
)
|
||||
if self.n_games_added == 0:
|
||||
toast.set_title(_("No new games found"))
|
||||
toast.set_button_label(_("Preferences"))
|
||||
toast.connect(
|
||||
"button-clicked",
|
||||
self.dialog_response_callback,
|
||||
"open_preferences",
|
||||
"import",
|
||||
)
|
||||
|
||||
elif self.n_games_added == 1:
|
||||
toast_title = _("1 game imported")
|
||||
toast.set_title(_("1 game imported"))
|
||||
|
||||
elif self.n_games_added > 1:
|
||||
# The variable is the number of games
|
||||
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)
|
||||
toast.set_title(_("{} games imported").format(self.n_games_added))
|
||||
|
||||
shared.win.toast_overlay.add_toast(toast)
|
||||
return toast
|
||||
|
||||
def open_preferences(
|
||||
self,
|
||||
page_name: Optional[str] = None,
|
||||
expander_row: Optional[Adw.ExpanderRow] = None,
|
||||
) -> Adw.PreferencesWindow:
|
||||
def open_preferences(self, page=None, expander_row=None):
|
||||
return shared.win.get_application().on_preferences_action(
|
||||
page_name=page_name, expander_row=expander_row
|
||||
page_name=page, expander_row=expander_row
|
||||
)
|
||||
|
||||
def timeout_toast(self, *_args: Any) -> None:
|
||||
def timeout_toast(self, *_args):
|
||||
"""Manually timeout the toast after the user has dismissed all warnings"""
|
||||
if self.__class__.summary_toast:
|
||||
GLib.timeout_add_seconds(5, self.__class__.summary_toast.dismiss)
|
||||
GLib.timeout_add_seconds(5, self.summary_toast.dismiss)
|
||||
|
||||
def dialog_response_callback(self, _widget: Any, response: str, *args: Any) -> None:
|
||||
def dialog_response_callback(self, _widget, response, *args):
|
||||
"""Handle after-import dialogs callback"""
|
||||
logging.debug("After-import dialog response: %s (%s)", response, str(args))
|
||||
if response == "open_preferences":
|
||||
|
||||
@@ -19,35 +19,39 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple
|
||||
from time import time
|
||||
|
||||
import yaml
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import SourceIterable, URLExecutableSource
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import (
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
URLExecutableSource,
|
||||
)
|
||||
|
||||
|
||||
class BottlesSourceIterable(SourceIterable):
|
||||
class BottlesSourceIterator(SourceIterator):
|
||||
source: "BottlesSource"
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""Generator method producing games"""
|
||||
|
||||
data = self.source.locations.data["library.yml"].read_text("utf-8")
|
||||
data = self.source.data_location["library.yml"].read_text("utf-8")
|
||||
library: dict = yaml.safe_load(data)
|
||||
added_time = int(time())
|
||||
|
||||
for entry in library.values():
|
||||
# Build game
|
||||
values = {
|
||||
"source": self.source.source_id,
|
||||
"added": shared.import_time,
|
||||
"source": self.source.id,
|
||||
"added": added_time,
|
||||
"name": entry["name"],
|
||||
"game_id": self.source.game_id_format.format(game_id=entry["id"]),
|
||||
"executable": self.source.make_executable(
|
||||
bottle_name=entry["bottle"]["name"],
|
||||
game_name=entry["name"],
|
||||
"executable": self.source.executable_format.format(
|
||||
bottle_name=entry["bottle"]["name"], game_name=entry["name"]
|
||||
),
|
||||
}
|
||||
game = Game(values)
|
||||
@@ -58,11 +62,11 @@ class BottlesSourceIterable(SourceIterable):
|
||||
# as Cartridges can't access directories picked via Bottles' file picker portal
|
||||
bottles_location = Path(
|
||||
yaml.safe_load(
|
||||
self.source.locations.data["data.yml"].read_text("utf-8")
|
||||
self.source.data_location["data.yml"].read_text("utf-8")
|
||||
)["custom_bottles_path"]
|
||||
)
|
||||
except (FileNotFoundError, KeyError):
|
||||
bottles_location = self.source.locations.data.root / "bottles"
|
||||
bottles_location = self.source.data_location.root / "bottles"
|
||||
|
||||
bottle_path = entry["bottle"]["path"]
|
||||
|
||||
@@ -72,38 +76,26 @@ class BottlesSourceIterable(SourceIterable):
|
||||
image_path = bottles_location / bottle_path / "grids" / image_name
|
||||
additional_data = {"local_image_path": image_path}
|
||||
|
||||
# Produce game
|
||||
yield (game, additional_data)
|
||||
|
||||
|
||||
class BottlesLocations(NamedTuple):
|
||||
data: Location
|
||||
|
||||
|
||||
class BottlesSource(URLExecutableSource):
|
||||
"""Generic Bottles source"""
|
||||
|
||||
source_id = "bottles"
|
||||
name = _("Bottles")
|
||||
iterable_class = BottlesSourceIterable
|
||||
name = "Bottles"
|
||||
iterator_class = BottlesSourceIterator
|
||||
url_format = 'bottles:run/"{bottle_name}"/"{game_name}"'
|
||||
available_on = {"linux"}
|
||||
available_on = set(("linux",))
|
||||
|
||||
locations: BottlesLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = BottlesLocations(
|
||||
Location(
|
||||
schema_key="bottles-location",
|
||||
candidates=(
|
||||
shared.flatpak_dir / "com.usebottles.bottles" / "data" / "bottles",
|
||||
shared.data_dir / "bottles/",
|
||||
shared.home / ".local" / "share" / "bottles",
|
||||
),
|
||||
paths={
|
||||
"library.yml": LocationSubPath("library.yml"),
|
||||
"data.yml": LocationSubPath("data.yml"),
|
||||
},
|
||||
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||
)
|
||||
)
|
||||
data_location = Location(
|
||||
schema_key="bottles-location",
|
||||
candidates=(
|
||||
"~/.var/app/com.usebottles.bottles/data/bottles/",
|
||||
shared.data_dir / "bottles/",
|
||||
),
|
||||
paths={
|
||||
"library.yml": (False, "library.yml"),
|
||||
"data.yml": (False, "data.yml"),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
# 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 src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.source import Source, SourceIterable
|
||||
|
||||
|
||||
class DesktopSourceIterable(SourceIterable):
|
||||
source: "DesktopSource"
|
||||
|
||||
def __iter__(self):
|
||||
"""Generator method producing games"""
|
||||
|
||||
icon_theme = Gtk.IconTheme.new()
|
||||
|
||||
search_paths = [
|
||||
shared.home / ".local" / "share",
|
||||
"/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_command()
|
||||
|
||||
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.GError:
|
||||
continue
|
||||
|
||||
# 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.GError:
|
||||
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.GError:
|
||||
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.GError:
|
||||
pass
|
||||
|
||||
yield (game, additional_data)
|
||||
|
||||
def check_launch_command(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))
|
||||
flatpak_str = "flatpak-spawn --host /bin/sh -c "
|
||||
|
||||
for command, full_path in commands:
|
||||
# Even if `gio` is available, `gio launch` is only available on GLib >= 2.67.2
|
||||
check_command = (
|
||||
"gio help launch"
|
||||
if command == "gio launch"
|
||||
else f"type {command} &> /dev/null"
|
||||
)
|
||||
if os.getenv("FLATPAK_ID") == shared.APP_ID:
|
||||
check_command = flatpak_str + shlex.quote(check_command)
|
||||
|
||||
try:
|
||||
subprocess.run(check_command, shell=True, check=True)
|
||||
return command, full_path
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
return commands[2]
|
||||
|
||||
|
||||
class DesktopLocations(NamedTuple):
|
||||
pass
|
||||
|
||||
|
||||
class DesktopSource(Source):
|
||||
"""Generic Flatpak source"""
|
||||
|
||||
source_id = "desktop"
|
||||
name = _("Desktop")
|
||||
iterable_class = DesktopSourceIterable
|
||||
available_on = {"linux"}
|
||||
|
||||
locations: DesktopLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = DesktopLocations()
|
||||
@@ -17,124 +17,118 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple
|
||||
|
||||
from gi.repository import GLib, Gtk
|
||||
from time import time
|
||||
import subprocess
|
||||
from xdg import IconTheme
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import ExecutableFormatSource, SourceIterable
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import Source, SourceIterationResult, SourceIterator
|
||||
|
||||
|
||||
class FlatpakSourceIterable(SourceIterable):
|
||||
class FlatpakSourceIterator(SourceIterator):
|
||||
source: "FlatpakSource"
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""Generator method producing games"""
|
||||
|
||||
icon_theme = Gtk.IconTheme.new()
|
||||
icon_theme.add_search_path(str(self.source.locations.data["icons"]))
|
||||
added_time = int(time())
|
||||
|
||||
blacklist = (
|
||||
{"hu.kramo.Cartridges", "hu.kramo.Cartridges.Devel"}
|
||||
if shared.schema.get_boolean("flatpak-import-launchers")
|
||||
else {
|
||||
"hu.kramo.Cartridges",
|
||||
"hu.kramo.Cartridges.Devel",
|
||||
"com.valvesoftware.Steam",
|
||||
"net.lutris.Lutris",
|
||||
"com.heroicgameslauncher.hgl",
|
||||
"com.usebottles.Bottles",
|
||||
"io.itch.itch",
|
||||
"org.libretro.RetroArch",
|
||||
}
|
||||
)
|
||||
IconTheme.icondirs.append(self.source.data_location["icons"])
|
||||
|
||||
for entry in (self.source.locations.data["applications"]).iterdir():
|
||||
if entry.suffix != ".desktop":
|
||||
try:
|
||||
process = subprocess.run(
|
||||
("flatpak-spawn", "--host", "flatpak", "list", "--columns=application"),
|
||||
capture_output=True,
|
||||
encoding="utf-8",
|
||||
check=True,
|
||||
)
|
||||
flatpak_ids = process.stdout.split("\n")
|
||||
|
||||
to_remove = (
|
||||
{"hu.kramo.Cartridges"}
|
||||
if shared.schema.get_boolean("flatpak-import-launchers")
|
||||
else {
|
||||
"hu.kramo.Cartridges",
|
||||
"com.valvesoftware.Steam",
|
||||
"net.lutris.Lutris",
|
||||
"com.heroicgameslauncher.hgl",
|
||||
"com.usebottles.Bottles",
|
||||
"io.itch.itch",
|
||||
}
|
||||
)
|
||||
|
||||
for item in to_remove:
|
||||
if item in flatpak_ids:
|
||||
flatpak_ids.remove(item)
|
||||
|
||||
except subprocess.CalledProcessError:
|
||||
return
|
||||
|
||||
for entry in (self.source.data_location["applications"]).iterdir():
|
||||
flatpak_id = entry.stem
|
||||
|
||||
if flatpak_id not in flatpak_ids:
|
||||
continue
|
||||
|
||||
keyfile = GLib.KeyFile.new()
|
||||
with entry.open("r", encoding="utf-8") as open_file:
|
||||
string = open_file.read()
|
||||
|
||||
try:
|
||||
keyfile.load_from_file(str(entry), 0)
|
||||
desktop_values = {"Name": None, "Icon": None, "Categories": None}
|
||||
for key in desktop_values:
|
||||
if regex := re.findall(f"{key}=(.*)\n", string):
|
||||
desktop_values[key] = regex[0]
|
||||
|
||||
if "Game" not in keyfile.get_string_list("Desktop Entry", "Categories"):
|
||||
continue
|
||||
if not desktop_values["Name"]:
|
||||
continue
|
||||
|
||||
if (
|
||||
flatpak_id := keyfile.get_string("Desktop Entry", "X-Flatpak")
|
||||
) in blacklist or flatpak_id != entry.stem:
|
||||
continue
|
||||
if not desktop_values["Categories"]:
|
||||
continue
|
||||
|
||||
name = keyfile.get_string("Desktop Entry", "Name")
|
||||
|
||||
except GLib.GError:
|
||||
if not "Game" in desktop_values["Categories"].split(";"):
|
||||
continue
|
||||
|
||||
values = {
|
||||
"source": self.source.source_id,
|
||||
"added": shared.import_time,
|
||||
"name": name,
|
||||
"source": self.source.id,
|
||||
"added": added_time,
|
||||
"name": desktop_values["Name"],
|
||||
"game_id": self.source.game_id_format.format(game_id=flatpak_id),
|
||||
"executable": self.source.make_executable(flatpak_id=flatpak_id),
|
||||
"executable": self.source.executable_format.format(
|
||||
flatpak_id=flatpak_id
|
||||
),
|
||||
}
|
||||
game = Game(values)
|
||||
|
||||
additional_data = {}
|
||||
|
||||
try:
|
||||
if (
|
||||
icon_path := icon_theme.lookup_icon(
|
||||
keyfile.get_string("Desktop Entry", "Icon"),
|
||||
None,
|
||||
512,
|
||||
1,
|
||||
shared.win.get_direction(),
|
||||
0,
|
||||
)
|
||||
.get_file()
|
||||
.get_path()
|
||||
):
|
||||
if icon_name := desktop_values["Icon"]:
|
||||
if icon_path := IconTheme.getIconPath(icon_name, 512):
|
||||
additional_data = {"local_icon_path": Path(icon_path)}
|
||||
else:
|
||||
pass
|
||||
except GLib.GError:
|
||||
pass
|
||||
|
||||
# Produce game
|
||||
yield (game, additional_data)
|
||||
|
||||
|
||||
class FlatpakLocations(NamedTuple):
|
||||
data: Location
|
||||
|
||||
|
||||
class FlatpakSource(ExecutableFormatSource):
|
||||
class FlatpakSource(Source):
|
||||
"""Generic Flatpak source"""
|
||||
|
||||
source_id = "flatpak"
|
||||
name = _("Flatpak")
|
||||
iterable_class = FlatpakSourceIterable
|
||||
name = "Flatpak"
|
||||
iterator_class = FlatpakSourceIterator
|
||||
executable_format = "flatpak run {flatpak_id}"
|
||||
available_on = {"linux"}
|
||||
available_on = set(("linux",))
|
||||
|
||||
locations: FlatpakLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = FlatpakLocations(
|
||||
Location(
|
||||
schema_key="flatpak-location",
|
||||
candidates=(
|
||||
"/var/lib/flatpak/",
|
||||
shared.data_dir / "flatpak",
|
||||
),
|
||||
paths={
|
||||
"applications": LocationSubPath("exports/share/applications", True),
|
||||
"icons": LocationSubPath("exports/share/icons", True),
|
||||
},
|
||||
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||
)
|
||||
)
|
||||
data_location = Location(
|
||||
schema_key="flatpak-location",
|
||||
candidates=(
|
||||
"/var/lib/flatpak/exports/",
|
||||
shared.data_dir / "flatpak" / "exports",
|
||||
),
|
||||
paths={
|
||||
"applications": (True, "share/applications"),
|
||||
"icons": (True, "share/icons"),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -20,46 +20,21 @@
|
||||
|
||||
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 time import time
|
||||
from typing import Optional, TypedDict
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import (
|
||||
SourceIterable,
|
||||
SourceIterationResult,
|
||||
URLExecutableSource,
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
)
|
||||
|
||||
|
||||
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]
|
||||
@@ -69,319 +44,114 @@ class HeroicLibraryEntry(TypedDict):
|
||||
art_square: str
|
||||
|
||||
|
||||
class SubSourceIterable(Iterable):
|
||||
"""Class representing a Heroic sub-source"""
|
||||
|
||||
source: "HeroicSource"
|
||||
source_iterable: "HeroicSourceIterable"
|
||||
name: str
|
||||
class HeroicSubSource(TypedDict):
|
||||
service: str
|
||||
image_uri_params: str = ""
|
||||
relative_library_path: Path
|
||||
library_json_entries_key: str = "library"
|
||||
path: tuple[str]
|
||||
|
||||
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
|
||||
class HeroicSourceIterator(SourceIterator):
|
||||
source: "HeroicSource"
|
||||
|
||||
def process_library_entry(self, entry: HeroicLibraryEntry) -> SourceIterationResult:
|
||||
"""Build a Game from a Heroic library entry"""
|
||||
sub_sources: dict[str, HeroicSubSource] = {
|
||||
"sideload": {
|
||||
"service": "sideload",
|
||||
"path": ("sideload_apps", "library.json"),
|
||||
},
|
||||
"legendary": {
|
||||
"service": "epic",
|
||||
"path": ("store_cache", "legendary_library.json"),
|
||||
},
|
||||
"gog": {
|
||||
"service": "gog",
|
||||
"path": ("store_cache", "gog_library.json"),
|
||||
},
|
||||
}
|
||||
|
||||
app_name = entry["app_name"]
|
||||
runner = entry["runner"]
|
||||
def game_from_library_entry(
|
||||
self, entry: HeroicLibraryEntry, added_time: int
|
||||
) -> SourceIterationResult:
|
||||
"""Helper method used to build a Game from a Heroic library entry"""
|
||||
|
||||
# Skip games that are not installed
|
||||
if not entry["is_installed"]:
|
||||
return None
|
||||
|
||||
# Build game
|
||||
app_name = entry["app_name"]
|
||||
runner = entry["runner"]
|
||||
service = self.sub_sources[runner]["service"]
|
||||
values = {
|
||||
"source": f"{self.source.source_id}_{self.service}",
|
||||
"added": shared.import_time,
|
||||
"source": self.source.id,
|
||||
"added": added_time,
|
||||
"name": entry["title"],
|
||||
"developer": entry.get("developer", None),
|
||||
"developer": entry["developer"],
|
||||
"game_id": self.source.game_id_format.format(
|
||||
service=self.service, game_id=app_name
|
||||
service=service, game_id=app_name
|
||||
),
|
||||
"executable": self.source.make_executable(runner=runner, app_name=app_name),
|
||||
"hidden": self.source_iterable.is_hidden(app_name),
|
||||
"executable": self.source.executable_format.format(app_name=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
|
||||
# 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"]
|
||||
if service == "epic":
|
||||
uri += "?h=400&resize=1&w=300"
|
||||
digest = sha256(uri.encode()).hexdigest()
|
||||
image_path = self.source.locations.config.root / "images-cache" / digest
|
||||
image_path = self.source.config_location.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.home / ".config"
|
||||
|
||||
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):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""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)
|
||||
for sub_source in self.sub_sources.values():
|
||||
# Skip disabled sub-sources
|
||||
if not shared.schema.get_boolean("heroic-import-" + sub_source["service"]):
|
||||
continue
|
||||
# Load games from JSON
|
||||
file = self.source.config_location.root.joinpath(*sub_source["path"])
|
||||
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,
|
||||
)
|
||||
library = json.load(file.open())["library"]
|
||||
except (JSONDecodeError, OSError, KeyError):
|
||||
# Invalid library.json file, skip it
|
||||
logging.warning("Couldn't open Heroic file: %s", str(file))
|
||||
continue
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
class HeroicLocations(NamedTuple):
|
||||
config: Location
|
||||
for entry in library:
|
||||
try:
|
||||
result = self.game_from_library_entry(entry, added_time)
|
||||
except KeyError:
|
||||
# Skip invalid games
|
||||
logging.warning("Invalid Heroic game skipped in %s", str(file))
|
||||
continue
|
||||
yield result
|
||||
|
||||
|
||||
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"}
|
||||
name = "Heroic"
|
||||
iterator_class = HeroicSourceIterator
|
||||
url_format = "heroic://launch/{app_name}"
|
||||
available_on = set(("linux", "win32"))
|
||||
|
||||
locations: HeroicLocations
|
||||
config_location = Location(
|
||||
schema_key="heroic-location",
|
||||
candidates=(
|
||||
"~/.var/app/com.heroicgameslauncher.hgl/config/heroic/",
|
||||
shared.config_dir / "heroic",
|
||||
shared.appdata_dir / "heroic",
|
||||
),
|
||||
paths={
|
||||
"config.json": (False, "config.json"),
|
||||
},
|
||||
)
|
||||
|
||||
@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.home / ".config" / "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,
|
||||
)
|
||||
)
|
||||
return self.name.lower() + "_{service}_{game_id}"
|
||||
|
||||
@@ -20,19 +20,23 @@
|
||||
|
||||
from shutil import rmtree
|
||||
from sqlite3 import connect
|
||||
from typing import NamedTuple
|
||||
from time import time
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import SourceIterable, URLExecutableSource
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import (
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
URLExecutableSource,
|
||||
)
|
||||
from src.utils.sqlite import copy_db
|
||||
|
||||
|
||||
class ItchSourceIterable(SourceIterable):
|
||||
class ItchSourceIterator(SourceIterator):
|
||||
source: "ItchSource"
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""Generator method producing games"""
|
||||
|
||||
# Query the database
|
||||
@@ -51,18 +55,20 @@ class ItchSourceIterable(SourceIterable):
|
||||
caves.game_id = games.id
|
||||
;
|
||||
"""
|
||||
db_path = copy_db(self.source.locations.config["butler.db"])
|
||||
db_path = copy_db(self.source.config_location["butler.db"])
|
||||
connection = connect(db_path)
|
||||
cursor = connection.execute(db_request)
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
# Create games from the db results
|
||||
for row in cursor:
|
||||
values = {
|
||||
"added": shared.import_time,
|
||||
"source": self.source.source_id,
|
||||
"added": added_time,
|
||||
"source": self.source.id,
|
||||
"name": row[1],
|
||||
"game_id": self.source.game_id_format.format(game_id=row[0]),
|
||||
"executable": self.source.make_executable(cave_id=row[4]),
|
||||
"executable": self.source.executable_format.format(cave_id=row[4]),
|
||||
}
|
||||
additional_data = {"online_cover_url": row[3] or row[2]}
|
||||
game = Game(values)
|
||||
@@ -72,33 +78,18 @@ class ItchSourceIterable(SourceIterable):
|
||||
rmtree(str(db_path.parent))
|
||||
|
||||
|
||||
class ItchLocations(NamedTuple):
|
||||
config: Location
|
||||
|
||||
|
||||
class ItchSource(URLExecutableSource):
|
||||
source_id = "itch"
|
||||
name = _("itch")
|
||||
iterable_class = ItchSourceIterable
|
||||
name = "Itch"
|
||||
iterator_class = ItchSourceIterator
|
||||
url_format = "itch://caves/{cave_id}/launch"
|
||||
available_on = {"linux", "win32"}
|
||||
available_on = set(("linux", "win32"))
|
||||
|
||||
locations: ItchLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = ItchLocations(
|
||||
Location(
|
||||
schema_key="itch-location",
|
||||
candidates=(
|
||||
shared.flatpak_dir / "io.itch.itch" / "config" / "itch",
|
||||
shared.config_dir / "itch",
|
||||
shared.home / ".config" / "itch",
|
||||
shared.appdata_dir / "itch",
|
||||
),
|
||||
paths={
|
||||
"butler.db": LocationSubPath("db/butler.db"),
|
||||
},
|
||||
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||
)
|
||||
)
|
||||
config_location = Location(
|
||||
schema_key="itch-location",
|
||||
candidates=(
|
||||
"~/.var/app/io.itch.itch/config/itch/",
|
||||
shared.config_dir / "itch",
|
||||
shared.appdata_dir / "itch",
|
||||
),
|
||||
paths={"butler.db": (False, "db/butler.db")},
|
||||
)
|
||||
|
||||
@@ -20,22 +20,21 @@
|
||||
import json
|
||||
import logging
|
||||
from json import JSONDecodeError
|
||||
from typing import NamedTuple
|
||||
from time import time
|
||||
from typing import Generator
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import (
|
||||
ExecutableFormatSource,
|
||||
SourceIterable,
|
||||
SourceIterationResult,
|
||||
)
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import Source, SourceIterationResult, SourceIterator
|
||||
|
||||
|
||||
class LegendarySourceIterable(SourceIterable):
|
||||
class LegendarySourceIterator(SourceIterator):
|
||||
source: "LegendarySource"
|
||||
|
||||
def game_from_library_entry(self, entry: dict) -> SourceIterationResult:
|
||||
def game_from_library_entry(
|
||||
self, entry: dict, added_time: int
|
||||
) -> SourceIterationResult:
|
||||
# Skip non-games
|
||||
if entry["is_dlc"]:
|
||||
return None
|
||||
@@ -43,16 +42,16 @@ class LegendarySourceIterable(SourceIterable):
|
||||
# Build game
|
||||
app_name = entry["app_name"]
|
||||
values = {
|
||||
"added": shared.import_time,
|
||||
"source": self.source.source_id,
|
||||
"added": added_time,
|
||||
"source": self.source.id,
|
||||
"name": entry["title"],
|
||||
"game_id": self.source.game_id_format.format(game_id=app_name),
|
||||
"executable": self.source.make_executable(app_name=app_name),
|
||||
"executable": self.source.executable_format.format(app_name=app_name),
|
||||
}
|
||||
data = {}
|
||||
|
||||
# Get additional metadata from file (optional)
|
||||
metadata_file = self.source.locations.config["metadata"] / f"{app_name}.json"
|
||||
metadata_file = self.source.data_location["metadata"] / f"{app_name}.json"
|
||||
try:
|
||||
metadata = json.load(metadata_file.open())
|
||||
values["developer"] = metadata["metadata"]["developer"]
|
||||
@@ -66,19 +65,21 @@ class LegendarySourceIterable(SourceIterable):
|
||||
game = Game(values)
|
||||
return (game, data)
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> Generator[SourceIterationResult, None, None]:
|
||||
# Open library
|
||||
file = self.source.locations.config["installed.json"]
|
||||
file = self.source.data_location["installed.json"]
|
||||
try:
|
||||
library: dict = json.load(file.open())
|
||||
except (JSONDecodeError, OSError):
|
||||
logging.warning("Couldn't open Legendary file: %s", str(file))
|
||||
return
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
# Generate games from library
|
||||
for entry in library.values():
|
||||
try:
|
||||
result = self.game_from_library_entry(entry)
|
||||
result = self.game_from_library_entry(entry, added_time)
|
||||
except KeyError as error:
|
||||
# Skip invalid games
|
||||
logging.warning(
|
||||
@@ -88,32 +89,17 @@ class LegendarySourceIterable(SourceIterable):
|
||||
yield result
|
||||
|
||||
|
||||
class LegendaryLocations(NamedTuple):
|
||||
config: Location
|
||||
|
||||
|
||||
class LegendarySource(ExecutableFormatSource):
|
||||
source_id = "legendary"
|
||||
name = _("Legendary")
|
||||
class LegendarySource(Source):
|
||||
name = "Legendary"
|
||||
executable_format = "legendary launch {app_name}"
|
||||
available_on = {"linux"}
|
||||
iterable_class = LegendarySourceIterable
|
||||
available_on = set(("linux", "win32"))
|
||||
|
||||
locations: LegendaryLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = LegendaryLocations(
|
||||
Location(
|
||||
schema_key="legendary-location",
|
||||
candidates=(
|
||||
shared.config_dir / "legendary",
|
||||
shared.home / ".config" / "legendary",
|
||||
),
|
||||
paths={
|
||||
"installed.json": LocationSubPath("installed.json"),
|
||||
"metadata": LocationSubPath("metadata", True),
|
||||
},
|
||||
invalid_subtitle=Location.CONFIG_INVALID_SUBTITLE,
|
||||
)
|
||||
)
|
||||
iterator_class = LegendarySourceIterator
|
||||
data_location: Location = Location(
|
||||
schema_key="legendary-location",
|
||||
candidates=(shared.config_dir / "legendary",),
|
||||
paths={
|
||||
"installed.json": (False, "installed.json"),
|
||||
"metadata": (True, "metadata"),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
import logging
|
||||
from os import PathLike
|
||||
from pathlib import Path
|
||||
from typing import Iterable, Mapping, NamedTuple, Optional
|
||||
from typing import Callable, Mapping, Iterable
|
||||
from os import PathLike
|
||||
|
||||
from src import shared
|
||||
|
||||
PathSegment = str | PathLike | Path
|
||||
PathSegments = Iterable[PathSegment]
|
||||
Candidate = PathSegments
|
||||
|
||||
|
||||
class LocationSubPath(NamedTuple):
|
||||
segment: PathSegment
|
||||
is_directory: bool = False
|
||||
Candidate = PathSegments | Callable[[], PathSegments]
|
||||
|
||||
|
||||
class UnresolvableLocationError(Exception):
|
||||
@@ -29,48 +24,37 @@ class Location:
|
||||
* 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
|
||||
candidates: Iterable[Candidate]
|
||||
paths: Mapping[str, LocationSubPath]
|
||||
invalid_subtitle: str
|
||||
|
||||
root: Optional[Path] = None
|
||||
paths: Mapping[str, tuple[bool, PathSegments]]
|
||||
root: Path = None
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
schema_key: str,
|
||||
candidates: Iterable[Candidate],
|
||||
paths: Mapping[str, LocationSubPath],
|
||||
invalid_subtitle: str,
|
||||
paths: Mapping[str, tuple[bool, PathSegments]],
|
||||
) -> None:
|
||||
super().__init__()
|
||||
self.schema_key = schema_key
|
||||
self.candidates = candidates
|
||||
self.paths = paths
|
||||
self.invalid_subtitle = invalid_subtitle
|
||||
|
||||
def check_candidate(self, candidate: Path) -> bool:
|
||||
"""Check if a candidate root has the necessary files and directories"""
|
||||
for segment, is_directory in self.paths.values():
|
||||
path = Path(candidate) / segment
|
||||
if is_directory:
|
||||
if not path.is_dir():
|
||||
for type_is_dir, subpath in self.paths.values():
|
||||
subpath = Path(candidate) / Path(subpath)
|
||||
if type_is_dir:
|
||||
if not subpath.is_dir():
|
||||
return False
|
||||
else:
|
||||
if not path.is_file():
|
||||
if not subpath.is_file():
|
||||
return False
|
||||
return True
|
||||
|
||||
def resolve(self) -> None:
|
||||
"""Choose a root path from the candidates for the location.
|
||||
If none fits, raise an UnresolvableLocationError"""
|
||||
If none fits, raise a UnresolvableLocationError"""
|
||||
|
||||
if self.root is not None:
|
||||
return
|
||||
@@ -94,9 +78,7 @@ class Location:
|
||||
shared.schema.set_string(self.schema_key, value)
|
||||
logging.debug("Resolved value for schema key %s: %s", self.schema_key, value)
|
||||
|
||||
def __getitem__(self, key: str) -> Optional[Path]:
|
||||
def __getitem__(self, key: str):
|
||||
"""Get the computed path from its key for the location"""
|
||||
self.resolve()
|
||||
if self.root:
|
||||
return self.root / self.paths[key].segment
|
||||
return None
|
||||
return self.root / self.paths[key][1]
|
||||
|
||||
@@ -19,19 +19,23 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
from shutil import rmtree
|
||||
from sqlite3 import connect
|
||||
from typing import NamedTuple
|
||||
from time import time
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import SourceIterable, URLExecutableSource
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import (
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
URLExecutableSource,
|
||||
)
|
||||
from src.utils.sqlite import copy_db
|
||||
|
||||
|
||||
class LutrisSourceIterable(SourceIterable):
|
||||
class LutrisSourceIterator(SourceIterator):
|
||||
source: "LutrisSource"
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""Generator method producing games"""
|
||||
|
||||
# Query the database
|
||||
@@ -51,82 +55,70 @@ class LutrisSourceIterable(SourceIterable):
|
||||
"import_steam": shared.schema.get_boolean("lutris-import-steam"),
|
||||
"import_flatpak": shared.schema.get_boolean("lutris-import-flatpak"),
|
||||
}
|
||||
db_path = copy_db(self.source.locations.config["pga.db"])
|
||||
db_path = copy_db(self.source.data_location["pga.db"])
|
||||
connection = connect(db_path)
|
||||
cursor = connection.execute(request, params)
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
# Create games from the DB results
|
||||
for row in cursor:
|
||||
# Create game
|
||||
values = {
|
||||
"added": shared.import_time,
|
||||
"added": added_time,
|
||||
"hidden": row[4],
|
||||
"name": row[1],
|
||||
"source": f"{self.source.source_id}_{row[3]}",
|
||||
"source": f"{self.source.id}_{row[3]}",
|
||||
"game_id": self.source.game_id_format.format(
|
||||
runner=row[3], game_id=row[0]
|
||||
game_id=row[2], game_internal_id=row[0]
|
||||
),
|
||||
"executable": self.source.make_executable(game_id=row[0]),
|
||||
"executable": self.source.executable_format.format(game_id=row[2]),
|
||||
}
|
||||
game = Game(values)
|
||||
|
||||
# Get official image path
|
||||
image_path = self.source.locations.cache["coverart"] / f"{row[2]}.jpg"
|
||||
image_path = self.source.cache_location["coverart"] / f"{row[2]}.jpg"
|
||||
additional_data = {"local_image_path": image_path}
|
||||
|
||||
# Produce game
|
||||
yield (game, additional_data)
|
||||
|
||||
# Cleanup
|
||||
rmtree(str(db_path.parent))
|
||||
|
||||
|
||||
class LutrisLocations(NamedTuple):
|
||||
config: Location
|
||||
cache: Location
|
||||
|
||||
|
||||
class LutrisSource(URLExecutableSource):
|
||||
"""Generic Lutris source"""
|
||||
|
||||
source_id = "lutris"
|
||||
name = _("Lutris")
|
||||
iterable_class = LutrisSourceIterable
|
||||
name = "Lutris"
|
||||
iterator_class = LutrisSourceIterator
|
||||
url_format = "lutris:rungameid/{game_id}"
|
||||
available_on = {"linux"}
|
||||
available_on = set(("linux",))
|
||||
|
||||
# FIXME possible bug: config picks ~/.var... and cache picks ~/.local...
|
||||
# FIXME possible bug: location picks ~/.var... and cache_lcoation picks ~/.local...
|
||||
|
||||
locations: LutrisLocations
|
||||
data_location = Location(
|
||||
schema_key="lutris-location",
|
||||
candidates=(
|
||||
"~/.var/app/net.lutris.Lutris/data/lutris/",
|
||||
shared.data_dir / "lutris",
|
||||
),
|
||||
paths={
|
||||
"pga.db": (False, "pga.db"),
|
||||
},
|
||||
)
|
||||
|
||||
cache_location = Location(
|
||||
schema_key="lutris-cache-location",
|
||||
candidates=(
|
||||
"~/.var/app/net.lutris.Lutris/cache/lutris/",
|
||||
shared.cache_dir / "lutris",
|
||||
),
|
||||
paths={
|
||||
"coverart": (True, "coverart"),
|
||||
},
|
||||
)
|
||||
|
||||
@property
|
||||
def game_id_format(self):
|
||||
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.home / ".local" / "share" / "lutris",
|
||||
),
|
||||
paths={
|
||||
"pga.db": LocationSubPath("pga.db"),
|
||||
},
|
||||
invalid_subtitle=Location.DATA_INVALID_SUBTITLE,
|
||||
),
|
||||
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": LocationSubPath("coverart", True),
|
||||
},
|
||||
invalid_subtitle=Location.CACHE_INVALID_SUBTITLE,
|
||||
),
|
||||
)
|
||||
return super().game_id_format + "_{game_internal_id}"
|
||||
|
||||
@@ -1,255 +0,0 @@
|
||||
# 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 src import shared
|
||||
from src.errors.friendly_error import FriendlyError
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import (
|
||||
Location,
|
||||
LocationSubPath,
|
||||
UnresolvableLocationError,
|
||||
)
|
||||
from src.importer.sources.source import Source, SourceIterable
|
||||
from src.importer.sources.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.home / ".config" / "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,26 +19,35 @@
|
||||
|
||||
import sys
|
||||
from abc import abstractmethod
|
||||
from collections.abc import Iterable
|
||||
from typing import Any, Collection, Generator, Optional
|
||||
from collections.abc import Iterable, Iterator
|
||||
from typing import Any, Generator, Optional
|
||||
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location
|
||||
|
||||
# Type of the data returned by iterating on a Source
|
||||
SourceIterationResult = Optional[Game | tuple[Game, tuple[Any]]]
|
||||
SourceIterationResult = None | Game | tuple[Game, tuple[Any]]
|
||||
|
||||
|
||||
class SourceIterable(Iterable):
|
||||
class SourceIterator(Iterator):
|
||||
"""Data producer for a source of games"""
|
||||
|
||||
source: "Source"
|
||||
source: "Source" = None
|
||||
generator: Generator = None
|
||||
|
||||
def __init__(self, source: "Source") -> None:
|
||||
super().__init__()
|
||||
self.source = source
|
||||
self.generator = self.generator_builder()
|
||||
|
||||
def __iter__(self) -> "SourceIterator":
|
||||
return self
|
||||
|
||||
def __next__(self) -> SourceIterationResult:
|
||||
return next(self.generator)
|
||||
|
||||
@abstractmethod
|
||||
def __iter__(self) -> Generator[SourceIterationResult, None, None]:
|
||||
def generator_builder(self) -> Generator[SourceIterationResult, None, None]:
|
||||
"""
|
||||
Method that returns a generator that produces games
|
||||
* Should be implemented as a generator method
|
||||
@@ -51,64 +60,59 @@ class SourceIterable(Iterable):
|
||||
class Source(Iterable):
|
||||
"""Source of games. E.g an installed app with a config file that lists game directories"""
|
||||
|
||||
source_id: str
|
||||
name: str
|
||||
variant: Optional[str] = None
|
||||
variant: str = None
|
||||
available_on: set[str] = set()
|
||||
iterable_class: type[SourceIterable]
|
||||
|
||||
# NOTE: Locations must be set at __init__ time, not in the class definition.
|
||||
# They must not be shared between source instances.
|
||||
locations: Collection[Location]
|
||||
data_location: Optional[Location] = None
|
||||
cache_location: Optional[Location] = None
|
||||
config_location: Optional[Location] = None
|
||||
iterator_class: type[SourceIterator]
|
||||
|
||||
@property
|
||||
def full_name(self) -> str:
|
||||
"""The source's full name"""
|
||||
full_name_ = self.name
|
||||
if self.variant:
|
||||
if self.variant is not None:
|
||||
full_name_ += f" ({self.variant})"
|
||||
return full_name_
|
||||
|
||||
@property
|
||||
def game_id_format(self) -> str:
|
||||
"""The string format used to construct game IDs"""
|
||||
return self.source_id + "_{game_id}"
|
||||
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
|
||||
def is_available(self) -> bool:
|
||||
def game_id_format(self) -> str:
|
||||
"""The string format used to construct game IDs"""
|
||||
return self.id + "_{game_id}"
|
||||
|
||||
@property
|
||||
def is_available(self):
|
||||
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 locations are unresolvable
|
||||
"""
|
||||
for location in self.locations:
|
||||
location.resolve()
|
||||
return iter(self.iterable_class(self))
|
||||
|
||||
|
||||
class ExecutableFormatSource(Source):
|
||||
"""Source class that uses a simple executable format to start games"""
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def executable_format(self) -> str:
|
||||
"""The executable format used to construct game executables"""
|
||||
|
||||
def make_executable(self, *args, **kwargs) -> str:
|
||||
"""Use the executable format to"""
|
||||
return self.executable_format.format(*args, **kwargs)
|
||||
def __iter__(self) -> SourceIterator:
|
||||
"""
|
||||
Get an iterator for the source
|
||||
: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
|
||||
class URLExecutableSource(ExecutableFormatSource):
|
||||
class URLExecutableSource(Source):
|
||||
"""Source class that use custom URLs to start games"""
|
||||
|
||||
url_format: str
|
||||
|
||||
@@ -18,24 +18,28 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import logging
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import Iterable, NamedTuple
|
||||
from time import time
|
||||
from typing import Iterable
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location, LocationSubPath
|
||||
from src.importer.sources.source import SourceIterable, URLExecutableSource
|
||||
from src.importer.sources.source import (
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
URLExecutableSource,
|
||||
)
|
||||
from src.utils.steam import SteamFileHelper, SteamInvalidManifestError
|
||||
from src.importer.sources.location import Location
|
||||
|
||||
|
||||
class SteamSourceIterable(SourceIterable):
|
||||
class SteamSourceIterator(SourceIterator):
|
||||
source: "SteamSource"
|
||||
|
||||
def get_manifest_dirs(self) -> Iterable[Path]:
|
||||
"""Get dirs that contain Steam app manifests"""
|
||||
libraryfolders_path = self.source.locations.data["libraryfolders.vdf"]
|
||||
"""Get dirs that contain steam app manifests"""
|
||||
libraryfolders_path = self.source.data_location["libraryfolders.vdf"]
|
||||
with open(libraryfolders_path, "r", encoding="utf-8") as file:
|
||||
contents = file.read()
|
||||
return [
|
||||
@@ -58,83 +62,69 @@ class SteamSourceIterable(SourceIterable):
|
||||
)
|
||||
return manifests
|
||||
|
||||
def __iter__(self):
|
||||
def generator_builder(self) -> SourceIterationResult:
|
||||
"""Generator method producing games"""
|
||||
appid_cache = set()
|
||||
manifests = self.get_manifests()
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
for manifest in manifests:
|
||||
# Get metadata from manifest
|
||||
steam = SteamFileHelper()
|
||||
try:
|
||||
local_data = steam.get_manifest_data(manifest)
|
||||
except (OSError, SteamInvalidManifestError) as error:
|
||||
logging.debug("Couldn't load appmanifest %s", manifest, exc_info=error)
|
||||
except (OSError, SteamInvalidManifestError):
|
||||
continue
|
||||
|
||||
# Skip non installed games
|
||||
installed_mask = 4
|
||||
if not int(local_data["stateflags"]) & installed_mask:
|
||||
logging.debug("Skipped %s: not installed", manifest)
|
||||
continue
|
||||
|
||||
# Skip duplicate appids
|
||||
appid = local_data["appid"]
|
||||
if appid in appid_cache:
|
||||
logging.debug("Skipped %s: appid already seen during import", manifest)
|
||||
continue
|
||||
appid_cache.add(appid)
|
||||
|
||||
# Build game from local data
|
||||
values = {
|
||||
"added": shared.import_time,
|
||||
"added": added_time,
|
||||
"name": local_data["name"],
|
||||
"source": self.source.source_id,
|
||||
"source": self.source.id,
|
||||
"game_id": self.source.game_id_format.format(game_id=appid),
|
||||
"executable": self.source.make_executable(game_id=appid),
|
||||
"executable": self.source.executable_format.format(game_id=appid),
|
||||
}
|
||||
game = Game(values)
|
||||
|
||||
# Add official cover image
|
||||
image_path = (
|
||||
self.source.locations.data["librarycache"]
|
||||
self.source.data_location["librarycache"]
|
||||
/ f"{appid}_library_600x900.jpg"
|
||||
)
|
||||
additional_data = {"local_image_path": image_path, "steam_appid": appid}
|
||||
|
||||
# Produce game
|
||||
yield (game, additional_data)
|
||||
|
||||
|
||||
class SteamLocations(NamedTuple):
|
||||
data: Location
|
||||
|
||||
|
||||
class SteamSource(URLExecutableSource):
|
||||
source_id = "steam"
|
||||
name = _("Steam")
|
||||
available_on = {"linux", "win32"}
|
||||
iterable_class = SteamSourceIterable
|
||||
name = "Steam"
|
||||
available_on = set(("linux", "win32"))
|
||||
iterator_class = SteamSourceIterator
|
||||
url_format = "steam://rungameid/{game_id}"
|
||||
|
||||
locations: SteamLocations
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.locations = SteamLocations(
|
||||
Location(
|
||||
schema_key="steam-location",
|
||||
candidates=(
|
||||
shared.home / ".steam" / "steam",
|
||||
shared.data_dir / "Steam",
|
||||
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,
|
||||
)
|
||||
)
|
||||
data_location = Location(
|
||||
schema_key="steam-location",
|
||||
candidates=(
|
||||
"~/.var/app/com.valvesoftware.Steam/data/Steam/",
|
||||
shared.data_dir / "Steam",
|
||||
"~/.steam",
|
||||
shared.programfiles32_dir / "Steam",
|
||||
),
|
||||
paths={
|
||||
"libraryfolders.vdf": (False, "steamapps/libraryfolders.vdf"),
|
||||
"librarycache": (True, "appcache/librarycache"),
|
||||
},
|
||||
)
|
||||
|
||||
115
src/importer/sources/yuzu_source.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# lutris_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
|
||||
from time import time
|
||||
from typing import Generator, Iterable
|
||||
from configparser import ConfigParser
|
||||
from pathlib import Path
|
||||
import os
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.location import Location
|
||||
from src.importer.sources.source import (
|
||||
SourceIterationResult,
|
||||
SourceIterator,
|
||||
Source,
|
||||
)
|
||||
|
||||
|
||||
class YuzuSourceIterator(SourceIterator):
|
||||
source: "YuzuSource"
|
||||
|
||||
extensions = (".xci", ".nsp", ".nso", ".nro")
|
||||
|
||||
def iter_game_dirs(self) -> Iterable[tuple[bool, Path]]:
|
||||
"""
|
||||
Get the rom directories from the parsed config
|
||||
|
||||
The returned tuple indicates if the dir should be scanned recursively,
|
||||
then its path.
|
||||
"""
|
||||
|
||||
# Get the config data
|
||||
config = ConfigParser()
|
||||
if not config.read(
|
||||
self.source.data_location["qt-config.ini"], encoding="utf-8"
|
||||
):
|
||||
return
|
||||
|
||||
# Iterate through the dirs
|
||||
n_dirs = config.getint("UI", r"Paths\gamedirs\size", fallback=0)
|
||||
for i in range(1, n_dirs + 1):
|
||||
deep = config.getboolean(
|
||||
"UI", f"Paths\\gamedirs\\{i}\\deep_scan", fallback=False
|
||||
)
|
||||
path = Path(config.get("UI", f"Paths\\gamedirs\\{i}\\path", fallback=None))
|
||||
if path is None:
|
||||
continue
|
||||
yield deep, path
|
||||
|
||||
def iter_rom_files(
|
||||
self, root: Path, recursive: bool = False
|
||||
) -> Generator[Path, None, None]:
|
||||
"""Generator method to iterate through rom files"""
|
||||
if not recursive:
|
||||
for path in root.iterdir():
|
||||
if not path.is_file():
|
||||
continue
|
||||
if not path.suffix in self.extensions:
|
||||
continue
|
||||
yield path
|
||||
else:
|
||||
for dir_path, _dirs, file_names in os.walk(root):
|
||||
for filename in file_names:
|
||||
path = Path(dir_path) / filename
|
||||
if path.suffix in self.extensions:
|
||||
continue
|
||||
yield path
|
||||
|
||||
def generator_builder(self) -> Generator[SourceIterationResult, None, None]:
|
||||
"""Generator method producing games"""
|
||||
|
||||
added_time = int(time())
|
||||
|
||||
# Get the games
|
||||
for recursive_search, game_dir in self.iter_game_dirs():
|
||||
for path in self.iter_rom_files(game_dir, recursive_search):
|
||||
values = {
|
||||
# TODO add game_id
|
||||
"added": added_time,
|
||||
"source": self.source.id,
|
||||
"executable": f"yuzu {str(path)}", # HACK change depending on the variant
|
||||
}
|
||||
game = Game(values)
|
||||
additional_data = {}
|
||||
yield game, additional_data
|
||||
|
||||
|
||||
class YuzuSource(Source):
|
||||
config_location = Location(
|
||||
"yuzu-location",
|
||||
(
|
||||
"~/.var/app/org.yuzu_emu.yuzu/config/yuzu",
|
||||
shared.config_dir / "yuzu",
|
||||
"~/.config/yuzu",
|
||||
# TODO windows path
|
||||
),
|
||||
{"qt-config.ini": (False, "qt-config.ini")},
|
||||
)
|
||||
@@ -29,7 +29,7 @@ class ColorLogFormatter(Formatter):
|
||||
RED = "\033[31m"
|
||||
YELLOW = "\033[33m"
|
||||
|
||||
def format(self, record: LogRecord) -> str:
|
||||
def format(self, record: LogRecord):
|
||||
super_format = super().format(record)
|
||||
match record.levelname:
|
||||
case "CRITICAL":
|
||||
|
||||
@@ -18,12 +18,11 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import lzma
|
||||
from io import TextIOWrapper
|
||||
from io import StringIO
|
||||
from logging import StreamHandler
|
||||
from lzma import FORMAT_XZ, PRESET_DEFAULT
|
||||
from os import PathLike
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from src import shared
|
||||
|
||||
@@ -38,7 +37,7 @@ class SessionFileHandler(StreamHandler):
|
||||
|
||||
backup_count: int
|
||||
filename: Path
|
||||
log_file: Optional[TextIOWrapper] = None
|
||||
log_file: StringIO = None
|
||||
|
||||
def create_dir(self) -> None:
|
||||
"""Create the log dir if needed"""
|
||||
@@ -84,31 +83,21 @@ class SessionFileHandler(StreamHandler):
|
||||
logfiles.sort(key=self.file_sort_key, reverse=True)
|
||||
return logfiles
|
||||
|
||||
def rotate_file(self, path: Path) -> None:
|
||||
def rotate_file(self, path: Path):
|
||||
"""Rotate a file's number suffix and remove it if it's too old"""
|
||||
|
||||
# If uncompressed, compress
|
||||
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")
|
||||
with lzma.open(
|
||||
compressed_path,
|
||||
"wt",
|
||||
format=FORMAT_XZ,
|
||||
preset=PRESET_DEFAULT,
|
||||
encoding="utf-8",
|
||||
) as lzma_file:
|
||||
lzma_file.write(original_data)
|
||||
new_path = path.with_suffix(path.suffix + ".xz")
|
||||
with (
|
||||
lzma.open(
|
||||
new_path, "wt", format=FORMAT_XZ, preset=PRESET_DEFAULT
|
||||
) as lzma_file,
|
||||
open(path, "r", encoding="utf-8") as original_file,
|
||||
):
|
||||
lzma_file.write(original_file.read())
|
||||
path.unlink()
|
||||
path = compressed_path
|
||||
path = new_path
|
||||
|
||||
# Rename with new number suffix
|
||||
new_number = self.get_path_number(path) + 1
|
||||
@@ -135,6 +124,5 @@ class SessionFileHandler(StreamHandler):
|
||||
super().__init__(self.log_file)
|
||||
|
||||
def close(self) -> None:
|
||||
if self.log_file:
|
||||
self.log_file.close()
|
||||
self.log_file.close()
|
||||
super().close()
|
||||
|
||||
@@ -27,7 +27,7 @@ import sys
|
||||
from src import shared
|
||||
|
||||
|
||||
def setup_logging() -> None:
|
||||
def setup_logging():
|
||||
"""Intitate the app's logging"""
|
||||
|
||||
is_dev = shared.PROFILE == "development"
|
||||
@@ -73,7 +73,7 @@ def setup_logging() -> None:
|
||||
"PIL": {
|
||||
"handlers": ["lib_console_handler", "file_handler"],
|
||||
"propagate": False,
|
||||
"level": "WARNING",
|
||||
"level": "NOTSET",
|
||||
},
|
||||
"urllib3": {
|
||||
"handlers": ["lib_console_handler", "file_handler"],
|
||||
@@ -89,7 +89,7 @@ def setup_logging() -> None:
|
||||
logging_dot_config.dictConfig(config)
|
||||
|
||||
|
||||
def log_system_info() -> None:
|
||||
def log_system_info():
|
||||
"""Log system debug information"""
|
||||
|
||||
logging.debug("Starting %s v%s (%s)", shared.APP_ID, shared.VERSION, shared.PROFILE)
|
||||
|
||||
110
src/main.py
@@ -19,11 +19,7 @@
|
||||
|
||||
import json
|
||||
import lzma
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import Any, Optional
|
||||
|
||||
import gi
|
||||
|
||||
@@ -38,44 +34,36 @@ from src.details_window import DetailsWindow
|
||||
from src.game import Game
|
||||
from src.importer.importer import Importer
|
||||
from src.importer.sources.bottles_source import BottlesSource
|
||||
from src.importer.sources.desktop_source import DesktopSource
|
||||
from src.importer.sources.flatpak_source import FlatpakSource
|
||||
from src.importer.sources.heroic_source import HeroicSource
|
||||
from src.importer.sources.itch_source import ItchSource
|
||||
from src.importer.sources.legendary_source import LegendarySource
|
||||
from src.importer.sources.lutris_source import LutrisSource
|
||||
from src.importer.sources.retroarch_source import RetroarchSource
|
||||
from src.importer.sources.steam_source import SteamSource
|
||||
from src.logging.setup import log_system_info, setup_logging
|
||||
from src.preferences import PreferencesWindow
|
||||
from src.store.managers.cover_manager import CoverManager
|
||||
from src.store.managers.display_manager import DisplayManager
|
||||
from src.store.managers.file_manager import FileManager
|
||||
from src.store.managers.local_cover_manager import LocalCoverManager
|
||||
from src.store.managers.online_cover_manager import OnlineCoverManager
|
||||
from src.store.managers.sgdb_manager import SGDBManager
|
||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
||||
from src.store.store import Store
|
||||
from src.utils.migrate_files_v1_to_v2 import migrate_files_v1_to_v2
|
||||
from src.window import CartridgesWindow
|
||||
|
||||
|
||||
class CartridgesApplication(Adw.Application):
|
||||
win: CartridgesWindow
|
||||
win = None
|
||||
|
||||
def __init__(self) -> None:
|
||||
def __init__(self):
|
||||
shared.store = Store()
|
||||
super().__init__(
|
||||
application_id=shared.APP_ID, flags=Gio.ApplicationFlags.FLAGS_NONE
|
||||
)
|
||||
|
||||
def do_activate(self) -> None: # pylint: disable=arguments-differ
|
||||
def do_activate(self): # pylint: disable=arguments-differ
|
||||
"""Called on app creation"""
|
||||
|
||||
setup_logging()
|
||||
log_system_info()
|
||||
|
||||
if os.name == "nt":
|
||||
migrate_files_v1_to_v2()
|
||||
|
||||
# Set fallback icon-name
|
||||
Gtk.Window.set_default_icon_name(shared.APP_ID)
|
||||
|
||||
@@ -101,10 +89,11 @@ class CartridgesApplication(Adw.Application):
|
||||
self.load_games_from_disk()
|
||||
|
||||
# Add rest of the managers for game imports
|
||||
shared.store.add_manager(CoverManager())
|
||||
shared.store.add_manager(LocalCoverManager())
|
||||
shared.store.add_manager(SteamAPIManager())
|
||||
shared.store.add_manager(OnlineCoverManager())
|
||||
shared.store.add_manager(SGDBManager())
|
||||
shared.store.toggle_manager_in_pipelines(FileManager, True)
|
||||
shared.store.enable_manager_in_pipelines(FileManager)
|
||||
|
||||
# Create actions
|
||||
self.create_actions(
|
||||
@@ -145,22 +134,19 @@ class CartridgesApplication(Adw.Application):
|
||||
|
||||
self.win.present()
|
||||
|
||||
def load_games_from_disk(self) -> None:
|
||||
def load_games_from_disk(self):
|
||||
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
|
||||
data = json.load(game_file.open())
|
||||
game = Game(data)
|
||||
shared.store.add_game(game, {"skip_save": True})
|
||||
|
||||
def on_about_action(self, *_args: Any) -> None:
|
||||
def on_about_action(self, *_args):
|
||||
# Get the debug info from the log files
|
||||
debug_str = ""
|
||||
for index, path in enumerate(shared.log_files):
|
||||
for i, path in enumerate(shared.log_files):
|
||||
# Add a horizontal line between runs
|
||||
if index > 0:
|
||||
if i > 0:
|
||||
debug_str += "─" * 37 + "\n"
|
||||
# Add the run's logs
|
||||
log_file = (
|
||||
@@ -180,10 +166,9 @@ class CartridgesApplication(Adw.Application):
|
||||
developers=[
|
||||
"kramo https://kramo.hu",
|
||||
"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",
|
||||
"Paweł Lidwin https://github.com/imLinguin",
|
||||
"Rafael Mardojai CM https://mardojai.com",
|
||||
],
|
||||
designers=("kramo https://kramo.hu",),
|
||||
@@ -194,17 +179,12 @@ class CartridgesApplication(Adw.Application):
|
||||
# Translators: Replace this with your name for it to show up in the about window
|
||||
translator_credits=_("translator_credits"),
|
||||
debug_info=debug_str,
|
||||
debug_info_filename="cartridges.log",
|
||||
)
|
||||
about.present()
|
||||
|
||||
def on_preferences_action(
|
||||
self,
|
||||
_action: Any = None,
|
||||
_parameter: Any = None,
|
||||
page_name: Optional[str] = None,
|
||||
expander_row: Optional[str] = None,
|
||||
) -> CartridgesWindow:
|
||||
self, _action=None, _parameter=None, page_name=None, expander_row=None
|
||||
):
|
||||
win = PreferencesWindow()
|
||||
if page_name:
|
||||
win.set_visible_page_name(page_name)
|
||||
@@ -214,79 +194,73 @@ class CartridgesApplication(Adw.Application):
|
||||
|
||||
return win
|
||||
|
||||
def on_launch_game_action(self, *_args: Any) -> None:
|
||||
def on_launch_game_action(self, *_args):
|
||||
self.win.active_game.launch()
|
||||
|
||||
def on_hide_game_action(self, *_args: Any) -> None:
|
||||
def on_hide_game_action(self, *_args):
|
||||
self.win.active_game.toggle_hidden()
|
||||
|
||||
def on_edit_game_action(self, *_args: Any) -> None:
|
||||
def on_edit_game_action(self, *_args):
|
||||
DetailsWindow(self.win.active_game)
|
||||
|
||||
def on_add_game_action(self, *_args: Any) -> None:
|
||||
def on_add_game_action(self, *_args):
|
||||
DetailsWindow()
|
||||
|
||||
def on_import_action(self, *_args: Any) -> None:
|
||||
shared.importer = Importer()
|
||||
def on_import_action(self, *_args):
|
||||
importer = Importer()
|
||||
|
||||
if shared.schema.get_boolean("lutris"):
|
||||
shared.importer.add_source(LutrisSource())
|
||||
importer.add_source(LutrisSource())
|
||||
|
||||
if shared.schema.get_boolean("steam"):
|
||||
shared.importer.add_source(SteamSource())
|
||||
importer.add_source(SteamSource())
|
||||
|
||||
if shared.schema.get_boolean("heroic"):
|
||||
shared.importer.add_source(HeroicSource())
|
||||
importer.add_source(HeroicSource())
|
||||
|
||||
if shared.schema.get_boolean("bottles"):
|
||||
shared.importer.add_source(BottlesSource())
|
||||
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())
|
||||
importer.add_source(FlatpakSource())
|
||||
|
||||
if shared.schema.get_boolean("itch"):
|
||||
shared.importer.add_source(ItchSource())
|
||||
importer.add_source(ItchSource())
|
||||
|
||||
if shared.schema.get_boolean("legendary"):
|
||||
shared.importer.add_source(LegendarySource())
|
||||
importer.add_source(LegendarySource())
|
||||
|
||||
if shared.schema.get_boolean("retroarch"):
|
||||
shared.importer.add_source(RetroarchSource())
|
||||
importer.run()
|
||||
|
||||
shared.importer.run()
|
||||
|
||||
def on_remove_game_action(self, *_args: Any) -> None:
|
||||
def on_remove_game_action(self, *_args):
|
||||
self.win.active_game.remove_game()
|
||||
|
||||
def on_remove_game_details_view_action(self, *_args: Any) -> None:
|
||||
def on_remove_game_details_view_action(self, *_args):
|
||||
if self.win.stack.get_visible_child() == self.win.details_view:
|
||||
self.on_remove_game_action()
|
||||
|
||||
def search(self, uri: str) -> None:
|
||||
def search(self, uri):
|
||||
Gio.AppInfo.launch_default_for_uri(f"{uri}{self.win.active_game.name}")
|
||||
|
||||
def on_igdb_search_action(self, *_args: Any) -> None:
|
||||
def on_igdb_search_action(self, *_args):
|
||||
self.search("https://www.igdb.com/search?type=1&q=")
|
||||
|
||||
def on_sgdb_search_action(self, *_args: Any) -> None:
|
||||
def on_sgdb_search_action(self, *_args):
|
||||
self.search("https://www.steamgriddb.com/search/grids?term=")
|
||||
|
||||
def on_protondb_search_action(self, *_args: Any) -> None:
|
||||
def on_protondb_search_action(self, *_args):
|
||||
self.search("https://www.protondb.com/search?q=")
|
||||
|
||||
def on_lutris_search_action(self, *_args: Any) -> None:
|
||||
def on_lutris_search_action(self, *_args):
|
||||
self.search("https://lutris.net/games?q=")
|
||||
|
||||
def on_hltb_search_action(self, *_args: Any) -> None:
|
||||
def on_hltb_search_action(self, *_args):
|
||||
self.search("https://howlongtobeat.com/?q=")
|
||||
|
||||
def on_quit_action(self, *_args: Any) -> None:
|
||||
def on_quit_action(self, *_args):
|
||||
self.quit()
|
||||
|
||||
def create_actions(self, actions: set) -> None:
|
||||
def create_actions(self, actions):
|
||||
for action in actions:
|
||||
simple_action = Gio.SimpleAction.new(action[0], None)
|
||||
|
||||
@@ -302,7 +276,9 @@ class CartridgesApplication(Adw.Application):
|
||||
scope.add_action(simple_action)
|
||||
|
||||
|
||||
def main(_version: int) -> Any:
|
||||
def main(_version):
|
||||
"""App entry point"""
|
||||
setup_logging()
|
||||
log_system_info()
|
||||
app = CartridgesApplication()
|
||||
return app.run(sys.argv)
|
||||
|
||||
@@ -21,20 +21,16 @@ import logging
|
||||
import re
|
||||
from pathlib import Path
|
||||
from shutil import rmtree
|
||||
from typing import Any, Callable, Optional
|
||||
|
||||
from gi.repository import Adw, Gio, GLib, Gtk
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.importer.sources.bottles_source import BottlesSource
|
||||
from src.importer.sources.flatpak_source import FlatpakSource
|
||||
from src.importer.sources.heroic_source import HeroicSource
|
||||
from src.importer.sources.itch_source import ItchSource
|
||||
from src.importer.sources.legendary_source import LegendarySource
|
||||
from src.importer.sources.location import UnresolvableLocationError
|
||||
from src.importer.sources.lutris_source import LutrisSource
|
||||
from src.importer.sources.retroarch_source import RetroarchSource
|
||||
from src.importer.sources.source import Source
|
||||
from src.importer.sources.steam_source import SteamSource
|
||||
from src.utils.create_dialog import create_dialog
|
||||
@@ -54,8 +50,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
cover_launches_game_switch = Gtk.Template.Child()
|
||||
high_quality_images_switch = Gtk.Template.Child()
|
||||
|
||||
remove_missing_switch = Gtk.Template.Child()
|
||||
|
||||
steam_expander_row = Gtk.Template.Child()
|
||||
steam_data_action_row = Gtk.Template.Child()
|
||||
steam_data_file_chooser_button = Gtk.Template.Child()
|
||||
@@ -73,7 +67,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
heroic_config_file_chooser_button = Gtk.Template.Child()
|
||||
heroic_import_epic_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()
|
||||
|
||||
bottles_expander_row = Gtk.Template.Child()
|
||||
@@ -88,17 +81,11 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
legendary_config_action_row = 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_data_action_row = Gtk.Template.Child()
|
||||
flatpak_data_file_chooser_button = Gtk.Template.Child()
|
||||
flatpak_import_launchers_switch = Gtk.Template.Child()
|
||||
|
||||
desktop_switch = Gtk.Template.Child()
|
||||
|
||||
sgdb_key_group = Gtk.Template.Child()
|
||||
sgdb_key_entry_row = Gtk.Template.Child()
|
||||
sgdb_switch = Gtk.Template.Child()
|
||||
@@ -111,10 +98,9 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
reset_button = Gtk.Template.Child()
|
||||
remove_all_games_button = Gtk.Template.Child()
|
||||
|
||||
removed_games: set[Game] = set()
|
||||
warning_menu_buttons: dict = {}
|
||||
removed_games = set()
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.win = shared.win
|
||||
self.file_chooser = Gtk.FileDialog()
|
||||
@@ -150,18 +136,17 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
ItchSource,
|
||||
LegendarySource,
|
||||
LutrisSource,
|
||||
RetroarchSource,
|
||||
SteamSource,
|
||||
):
|
||||
source = source_class()
|
||||
if not source.is_available:
|
||||
expander_row = getattr(self, f"{source.source_id}_expander_row")
|
||||
expander_row.set_visible(False)
|
||||
expander_row = getattr(self, f"{source.id}_expander_row")
|
||||
expander_row.remove()
|
||||
else:
|
||||
self.init_source_row(source)
|
||||
|
||||
# SteamGridDB
|
||||
def sgdb_key_changed(*_args: Any) -> None:
|
||||
def sgdb_key_changed(*_args):
|
||||
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"))
|
||||
@@ -175,7 +160,7 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
)
|
||||
)
|
||||
|
||||
def set_sgdb_sensitive(widget: Adw.EntryRow) -> None:
|
||||
def set_sgdb_sensitive(widget):
|
||||
if not widget.get_text():
|
||||
shared.schema.set_boolean("sgdb", False)
|
||||
|
||||
@@ -186,29 +171,26 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
|
||||
# Switches
|
||||
self.bind_switches(
|
||||
{
|
||||
(
|
||||
"exit-after-launch",
|
||||
"cover-launches-game",
|
||||
"high-quality-images",
|
||||
"remove-missing",
|
||||
"lutris-import-steam",
|
||||
"lutris-import-flatpak",
|
||||
"heroic-import-epic",
|
||||
"heroic-import-gog",
|
||||
"heroic-import-amazon",
|
||||
"heroic-import-sideload",
|
||||
"flatpak-import-launchers",
|
||||
"sgdb",
|
||||
"sgdb-prefer",
|
||||
"sgdb-animated",
|
||||
"desktop",
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
def get_switch(self, setting: str) -> Any:
|
||||
def get_switch(self, setting):
|
||||
return getattr(self, f'{setting.replace("-", "_")}_switch')
|
||||
|
||||
def bind_switches(self, settings: set[str]) -> None:
|
||||
def bind_switches(self, settings):
|
||||
for setting in settings:
|
||||
shared.schema.bind(
|
||||
setting,
|
||||
@@ -217,12 +199,10 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
Gio.SettingsBindFlags.DEFAULT,
|
||||
)
|
||||
|
||||
def choose_folder(
|
||||
self, _widget: Any, callback: Callable, callback_data: Optional[str] = None
|
||||
) -> None:
|
||||
def choose_folder(self, _widget, callback, callback_data=None):
|
||||
self.file_chooser.select_folder(self.win, None, callback, callback_data)
|
||||
|
||||
def undo_remove_all(self, *_args: Any) -> None:
|
||||
def undo_remove_all(self, *_args):
|
||||
for game in self.removed_games:
|
||||
game.removed = False
|
||||
game.save()
|
||||
@@ -231,10 +211,11 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
self.removed_games = set()
|
||||
self.toast.dismiss()
|
||||
|
||||
def remove_all_games(self, *_args: Any) -> None:
|
||||
for game in shared.store:
|
||||
def remove_all_games(self, *_args):
|
||||
for game in shared.store.games.values():
|
||||
if not game.removed:
|
||||
self.removed_games.add(game)
|
||||
|
||||
game.removed = True
|
||||
game.save()
|
||||
game.update()
|
||||
@@ -244,7 +225,7 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
|
||||
self.add_toast(self.toast)
|
||||
|
||||
def reset_app(self, *_args: Any) -> None:
|
||||
def reset_app(self, *_args):
|
||||
rmtree(shared.data_dir / "cartridges", True)
|
||||
rmtree(shared.config_dir / "cartridges", True)
|
||||
rmtree(shared.cache_dir / "cartridges", True)
|
||||
@@ -262,137 +243,82 @@ class PreferencesWindow(Adw.PreferencesWindow):
|
||||
|
||||
shared.win.get_application().quit()
|
||||
|
||||
def update_source_action_row_paths(self, source: Source) -> None:
|
||||
def update_source_action_row_paths(self, source):
|
||||
"""Set the dir subtitle for a source's action rows"""
|
||||
for location_name, location in source.locations._asdict().items():
|
||||
for location in ("data", "config", "cache"):
|
||||
# Get the action row to subtitle
|
||||
action_row = getattr(
|
||||
self, f"{source.source_id}_{location_name}_action_row", None
|
||||
)
|
||||
action_row = getattr(self, f"{source.id}_{location}_action_row", None)
|
||||
if not action_row:
|
||||
continue
|
||||
path = Path(shared.schema.get_string(location.schema_key)).expanduser()
|
||||
# Remove the path prefix if picked via Flatpak portal
|
||||
|
||||
# Historically "location" meant data or config, so the key stays shared
|
||||
infix = "-cache" if location == "cache" else ""
|
||||
key = f"{source.id}{infix}-location"
|
||||
path = Path(shared.schema.get_string(key)).expanduser()
|
||||
|
||||
# Remove the path if the dir is picked via the Flatpak portal
|
||||
subtitle = re.sub("/run/user/\\d*/doc/.*/", "", str(path))
|
||||
action_row.set_subtitle(subtitle)
|
||||
|
||||
def resolve_locations(self, source: Source) -> None:
|
||||
"""Resolve locations and add a warning if location cannot be found"""
|
||||
|
||||
for location_name, location in source.locations._asdict().items():
|
||||
action_row = getattr(
|
||||
self, f"{source.source_id}_{location_name}_action_row", None
|
||||
)
|
||||
if not action_row:
|
||||
continue
|
||||
|
||||
try:
|
||||
location.resolve()
|
||||
|
||||
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(
|
||||
focusable=True,
|
||||
child=(
|
||||
Gtk.Label(
|
||||
label=format_start + title + format_end + description,
|
||||
use_markup=True,
|
||||
wrap=True,
|
||||
max_width_chars=50,
|
||||
halign=Gtk.Align.CENTER,
|
||||
valign=Gtk.Align.CENTER,
|
||||
justify=Gtk.Justification.CENTER,
|
||||
margin_top=9,
|
||||
margin_bottom=9,
|
||||
margin_start=12,
|
||||
margin_end=12,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
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(
|
||||
icon_name="dialog-warning-symbolic",
|
||||
valign=Gtk.Align.CENTER,
|
||||
popover=popover,
|
||||
tooltip_text=_("Warning"),
|
||||
)
|
||||
menu_button.add_css_class("warning")
|
||||
|
||||
action_row.add_prefix(menu_button)
|
||||
self.warning_menu_buttons[source.source_id] = menu_button
|
||||
|
||||
def init_source_row(self, source: Source) -> None:
|
||||
def init_source_row(self, source: Source):
|
||||
"""Initialize a preference row for a source class"""
|
||||
|
||||
def set_dir(_widget: Any, result: Gio.Task, location_name: str) -> None:
|
||||
def set_dir(_widget, result, location_name):
|
||||
"""Callback called when a dir picker button is clicked"""
|
||||
|
||||
try:
|
||||
path = Path(self.file_chooser.select_folder_finish(result).get_path())
|
||||
except GLib.GError:
|
||||
return
|
||||
|
||||
# Good picked location
|
||||
location = source.locations._asdict()[location_name]
|
||||
location = getattr(source, f"{location_name}_location")
|
||||
if location.check_candidate(path):
|
||||
shared.schema.set_string(location.schema_key, str(path))
|
||||
# Set the schema
|
||||
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)
|
||||
if self.warning_menu_buttons.get(source.source_id):
|
||||
action_row = getattr(
|
||||
self, f"{source.source_id}_{location_name}_action_row", None
|
||||
)
|
||||
action_row.remove( # type: ignore
|
||||
self.warning_menu_buttons[source.source_id]
|
||||
)
|
||||
self.warning_menu_buttons.pop(source.source_id)
|
||||
logging.debug("User-set value for %s is %s", location.schema_key, path)
|
||||
logging.debug("User-set value for schema key %s: %s", key, value)
|
||||
|
||||
# Bad picked location, inform user
|
||||
else:
|
||||
title = _("Invalid Directory")
|
||||
if location_name == "cache":
|
||||
title = "Cache directory not found"
|
||||
subtitle_format = "Select the {} cache directory."
|
||||
else:
|
||||
title = "Installation directory not found"
|
||||
subtitle_format = "Select the {} installation directory."
|
||||
dialog = create_dialog(
|
||||
self,
|
||||
title,
|
||||
location.invalid_subtitle.format(source.name),
|
||||
_(title),
|
||||
_(subtitle_format).format(source.name),
|
||||
"choose_folder",
|
||||
_("Set Location"),
|
||||
)
|
||||
|
||||
def on_response(widget: Any, response: str) -> None:
|
||||
def on_response(widget, response):
|
||||
if response == "choose_folder":
|
||||
self.choose_folder(widget, set_dir, location_name)
|
||||
|
||||
dialog.connect("response", on_response)
|
||||
|
||||
# Bind expander row activation to source being enabled
|
||||
expander_row = getattr(self, f"{source.source_id}_expander_row")
|
||||
expander_row = getattr(self, f"{source.id}_expander_row")
|
||||
shared.schema.bind(
|
||||
source.source_id,
|
||||
source.id,
|
||||
expander_row,
|
||||
"enable-expansion",
|
||||
Gio.SettingsBindFlags.DEFAULT,
|
||||
)
|
||||
|
||||
# Connect dir picker buttons
|
||||
for location_name in source.locations._asdict():
|
||||
button = getattr(
|
||||
self, f"{source.source_id}_{location_name}_file_chooser_button", None
|
||||
)
|
||||
for location in ("data", "config", "cache"):
|
||||
button = getattr(self, f"{source.id}_{location}_file_chooser_button", None)
|
||||
if button is not None:
|
||||
button.connect("clicked", self.choose_folder, set_dir, location_name)
|
||||
button.connect("clicked", self.choose_folder, set_dir, location)
|
||||
|
||||
# Set the source row subtitles
|
||||
self.resolve_locations(source)
|
||||
self.update_source_action_row_paths(source)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from gi.repository import Gdk, Gio, GLib
|
||||
from gi.repository import Gdk, Gio
|
||||
|
||||
APP_ID = "@APP_ID@"
|
||||
VERSION = "@VERSION@"
|
||||
@@ -31,17 +31,26 @@ SPEC_VERSION = 1.5 # The version of the game_id.json spec
|
||||
schema = Gio.Settings.new(APP_ID)
|
||||
state_schema = Gio.Settings.new(APP_ID + ".State")
|
||||
|
||||
home = Path.home()
|
||||
data_dir = Path(GLib.get_user_data_dir())
|
||||
config_dir = Path(GLib.get_user_config_dir())
|
||||
cache_dir = Path(GLib.get_user_cache_dir())
|
||||
flatpak_dir = home / ".var" / "app"
|
||||
data_dir = (
|
||||
Path(os.getenv("XDG_DATA_HOME"))
|
||||
if "XDG_DATA_HOME" in os.environ
|
||||
else Path.home() / ".local" / "share"
|
||||
)
|
||||
config_dir = (
|
||||
Path(os.getenv("XDG_CONFIG_HOME"))
|
||||
if "XDG_CONFIG_HOME" in os.environ
|
||||
else Path.home() / ".config"
|
||||
)
|
||||
cache_dir = (
|
||||
Path(os.getenv("XDG_CACHE_HOME"))
|
||||
if "XDG_CACHE_HOME" in os.environ
|
||||
else Path.home() / ".cache"
|
||||
)
|
||||
|
||||
games_dir = data_dir / "cartridges" / "games"
|
||||
covers_dir = data_dir / "cartridges" / "covers"
|
||||
|
||||
appdata_dir = Path(os.getenv("appdata") or "C:\\Users\\Default\\AppData\\Roaming")
|
||||
local_appdata_dir = Path(os.getenv("csidl_local_appdata") or "C:\\Users\\Default\\AppData\\Local")
|
||||
programfiles32_dir = Path(os.getenv("programfiles(x86)") or "C:\\Program Files (x86)")
|
||||
|
||||
scale_factor = max(
|
||||
@@ -52,6 +61,5 @@ image_size = (200 * scale_factor, 300 * scale_factor)
|
||||
# pylint: disable=invalid-name
|
||||
win = None
|
||||
importer = None
|
||||
import_time = None
|
||||
store = None
|
||||
log_files = None
|
||||
|
||||
@@ -17,12 +17,13 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from typing import Any, Callable
|
||||
from typing import Callable, Any
|
||||
|
||||
from gi.repository import Gio
|
||||
|
||||
from src.game import Game
|
||||
from src.store.managers.manager import Manager
|
||||
from src.utils.task import Task
|
||||
|
||||
|
||||
class AsyncManager(Manager):
|
||||
@@ -48,13 +49,14 @@ class AsyncManager(Manager):
|
||||
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
||||
) -> None:
|
||||
"""Create a task to process the game in a separate thread"""
|
||||
task = Gio.Task.new(None, self.cancellable, self._task_callback, (callback,))
|
||||
task.run_in_thread(lambda *_: self._task_thread_func((game, additional_data)))
|
||||
task = Task.new(None, self.cancellable, self._task_callback, (callback,))
|
||||
task.set_task_data((game, additional_data))
|
||||
task.run_in_thread(self._task_thread_func)
|
||||
|
||||
def _task_thread_func(self, data):
|
||||
def _task_thread_func(self, _task, _source_object, data, _cancellable):
|
||||
"""Task thread entry point"""
|
||||
game, additional_data, *_rest = data
|
||||
self.run(game, additional_data)
|
||||
self.execute_resilient_manager_logic(game, additional_data)
|
||||
|
||||
def _task_callback(self, _source_object, _result, data):
|
||||
"""Method run after the task is done"""
|
||||
|
||||
@@ -1,198 +0,0 @@
|
||||
# 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 src import shared
|
||||
from src.game import Game
|
||||
from src.store.managers.manager import Manager
|
||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
||||
from src.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)
|
||||
),
|
||||
)
|
||||
@@ -30,7 +30,7 @@ class DisplayManager(Manager):
|
||||
run_after = (SteamAPIManager, SGDBManager)
|
||||
signals = {"update-ready"}
|
||||
|
||||
def main(self, game: Game, _additional_data: dict) -> None:
|
||||
def manager_logic(self, game: Game, _additional_data: dict) -> None:
|
||||
if game.get_parent():
|
||||
game.get_parent().get_parent().remove(game)
|
||||
if game.get_parent():
|
||||
|
||||
@@ -31,7 +31,7 @@ class FileManager(AsyncManager):
|
||||
run_after = (SteamAPIManager,)
|
||||
signals = {"save-ready"}
|
||||
|
||||
def main(self, game: Game, additional_data: dict) -> None:
|
||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
||||
if additional_data.get("skip_save"): # Skip saving when loading games from disk
|
||||
return
|
||||
|
||||
|
||||
71
src/store/managers/local_cover_manager.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# 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 gi.repository import GdkPixbuf
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.store.managers.manager import Manager
|
||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
||||
from src.utils.save_cover import resize_cover, save_cover
|
||||
|
||||
|
||||
class LocalCoverManager(Manager):
|
||||
"""Manager in charge of adding the local cover image of the game"""
|
||||
|
||||
run_after = (SteamAPIManager,)
|
||||
|
||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
||||
if image_path := additional_data.get("local_image_path"):
|
||||
if not image_path.is_file():
|
||||
return
|
||||
save_cover(game.game_id, resize_cover(image_path))
|
||||
elif icon_path := additional_data.get("local_icon_path"):
|
||||
cover_width, cover_height = shared.image_size
|
||||
|
||||
dest_width = cover_width * 0.7
|
||||
dest_height = cover_width * 0.7
|
||||
|
||||
dest_x = cover_width * 0.15
|
||||
dest_y = (cover_height - dest_height) / 2
|
||||
|
||||
image = GdkPixbuf.Pixbuf.new_from_file(str(icon_path)).scale_simple(
|
||||
dest_width, dest_height, GdkPixbuf.InterpType.BILINEAR
|
||||
)
|
||||
|
||||
cover = image.scale_simple(
|
||||
1, 2, GdkPixbuf.InterpType.BILINEAR
|
||||
).scale_simple(cover_width, cover_height, GdkPixbuf.InterpType.BILINEAR)
|
||||
|
||||
image.composite(
|
||||
cover,
|
||||
dest_x,
|
||||
dest_y,
|
||||
dest_width,
|
||||
dest_height,
|
||||
dest_x,
|
||||
dest_y,
|
||||
1,
|
||||
1,
|
||||
GdkPixbuf.InterpType.BILINEAR,
|
||||
255,
|
||||
)
|
||||
|
||||
save_cover(game.game_id, resize_cover(pixbuf=cover))
|
||||
@@ -46,11 +46,11 @@ class Manager(ErrorProducer):
|
||||
max_tries: int = 3
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
def name(self):
|
||||
return type(self).__name__
|
||||
|
||||
@abstractmethod
|
||||
def main(self, game: Game, additional_data: dict) -> None:
|
||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
||||
"""
|
||||
Manager specific logic triggered by the run method
|
||||
* Implemented by final child classes
|
||||
@@ -59,13 +59,13 @@ class Manager(ErrorProducer):
|
||||
* May raise other exceptions that will be reported
|
||||
"""
|
||||
|
||||
def run(self, game: Game, additional_data: dict) -> None:
|
||||
def execute_resilient_manager_logic(self, game: Game, additional_data: dict):
|
||||
"""Handle errors (retry, ignore or raise) that occur in the manager logic"""
|
||||
|
||||
# Keep track of the number of tries
|
||||
tries = 1
|
||||
|
||||
def handle_error(error: Exception) -> None:
|
||||
def handle_error(error: Exception):
|
||||
nonlocal tries
|
||||
|
||||
# If FriendlyError, handle its cause instead
|
||||
@@ -83,11 +83,11 @@ class Manager(ErrorProducer):
|
||||
retrying_format = "Retrying %s in %s for %s"
|
||||
unretryable_format = "Unretryable %s in %s for %s"
|
||||
|
||||
if type(error) in self.continue_on:
|
||||
if error in self.continue_on:
|
||||
# Handle skippable errors (skip silently)
|
||||
return
|
||||
|
||||
if type(error) in self.retryable_on:
|
||||
if error in self.retryable_on:
|
||||
if tries > self.max_tries:
|
||||
# Handle being out of retries
|
||||
logging.error(out_of_retries_format, *log_args)
|
||||
@@ -104,9 +104,9 @@ class Manager(ErrorProducer):
|
||||
logging.error(unretryable_format, *log_args, exc_info=error)
|
||||
self.report_error(base_error)
|
||||
|
||||
def try_manager_logic() -> None:
|
||||
def try_manager_logic():
|
||||
try:
|
||||
self.main(game, additional_data)
|
||||
self.manager_logic(game, additional_data)
|
||||
except Exception as error: # pylint: disable=broad-exception-caught
|
||||
handle_error(error)
|
||||
|
||||
@@ -116,5 +116,5 @@ class Manager(ErrorProducer):
|
||||
self, game: Game, additional_data: dict, callback: Callable[["Manager"], Any]
|
||||
) -> None:
|
||||
"""Pass the game through the manager"""
|
||||
self.run(game, additional_data)
|
||||
self.execute_resilient_manager_logic(game, additional_data)
|
||||
callback(self)
|
||||
|
||||
126
src/store/managers/online_cover_manager.py
Normal file
@@ -0,0 +1,126 @@
|
||||
# online_cover_manager.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 pathlib import Path
|
||||
|
||||
import requests
|
||||
from gi.repository import Gio, GdkPixbuf
|
||||
from requests.exceptions import HTTPError, SSLError
|
||||
from PIL import Image
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.store.managers.local_cover_manager import LocalCoverManager
|
||||
from src.store.managers.manager import Manager
|
||||
from src.utils.save_cover import resize_cover, save_cover
|
||||
|
||||
|
||||
class OnlineCoverManager(Manager):
|
||||
"""Manager that downloads game covers from URLs"""
|
||||
|
||||
run_after = (LocalCoverManager,)
|
||||
retryable_on = (HTTPError, SSLError)
|
||||
|
||||
def save_composited_cover(
|
||||
self,
|
||||
game: Game,
|
||||
image_file: Gio.File,
|
||||
original_width: int,
|
||||
original_height: int,
|
||||
target_width: int,
|
||||
target_height: int,
|
||||
) -> None:
|
||||
"""Save the image composited with a background blur to fit the cover size"""
|
||||
|
||||
logging.debug(
|
||||
"Compositing image for %s (%s) %dx%d -> %dx%d",
|
||||
game.name,
|
||||
game.game_id,
|
||||
original_width,
|
||||
original_height,
|
||||
target_width,
|
||||
target_height,
|
||||
)
|
||||
|
||||
# Load game image
|
||||
image = GdkPixbuf.Pixbuf.new_from_stream(image_file.read())
|
||||
|
||||
# Create background blur of the size of the cover
|
||||
cover = image.scale_simple(2, 2, GdkPixbuf.InterpType.BILINEAR).scale_simple(
|
||||
target_width, target_height, GdkPixbuf.InterpType.BILINEAR
|
||||
)
|
||||
|
||||
# Center the image above the blurred background
|
||||
scale = min(target_width / original_width, target_height / original_height)
|
||||
left_padding = (target_width - original_width * scale) / 2
|
||||
top_padding = (target_height - original_height * scale) / 2
|
||||
image.composite(
|
||||
cover,
|
||||
# Top left of overwritten area on the destination
|
||||
left_padding,
|
||||
top_padding,
|
||||
# Size of the overwritten area on the destination
|
||||
original_width * scale,
|
||||
original_height * scale,
|
||||
# Offset
|
||||
left_padding,
|
||||
top_padding,
|
||||
# Scale to apply to the resized image
|
||||
scale,
|
||||
scale,
|
||||
# Compositing stuff
|
||||
GdkPixbuf.InterpType.BILINEAR,
|
||||
255,
|
||||
)
|
||||
|
||||
# Resize and save the cover
|
||||
save_cover(game.game_id, resize_cover(pixbuf=cover))
|
||||
|
||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
||||
# Ensure that we have a cover to download
|
||||
cover_url = additional_data.get("online_cover_url")
|
||||
if not cover_url:
|
||||
return
|
||||
|
||||
# Download cover
|
||||
image_file = Gio.File.new_tmp()[0]
|
||||
image_path = Path(image_file.get_path())
|
||||
with requests.get(cover_url, timeout=5) as cover:
|
||||
cover.raise_for_status()
|
||||
image_path.write_bytes(cover.content)
|
||||
|
||||
# Get image size
|
||||
cover_width, cover_height = shared.image_size
|
||||
with Image.open(image_path) as pil_image:
|
||||
width, height = pil_image.size
|
||||
|
||||
# Composite if the image is shorter and the stretch amount is too high
|
||||
aspect_ratio = width / height
|
||||
target_aspect_ratio = cover_width / cover_height
|
||||
is_taller = aspect_ratio < target_aspect_ratio
|
||||
resized_height = height / width * cover_width
|
||||
stretch = 1 - (resized_height / cover_height)
|
||||
max_stretch = 0.12
|
||||
if is_taller or stretch <= max_stretch:
|
||||
save_cover(game.game_id, resize_cover(image_path))
|
||||
else:
|
||||
self.save_composited_cover(
|
||||
game, image_file, width, height, cover_width, cover_height
|
||||
)
|
||||
@@ -24,18 +24,19 @@ from requests.exceptions import HTTPError, SSLError
|
||||
from src.errors.friendly_error import FriendlyError
|
||||
from src.game import Game
|
||||
from src.store.managers.async_manager import AsyncManager
|
||||
from src.store.managers.cover_manager import CoverManager
|
||||
from src.store.managers.local_cover_manager import LocalCoverManager
|
||||
from src.store.managers.online_cover_manager import OnlineCoverManager
|
||||
from src.store.managers.steam_api_manager import SteamAPIManager
|
||||
from src.utils.steamgriddb import SGDBAuthError, SGDBHelper
|
||||
|
||||
|
||||
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, CoverManager)
|
||||
run_after = (SteamAPIManager, LocalCoverManager, OnlineCoverManager)
|
||||
retryable_on = (HTTPError, SSLError, ConnectionError, JSONDecodeError)
|
||||
|
||||
def main(self, game: Game, _additional_data: dict) -> None:
|
||||
def manager_logic(self, game: Game, _additional_data: dict) -> None:
|
||||
try:
|
||||
sgdb = SGDBHelper()
|
||||
sgdb.conditionaly_update_cover(game)
|
||||
|
||||
@@ -18,13 +18,12 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from requests.exceptions import HTTPError, SSLError
|
||||
from urllib3.exceptions import ConnectionError as Urllib3ConnectionError
|
||||
|
||||
from src.game import Game
|
||||
from src.store.managers.async_manager import AsyncManager
|
||||
from src.utils.steam import (
|
||||
SteamAPIHelper,
|
||||
SteamGameNotFoundError,
|
||||
SteamAPIHelper,
|
||||
SteamNotAGameError,
|
||||
SteamRateLimiter,
|
||||
)
|
||||
@@ -33,7 +32,7 @@ from src.utils.steam import (
|
||||
class SteamAPIManager(AsyncManager):
|
||||
"""Manager in charge of completing a game's data from the Steam API"""
|
||||
|
||||
retryable_on = (HTTPError, SSLError, Urllib3ConnectionError)
|
||||
retryable_on = (HTTPError, SSLError)
|
||||
|
||||
steam_api_helper: SteamAPIHelper = None
|
||||
steam_rate_limiter: SteamRateLimiter = None
|
||||
@@ -43,8 +42,8 @@ class SteamAPIManager(AsyncManager):
|
||||
self.steam_rate_limiter = SteamRateLimiter()
|
||||
self.steam_api_helper = SteamAPIHelper(self.steam_rate_limiter)
|
||||
|
||||
def main(self, game: Game, additional_data: dict) -> None:
|
||||
# Skip non-Steam games
|
||||
def manager_logic(self, game: Game, additional_data: dict) -> None:
|
||||
# Skip non-steam games
|
||||
appid = additional_data.get("steam_appid", None)
|
||||
if appid is None:
|
||||
return
|
||||
|
||||
@@ -83,7 +83,7 @@ class Pipeline(GObject.Object):
|
||||
progress = 1
|
||||
return progress
|
||||
|
||||
def advance(self) -> None:
|
||||
def advance(self):
|
||||
"""Spawn tasks for managers that are able to run for a game"""
|
||||
|
||||
# Separate blocking / async managers
|
||||
@@ -106,5 +106,5 @@ class Pipeline(GObject.Object):
|
||||
self.advance()
|
||||
|
||||
@GObject.Signal(name="advanced")
|
||||
def advanced(self): # type: ignore
|
||||
def advanced(self) -> None:
|
||||
"""Signal emitted when the pipeline has advanced"""
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import logging
|
||||
from typing import Any, Generator, MutableMapping, Optional
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
@@ -32,68 +31,27 @@ class Store:
|
||||
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]
|
||||
games: dict[str, Game]
|
||||
|
||||
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()
|
||||
self.games = {}
|
||||
|
||||
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.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)
|
||||
|
||||
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:
|
||||
def add_manager(self, manager: Manager, in_pipeline=True):
|
||||
"""Add a manager to the store"""
|
||||
manager_type = type(manager)
|
||||
self.managers[manager_type] = manager
|
||||
self.toggle_manager_in_pipelines(manager_type, in_pipeline)
|
||||
if in_pipeline:
|
||||
self.enable_manager_in_pipelines(manager_type)
|
||||
|
||||
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 enable_manager_in_pipelines(self, manager_type: type[Manager]):
|
||||
"""Make a manager run in new pipelines"""
|
||||
self.pipeline_managers.add(self.managers[manager_type])
|
||||
|
||||
def cleanup_game(self, game: Game) -> None:
|
||||
"""Remove a game's files, dismiss any loose toasts"""
|
||||
"""Remove a game's files"""
|
||||
for path in (
|
||||
shared.games_dir / f"{game.game_id}.json",
|
||||
shared.covers_dir / f"{game.game_id}.tiff",
|
||||
@@ -101,17 +59,9 @@ class Store:
|
||||
):
|
||||
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]:
|
||||
self, game: Game, additional_data: dict, run_pipeline=True
|
||||
) -> Pipeline | None:
|
||||
"""Add a game to the app"""
|
||||
|
||||
# Ignore games from a newer spec version
|
||||
@@ -124,11 +74,10 @@ class Store:
|
||||
return None
|
||||
|
||||
# Handle game duplicates
|
||||
stored_game = self.get(game.game_id)
|
||||
stored_game = self.games.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(
|
||||
@@ -137,27 +86,21 @@ class Store:
|
||||
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.source in self.source_games:
|
||||
self.source_games[game.source] = {}
|
||||
self.source_games[game.source][game.game_id] = game
|
||||
game.connect(signal, manager.execute_resilient_manager_logic)
|
||||
|
||||
# Run the pipeline for the game
|
||||
if not run_pipeline:
|
||||
return None
|
||||
pipeline = Pipeline(game, additional_data, self.pipeline_managers)
|
||||
self.games[game.game_id] = game
|
||||
self.pipelines[game.game_id] = pipeline
|
||||
pipeline.advance()
|
||||
return pipeline
|
||||
|
||||
32
src/utils/check_install.py
Normal file
@@ -0,0 +1,32 @@
|
||||
# check_install.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 pathlib import Path
|
||||
|
||||
|
||||
# TODO delegate to the sources
|
||||
def check_install(check, locations, setting=None, subdirs=(Path(),)):
|
||||
for location in locations:
|
||||
for subdir in (Path(),) + subdirs:
|
||||
if (location / subdir / check).exists():
|
||||
if setting:
|
||||
setting[0].set_string(setting[1], str(location / subdir))
|
||||
return location / subdir
|
||||
|
||||
return False
|
||||
@@ -17,18 +17,10 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from gi.repository import Adw, Gtk
|
||||
from gi.repository import Adw
|
||||
|
||||
|
||||
def create_dialog(
|
||||
win: Gtk.Window,
|
||||
heading: str,
|
||||
body: str,
|
||||
extra_option: Optional[str] = None,
|
||||
extra_label: Optional[str] = None,
|
||||
) -> Adw.MessageDialog:
|
||||
def create_dialog(win, heading, body, extra_option=None, extra_label=None):
|
||||
dialog = Adw.MessageDialog.new(win, heading, body)
|
||||
dialog.add_response("dismiss", _("Dismiss"))
|
||||
|
||||
|
||||
@@ -1,128 +0,0 @@
|
||||
# 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 src 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"))
|
||||
except (OSError, json.JSONDecodeError):
|
||||
continue
|
||||
number = int(game_data["game_id"].replace("imported_", ""))
|
||||
imported_game_number = max(number, imported_game_number)
|
||||
imported_execs.add(game_data["executable"])
|
||||
|
||||
# Migrate imported game files
|
||||
for game_path in old_imported_game_paths:
|
||||
try:
|
||||
game_data = json.load(game_path.open("r"))
|
||||
except (OSError, json.JSONDecodeError):
|
||||
continue
|
||||
|
||||
# Don't migrate if there's a game with the same exec
|
||||
if game_data["executable"] in imported_execs:
|
||||
continue
|
||||
|
||||
# Migrate with updated index
|
||||
imported_game_number += 1
|
||||
game_id = f"imported_{imported_game_number}"
|
||||
game_data["game_id"] = game_id
|
||||
destination_game_path = shared.games_dir / f"{game_id}.json"
|
||||
logging.info(
|
||||
"Moving (updated id) %s -> %s", str(game_path), str(destination_game_path)
|
||||
)
|
||||
json.dump(
|
||||
game_data,
|
||||
destination_game_path.open("w"),
|
||||
indent=4,
|
||||
sort_keys=True,
|
||||
)
|
||||
game_path.unlink()
|
||||
migrate_game_covers(game_path)
|
||||
|
||||
# Migrate all other games
|
||||
for game_path in old_other_game_paths:
|
||||
# Do nothing if already in games dir
|
||||
destination_game_path = shared.games_dir / game_path.name
|
||||
if destination_game_path.exists():
|
||||
continue
|
||||
|
||||
# Else, migrate the game
|
||||
logging.info("Moving %s -> %s", str(game_path), str(destination_game_path))
|
||||
game_path.rename(destination_game_path)
|
||||
migrate_game_covers(game_path)
|
||||
|
||||
# Signal that this dir is migrated
|
||||
migrated_file_path.touch()
|
||||
logging.info("Migration done")
|
||||
@@ -17,11 +17,11 @@
|
||||
#
|
||||
# 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 contextlib import AbstractContextManager
|
||||
from threading import BoundedSemaphore, Lock, Thread
|
||||
from time import sleep, time
|
||||
from typing import Any, Sized
|
||||
|
||||
|
||||
class PickHistory(Sized):
|
||||
@@ -30,22 +30,22 @@ class PickHistory(Sized):
|
||||
|
||||
period: int
|
||||
|
||||
timestamps: list[float]
|
||||
timestamps_lock: Lock
|
||||
timestamps: list[int] = None
|
||||
timestamps_lock: Lock = None
|
||||
|
||||
def __init__(self, period: int) -> None:
|
||||
self.period = period
|
||||
self.timestamps = []
|
||||
self.timestamps_lock = Lock()
|
||||
|
||||
def remove_old_entries(self) -> None:
|
||||
def remove_old_entries(self):
|
||||
"""Remove history entries older than the period"""
|
||||
now = time()
|
||||
cutoff = now - self.period
|
||||
with self.timestamps_lock:
|
||||
self.timestamps = [entry for entry in self.timestamps if entry > cutoff]
|
||||
|
||||
def add(self, *new_timestamps: float) -> None:
|
||||
def add(self, *new_timestamps: Optional[int]):
|
||||
"""Add timestamps to the history.
|
||||
If none given, will add the current timestamp"""
|
||||
if len(new_timestamps) == 0:
|
||||
@@ -60,7 +60,7 @@ class PickHistory(Sized):
|
||||
return len(self.timestamps)
|
||||
|
||||
@property
|
||||
def start(self) -> float:
|
||||
def start(self) -> int:
|
||||
"""Get the time at which the history started"""
|
||||
self.remove_old_entries()
|
||||
with self.timestamps_lock:
|
||||
@@ -70,7 +70,7 @@ class PickHistory(Sized):
|
||||
entry = time()
|
||||
return entry
|
||||
|
||||
def copy_timestamps(self) -> list[float]:
|
||||
def copy_timestamps(self) -> str:
|
||||
"""Get a copy of the timestamps history"""
|
||||
self.remove_old_entries()
|
||||
with self.timestamps_lock:
|
||||
@@ -79,55 +79,51 @@ class PickHistory(Sized):
|
||||
|
||||
# pylint: disable=too-many-instance-attributes
|
||||
class RateLimiter(AbstractContextManager):
|
||||
"""
|
||||
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
|
||||
"""
|
||||
"""Rate limiter implementing the token bucket algorithm"""
|
||||
|
||||
# Period in which we have a max amount of tokens
|
||||
refill_period_seconds: int
|
||||
# Number of tokens allowed in this period
|
||||
refill_period_tokens: int
|
||||
# Max number of tokens that can be consumed instantly
|
||||
burst_tokens: int
|
||||
|
||||
pick_history: PickHistory
|
||||
bucket: BoundedSemaphore
|
||||
queue: deque[Lock]
|
||||
queue_lock: Lock
|
||||
pick_history: PickHistory = None
|
||||
bucket: BoundedSemaphore = None
|
||||
queue: deque[Lock] = None
|
||||
queue_lock: Lock = None
|
||||
|
||||
# Protect the number of tokens behind a lock
|
||||
__n_tokens_lock: Lock
|
||||
__n_tokens_lock: Lock = None
|
||||
__n_tokens = 0
|
||||
|
||||
@property
|
||||
def n_tokens(self) -> int:
|
||||
def n_tokens(self):
|
||||
with self.__n_tokens_lock:
|
||||
return self.__n_tokens
|
||||
|
||||
@n_tokens.setter
|
||||
def n_tokens(self, value: int) -> None:
|
||||
def n_tokens(self, value: int):
|
||||
with self.__n_tokens_lock:
|
||||
self.__n_tokens = value
|
||||
|
||||
def _init_pick_history(self) -> None:
|
||||
"""
|
||||
Initialize the tocken pick history
|
||||
(only for use in this class and its children)
|
||||
|
||||
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:
|
||||
def __init__(
|
||||
self,
|
||||
refill_period_seconds: Optional[int] = None,
|
||||
refill_period_tokens: Optional[int] = None,
|
||||
burst_tokens: Optional[int] = None,
|
||||
) -> None:
|
||||
"""Initialize the limiter"""
|
||||
|
||||
self._init_pick_history()
|
||||
# Initialize default values
|
||||
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
|
||||
self.__n_tokens_lock = Lock()
|
||||
@@ -151,8 +147,8 @@ class RateLimiter(AbstractContextManager):
|
||||
"""
|
||||
|
||||
# Compute ideal spacing
|
||||
tokens_left = self.refill_period_tokens - len(self.pick_history) # type: ignore
|
||||
seconds_left = self.pick_history.start + self.refill_period_seconds - time() # type: ignore
|
||||
tokens_left = self.refill_period_tokens - len(self.pick_history)
|
||||
seconds_left = self.pick_history.start + self.refill_period_seconds - time()
|
||||
try:
|
||||
spacing_seconds = seconds_left / tokens_left
|
||||
except ZeroDivisionError:
|
||||
@@ -163,7 +159,7 @@ class RateLimiter(AbstractContextManager):
|
||||
natural_spacing = self.refill_period_seconds / self.refill_period_tokens
|
||||
return max(natural_spacing, spacing_seconds)
|
||||
|
||||
def refill(self) -> None:
|
||||
def refill(self):
|
||||
"""Add a token back in the bucket"""
|
||||
sleep(self.refill_spacing)
|
||||
try:
|
||||
@@ -174,7 +170,7 @@ class RateLimiter(AbstractContextManager):
|
||||
else:
|
||||
self.n_tokens += 1
|
||||
|
||||
def refill_thread_func(self) -> None:
|
||||
def refill_thread_func(self):
|
||||
"""Entry point for the daemon thread that is refilling the bucket"""
|
||||
while True:
|
||||
self.refill()
|
||||
@@ -204,18 +200,18 @@ class RateLimiter(AbstractContextManager):
|
||||
self.queue.appendleft(lock)
|
||||
return lock
|
||||
|
||||
def acquire(self) -> None:
|
||||
def acquire(self):
|
||||
"""Acquires a token from the bucket when it's your turn in queue"""
|
||||
lock = self.add_to_queue()
|
||||
self.update_queue()
|
||||
# Wait until our turn in queue
|
||||
lock.acquire() # pylint: disable=consider-using-with
|
||||
self.pick_history.add() # type: ignore
|
||||
self.pick_history.add()
|
||||
|
||||
# --- Support for use in with statements
|
||||
|
||||
def __enter__(self) -> None:
|
||||
def __enter__(self):
|
||||
self.acquire()
|
||||
|
||||
def __exit__(self, *_args: Any) -> None:
|
||||
def __exit__(self, *_args):
|
||||
pass
|
||||
|
||||
@@ -18,12 +18,11 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from gi.repository import GLib
|
||||
|
||||
|
||||
def relative_date(timestamp: int) -> Any: # pylint: disable=too-many-return-statements
|
||||
def relative_date(timestamp): # pylint: disable=too-many-return-statements
|
||||
days_no = ((today := datetime.today()) - datetime.fromtimestamp(timestamp)).days
|
||||
|
||||
if days_no == 0:
|
||||
|
||||
@@ -20,30 +20,17 @@
|
||||
|
||||
from pathlib import Path
|
||||
from shutil import copyfile
|
||||
from typing import Optional
|
||||
|
||||
from gi.repository import Gdk, GdkPixbuf, Gio, GLib
|
||||
from gi.repository import Gdk, Gio, GLib
|
||||
from PIL import Image, ImageSequence, UnidentifiedImageError
|
||||
|
||||
from src import shared
|
||||
|
||||
|
||||
def convert_cover(
|
||||
cover_path: Optional[Path] = None,
|
||||
pixbuf: Optional[GdkPixbuf.Pixbuf] = None,
|
||||
resize: bool = True,
|
||||
) -> Optional[Path]:
|
||||
def resize_cover(cover_path=None, pixbuf=None):
|
||||
if not cover_path and not pixbuf:
|
||||
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:
|
||||
cover_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
||||
pixbuf.savev(str(cover_path), "tiff", ["compression"], ["1"])
|
||||
@@ -52,8 +39,7 @@ def convert_cover(
|
||||
with Image.open(cover_path) as image:
|
||||
if getattr(image, "is_animated", False):
|
||||
frames = tuple(
|
||||
frame.resize((200, 300)) if resize else frame
|
||||
for frame in ImageSequence.Iterator(image)
|
||||
frame.resize((200, 300)) for frame in ImageSequence.Iterator(image)
|
||||
)
|
||||
|
||||
tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())
|
||||
@@ -61,7 +47,6 @@ def convert_cover(
|
||||
tmp_path,
|
||||
save_all=True,
|
||||
append_images=frames[1:],
|
||||
disposal=2,
|
||||
)
|
||||
|
||||
else:
|
||||
@@ -71,7 +56,7 @@ def convert_cover(
|
||||
image = image.convert("RGBA")
|
||||
|
||||
tmp_path = Path(Gio.File.new_tmp("XXXXXX.tiff")[0].get_path())
|
||||
(image.resize(shared.image_size) if resize else image).save(
|
||||
image.resize(shared.image_size).save(
|
||||
tmp_path,
|
||||
compression="tiff_adobe_deflate"
|
||||
if shared.schema.get_boolean("high-quality-images")
|
||||
@@ -82,14 +67,14 @@ def convert_cover(
|
||||
Gdk.Texture.new_from_filename(str(cover_path)).save_to_tiff(
|
||||
tmp_path := Gio.File.new_tmp("XXXXXX.tiff")[0].get_path()
|
||||
)
|
||||
return convert_cover(tmp_path)
|
||||
return resize_cover(tmp_path)
|
||||
except GLib.GError:
|
||||
return None
|
||||
|
||||
return tmp_path
|
||||
|
||||
|
||||
def save_cover(game_id: str, cover_path: Path) -> None:
|
||||
def save_cover(game_id, cover_path):
|
||||
shared.covers_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
animated_path = shared.covers_dir / f"{game_id}.gif"
|
||||
|
||||
@@ -21,14 +21,13 @@
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import TypedDict
|
||||
|
||||
import requests
|
||||
from requests.exceptions import HTTPError
|
||||
|
||||
from src import shared
|
||||
from src.utils.rate_limiter import RateLimiter
|
||||
from src.utils.rate_limiter import PickHistory, RateLimiter
|
||||
|
||||
|
||||
class SteamError(Exception):
|
||||
@@ -58,7 +57,7 @@ class SteamManifestData(TypedDict):
|
||||
class SteamAPIData(TypedDict):
|
||||
"""Dict returned by SteamAPIHelper.get_api_data"""
|
||||
|
||||
developer: str
|
||||
developers: str
|
||||
|
||||
|
||||
class SteamRateLimiter(RateLimiter):
|
||||
@@ -72,18 +71,16 @@ class SteamRateLimiter(RateLimiter):
|
||||
refill_period_tokens = 200
|
||||
burst_tokens = 100
|
||||
|
||||
def _init_pick_history(self) -> None:
|
||||
"""
|
||||
Load the pick history from schema.
|
||||
|
||||
Allows remembering API limits through restarts of Cartridges.
|
||||
"""
|
||||
super()._init_pick_history()
|
||||
def __init__(self) -> None:
|
||||
# Load pick history from schema
|
||||
# (Remember API limits through restarts of Cartridges)
|
||||
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.remove_old_entries()
|
||||
super().__init__()
|
||||
|
||||
def acquire(self) -> None:
|
||||
def acquire(self):
|
||||
"""Get a token from the bucket and store the pick history in the schema"""
|
||||
super().acquire()
|
||||
timestamps_str = json.dumps(self.pick_history.copy_timestamps())
|
||||
@@ -91,9 +88,9 @@ class SteamRateLimiter(RateLimiter):
|
||||
|
||||
|
||||
class SteamFileHelper:
|
||||
"""Helper for Steam file formats"""
|
||||
"""Helper for steam file formats"""
|
||||
|
||||
def get_manifest_data(self, manifest_path: Path) -> SteamManifestData:
|
||||
def get_manifest_data(self, manifest_path) -> SteamManifestData:
|
||||
"""Get local data for a game from its manifest"""
|
||||
|
||||
with open(manifest_path, "r", encoding="utf-8") as file:
|
||||
@@ -107,11 +104,7 @@ class SteamFileHelper:
|
||||
raise SteamInvalidManifestError()
|
||||
data[key] = match.group(1)
|
||||
|
||||
return SteamManifestData(
|
||||
name=data["name"],
|
||||
appid=data["appid"],
|
||||
stateflags=data["stateflags"],
|
||||
)
|
||||
return SteamManifestData(**data)
|
||||
|
||||
|
||||
class SteamAPIHelper:
|
||||
@@ -123,7 +116,7 @@ class SteamAPIHelper:
|
||||
def __init__(self, rate_limiter: RateLimiter) -> None:
|
||||
self.rate_limiter = rate_limiter
|
||||
|
||||
def get_api_data(self, appid: str) -> SteamAPIData:
|
||||
def get_api_data(self, appid) -> SteamAPIData:
|
||||
"""
|
||||
Get online data for a game from its appid.
|
||||
May block to satisfy the Steam web API limitations.
|
||||
@@ -149,10 +142,11 @@ class SteamAPIHelper:
|
||||
raise SteamGameNotFoundError()
|
||||
|
||||
# Handle appid is not a game
|
||||
if data["data"]["type"] not in {"game", "demo", "mod"}:
|
||||
game_types = ("game", "demo")
|
||||
if data["data"]["type"] not in game_types:
|
||||
logging.debug("Appid %s is not a game", appid)
|
||||
raise SteamNotAGameError()
|
||||
|
||||
# Return API values we're interested in
|
||||
values = SteamAPIData(developer=", ".join(data["data"]["developers"]))
|
||||
values = SteamAPIData(developers=", ".join(data["data"]["developers"]))
|
||||
return values
|
||||
|
||||
@@ -20,15 +20,13 @@
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import requests
|
||||
from gi.repository import Gio
|
||||
from requests.exceptions import HTTPError
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.utils.save_cover import convert_cover, save_cover
|
||||
from src.utils.save_cover import resize_cover, save_cover
|
||||
|
||||
|
||||
class SGDBError(Exception):
|
||||
@@ -57,12 +55,12 @@ class SGDBHelper:
|
||||
base_url = "https://www.steamgriddb.com/api/v2/"
|
||||
|
||||
@property
|
||||
def auth_headers(self) -> dict[str, str]:
|
||||
def auth_headers(self):
|
||||
key = shared.schema.get_string("sgdb-key")
|
||||
headers = {"Authorization": f"Bearer {key}"}
|
||||
return headers
|
||||
|
||||
def get_game_id(self, game: Game) -> Any:
|
||||
def get_game_id(self, game):
|
||||
"""Get grid results for a game. Can raise an exception."""
|
||||
uri = f"{self.base_url}search/autocomplete/{game.name}"
|
||||
res = requests.get(uri, headers=self.auth_headers, timeout=5)
|
||||
@@ -76,7 +74,7 @@ class SGDBHelper:
|
||||
case _:
|
||||
res.raise_for_status()
|
||||
|
||||
def get_image_uri(self, game_id: str, animated: bool = False) -> Any:
|
||||
def get_image_uri(self, game_id, animated=False):
|
||||
"""Get the image for a SGDB game id"""
|
||||
uri = f"{self.base_url}grids/game/{game_id}?dimensions=600x900"
|
||||
if animated:
|
||||
@@ -95,7 +93,7 @@ class SGDBHelper:
|
||||
case _:
|
||||
res.raise_for_status()
|
||||
|
||||
def conditionaly_update_cover(self, game: Game) -> None:
|
||||
def conditionaly_update_cover(self, game):
|
||||
"""Update the game's cover if appropriate"""
|
||||
|
||||
# Obvious skips
|
||||
@@ -105,11 +103,11 @@ class SGDBHelper:
|
||||
|
||||
image_trunk = shared.covers_dir / game.game_id
|
||||
still = image_trunk.with_suffix(".tiff")
|
||||
animated = image_trunk.with_suffix(".gif")
|
||||
uri_kwargs = image_trunk.with_suffix(".gif")
|
||||
prefer_sgdb = shared.schema.get_boolean("sgdb-prefer")
|
||||
|
||||
# Do nothing if file present and not prefer SGDB
|
||||
if not prefer_sgdb and (still.is_file() or animated.is_file()):
|
||||
if not prefer_sgdb and (still.is_file() or uri_kwargs.is_file()):
|
||||
return
|
||||
|
||||
# Get ID for the game
|
||||
@@ -134,7 +132,7 @@ class SGDBHelper:
|
||||
tmp_file = Gio.File.new_tmp()[0]
|
||||
tmp_file_path = tmp_file.get_path()
|
||||
Path(tmp_file_path).write_bytes(response.content)
|
||||
save_cover(game.game_id, convert_cover(tmp_file_path))
|
||||
save_cover(game.game_id, resize_cover(tmp_file_path))
|
||||
except SGDBAuthError as error:
|
||||
# Let caller handle auth errors
|
||||
raise error
|
||||
|
||||
86
src/utils/task.py
Normal file
@@ -0,0 +1,86 @@
|
||||
# task.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
|
||||
|
||||
from functools import wraps
|
||||
|
||||
from gi.repository import Gio
|
||||
|
||||
|
||||
def create_task_thread_func_closure(func, data):
|
||||
"""Wrap a Gio.TaskThreadFunc with the given data in a closure"""
|
||||
|
||||
def closure(task, source_object, _data, cancellable):
|
||||
func(task, source_object, data, cancellable)
|
||||
|
||||
return closure
|
||||
|
||||
|
||||
def decorate_set_task_data(task):
|
||||
"""Decorate Gio.Task.set_task_data to replace it"""
|
||||
|
||||
def decorator(original_method):
|
||||
@wraps(original_method)
|
||||
def new_method(task_data):
|
||||
task.task_data = task_data
|
||||
|
||||
return new_method
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
def decorate_run_in_thread(task):
|
||||
"""Decorate Gio.Task.run_in_thread to pass the task data correctly
|
||||
Creates a closure around task_thread_func with the task data available."""
|
||||
|
||||
def decorator(original_method):
|
||||
@wraps(original_method)
|
||||
def new_method(task_thread_func):
|
||||
closure = create_task_thread_func_closure(task_thread_func, task.task_data)
|
||||
original_method(closure)
|
||||
|
||||
return new_method
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
class Task:
|
||||
"""Wrapper around Gio.Task to patch task data not being passed"""
|
||||
|
||||
@classmethod
|
||||
def new(cls, source_object, cancellable, callback, callback_data):
|
||||
"""Create a new, monkey-patched Gio.Task.
|
||||
The `set_task_data` and `run_in_thread` methods are decorated.
|
||||
|
||||
As of 2023-05-19, pygobject does not work well with Gio.Task, so to pass data
|
||||
the only viable way it to create a closure with the thread function and its data.
|
||||
This class is supposed to make Gio.Task comply with its expected behaviour
|
||||
per the docs:
|
||||
|
||||
http://lazka.github.io/pgi-docs/#Gio-2.0/classes/Task.html#Gio.Task.set_task_data
|
||||
|
||||
This code may break if pygobject overrides change in the future.
|
||||
We need to manually pass `self` to the decorators since it's otherwise bound but
|
||||
not accessible from Python's side.
|
||||
"""
|
||||
|
||||
task = Gio.Task.new(source_object, cancellable, callback, callback_data)
|
||||
task.set_task_data = decorate_set_task_data(task)(task.set_task_data)
|
||||
task.run_in_thread = decorate_run_in_thread(task)(task.run_in_thread)
|
||||
return task
|
||||
106
src/window.py
@@ -17,13 +17,9 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from typing import Any, Optional
|
||||
|
||||
from gi.repository import Adw, Gio, GLib, Gtk
|
||||
from gi.repository import Adw, Gtk
|
||||
|
||||
from src import shared
|
||||
from src.game import Game
|
||||
from src.game_cover import GameCover
|
||||
from src.utils.relative_date import relative_date
|
||||
|
||||
|
||||
@@ -68,13 +64,13 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
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 = "a-z"
|
||||
game_covers = {}
|
||||
toasts = {}
|
||||
active_game = None
|
||||
details_view_game_cover = None
|
||||
sort_state = "a-z"
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.previous_page = self.library_view
|
||||
@@ -114,29 +110,14 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
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:
|
||||
def search_changed(self, _widget, hidden):
|
||||
# Refresh search filter on keystroke in search box
|
||||
(self.hidden_library if hidden else self.library).invalidate_filter()
|
||||
|
||||
def set_library_child(self) -> None:
|
||||
def set_library_child(self):
|
||||
child, hidden_child = self.notice_empty, self.hidden_notice_empty
|
||||
|
||||
for game in shared.store:
|
||||
for game in shared.store.games.values():
|
||||
if game.removed or game.blacklisted:
|
||||
continue
|
||||
if game.hidden:
|
||||
@@ -153,7 +134,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
self.library_bin.set_child(child)
|
||||
self.hidden_library_bin.set_child(hidden_child)
|
||||
|
||||
def filter_func(self, child: Gtk.Widget) -> bool:
|
||||
def filter_func(self, child):
|
||||
game = child.get_child()
|
||||
text = (
|
||||
(
|
||||
@@ -175,10 +156,10 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
|
||||
return not filtered
|
||||
|
||||
def set_active_game(self, _widget: Any, _pspec: Any, game: Game) -> None:
|
||||
def set_active_game(self, _widget, _pspec, game):
|
||||
self.active_game = game
|
||||
|
||||
def show_details_view(self, game: Game) -> None:
|
||||
def show_details_view(self, game):
|
||||
self.active_game = game
|
||||
|
||||
self.details_view_cover.set_opacity(int(not game.loading))
|
||||
@@ -226,7 +207,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
|
||||
self.set_details_view_opacity()
|
||||
|
||||
def set_details_view_opacity(self, *_args: Any) -> None:
|
||||
def set_details_view_opacity(self, *_args):
|
||||
if self.stack.get_visible_child() != self.details_view:
|
||||
return
|
||||
|
||||
@@ -237,12 +218,12 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
return
|
||||
|
||||
self.details_view_blurred_cover.set_opacity(
|
||||
1 - self.details_view_game_cover.luminance[0] # type: ignore
|
||||
1 - self.details_view_game_cover.luminance[0]
|
||||
if style_manager.get_dark()
|
||||
else self.details_view_game_cover.luminance[1] # type: ignore
|
||||
else self.details_view_game_cover.luminance[1]
|
||||
)
|
||||
|
||||
def sort_func(self, child1: Gtk.Widget, child2: Gtk.Widget) -> int:
|
||||
def sort_func(self, child1, child2):
|
||||
var, order = "name", True
|
||||
|
||||
if self.sort_state in ("newest", "oldest"):
|
||||
@@ -252,17 +233,17 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
elif self.sort_state == "a-z":
|
||||
order = False
|
||||
|
||||
def get_value(index: int) -> str:
|
||||
def get_value(index):
|
||||
return str(
|
||||
getattr((child1.get_child(), child2.get_child())[index], var)
|
||||
).lower()
|
||||
|
||||
if var != "name" and get_value(0) == get_value(1):
|
||||
var, order = "name", False
|
||||
var, order = "name", True
|
||||
|
||||
return ((get_value(0) > get_value(1)) ^ order) * 2 - 1
|
||||
|
||||
def navigate(self, next_page: Gtk.Widget) -> None:
|
||||
def navigate(self, next_page):
|
||||
levels = (self.library_view, self.hidden_library_view, self.details_view)
|
||||
self.stack.set_transition_type(
|
||||
Gtk.StackTransitionType.UNDER_RIGHT
|
||||
@@ -279,13 +260,13 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
|
||||
self.stack.set_visible_child(next_page)
|
||||
|
||||
def on_go_back_action(self, *_args: Any) -> None:
|
||||
def on_go_back_action(self, *_args):
|
||||
if self.stack.get_visible_child() == self.hidden_library_view:
|
||||
self.navigate(self.library_view)
|
||||
elif self.stack.get_visible_child() == self.details_view:
|
||||
self.on_go_to_parent_action()
|
||||
|
||||
def on_go_to_parent_action(self, *_args: Any) -> None:
|
||||
def on_go_to_parent_action(self, *_args):
|
||||
if self.stack.get_visible_child() == self.details_view:
|
||||
self.navigate(
|
||||
self.hidden_library_view
|
||||
@@ -293,20 +274,20 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
else self.library_view
|
||||
)
|
||||
|
||||
def on_go_home_action(self, *_args: Any) -> None:
|
||||
def on_go_home_action(self, *_args):
|
||||
self.navigate(self.library_view)
|
||||
|
||||
def on_show_hidden_action(self, *_args: Any) -> None:
|
||||
def on_show_hidden_action(self, *_args):
|
||||
self.navigate(self.hidden_library_view)
|
||||
|
||||
def on_sort_action(self, action: Gio.SimpleAction, state: GLib.Variant) -> None:
|
||||
def on_sort_action(self, action, state):
|
||||
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:
|
||||
def on_toggle_search_action(self, *_args):
|
||||
if self.stack.get_visible_child() == self.library_view:
|
||||
search_bar = self.search_bar
|
||||
search_entry = self.search_entry
|
||||
@@ -323,7 +304,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
|
||||
search_entry.set_text("")
|
||||
|
||||
def on_escape_action(self, *_args: Any) -> None:
|
||||
def on_escape_action(self, *_args):
|
||||
if (
|
||||
self.get_focus() == self.search_entry.get_focus_child()
|
||||
or self.hidden_search_entry.get_focus_child()
|
||||
@@ -332,7 +313,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
else:
|
||||
self.on_go_back_action()
|
||||
|
||||
def show_details_view_search(self, widget: Gtk.Widget) -> None:
|
||||
def show_details_view_search(self, widget):
|
||||
library = (
|
||||
self.hidden_library if widget == self.hidden_search_entry else self.library
|
||||
)
|
||||
@@ -348,39 +329,30 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
|
||||
index += 1
|
||||
|
||||
def on_undo_action(
|
||||
self, _widget: Any, game: Optional[Game] = None, undo: Optional[str] = None
|
||||
) -> None:
|
||||
def on_undo_action(self, _widget, game=None, undo=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)
|
||||
if undo == "hide":
|
||||
game.toggle_hidden(False)
|
||||
|
||||
elif undo == "remove":
|
||||
game.removed = False
|
||||
game.save()
|
||||
game.update()
|
||||
elif undo == "remove":
|
||||
game.removed = False
|
||||
game.save()
|
||||
game.update()
|
||||
|
||||
self.toasts[(game, undo)].dismiss()
|
||||
self.toasts.pop((game, undo))
|
||||
self.toasts[(game, undo)].dismiss()
|
||||
self.toasts.pop((game, undo))
|
||||
|
||||
def on_open_menu_action(self, *_args: Any) -> None:
|
||||
def on_open_menu_action(self, *_args):
|
||||
if self.stack.get_visible_child() == self.library_view:
|
||||
self.primary_menu_button.popup()
|
||||
elif self.stack.get_visible_child() == self.hidden_library_view:
|
||||
self.hidden_primary_menu_button.popup()
|
||||
|
||||
def on_close_action(self, *_args: Any) -> None:
|
||||
def on_close_action(self, *_args):
|
||||
self.close()
|
||||
|
||||
@@ -15,10 +15,10 @@ AppSupportURL=https://github.com/kra-mo/cartridges/issues
|
||||
AppUpdatesURL={#MyAppURL}
|
||||
DefaultDirName={autopf64}\{#MyAppName}
|
||||
DisableProgramGroupPage=yes
|
||||
LicenseFile=..\..\LICENSE
|
||||
LicenseFile=..\LICENSE
|
||||
PrivilegesRequiredOverridesAllowed=dialog
|
||||
OutputBaseFilename=Cartridges Setup
|
||||
SetupIconFile=..\..\windows\icon.ico
|
||||
SetupIconFile=..\windows\icon.ico
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
WizardStyle=modern
|
||||
@@ -50,7 +50,7 @@ Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-
|
||||
Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion
|
||||
Source: "D:\a\_temp\msys64\ucrt64\share\locale\*"; DestDir: "{app}\share\locale"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
Source: "..\..\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
|
||||
Source: "..\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
[Icons]
|
||||
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico"
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
configure_file(
|
||||
input: './Cartridges.iss.in',
|
||||
output: 'Cartridges.iss',
|
||||
configuration: conf,
|
||||
install: true,
|
||||
install_dir: '.'
|
||||
)
|
||||