pax_global_header00006660000000000000000000000064145703646630014530gustar00rootroot0000000000000052 comment=4c978ec53f0d86de116e4db471821af5138f8edc cozy-1.3.0/000077500000000000000000000000001457036466300125155ustar00rootroot00000000000000cozy-1.3.0/.ci/000077500000000000000000000000001457036466300131665ustar00rootroot00000000000000cozy-1.3.0/.ci/flathub_wait_for_build.sh000077500000000000000000000024121457036466300202220ustar00rootroot00000000000000#!/bin/bash URL_RUNNING_BUILDS="https://flathub.org/builds/api/v2/builders/32/builds?complete=false&flathub_name__eq=com.github.geigi.cozy&order=-number&property=owners&property=workername" URL_LAST_BUILD="https://flathub.org/builds/api/v2/builders/32/builds?flathub_name__eq=com.github.geigi.cozy&flathub_repo_status__gt=1&limit=1&order=-number&property=owners&property=workername" function wait_for_build_triggered { for i in {0..30} do sleep 1 builds_in_progress=$(curl $URL_RUNNING_BUILDS | json meta.total) if (( builds_in_progress > 0 )); then echo "$builds_in_progress build(s) in progress." return 0 fi done echo "No build in progress." return 1 } wait_for_build_triggered build_triggered=$? if (( $build_triggered > 0 )); then exit 1 fi builds_in_progress=$(curl $URL_RUNNING_BUILDS | json meta.total) counter=0 while [[ $builds_in_progress != [0] ]] do echo "$builds_in_progress build(s) in progress." sleep 5 builds_in_progress=$(curl $URL_RUNNING_BUILDS | json meta.total) counter=$((counter+5)) if (( counter > 1800 )); then echo "Build longer than 30min, failing!" exit 1 fi done result=$(curl $URL_LAST_BUILD | json builds[0].results) if (( builds_in_progress > 0 )); then echo "Build failed." exit 1 fi echo "Build succeeded." exit 0 cozy-1.3.0/.ci/obs_wait_for_build.sh000077500000000000000000000010621457036466300173600ustar00rootroot00000000000000#!/bin/bash echo $(osc r) osc r | grep -E "building|blocked|scheduled" builds_in_progress=$? counter=0 while [[ $builds_in_progress != [1] ]] do echo "Build(s) in progress." sleep 5 echo $(osc r) osc r | grep -E "building|scheduled" builds_in_progress=$? counter=$((counter+5)) if (( counter > 3600 )); then echo "Build longer than 60min, failing!" exit 1 fi done echo $(osc r) osc r | grep -E "broken|failed" build_successful=$? if (( $build_successful != 1 )); then echo "At least one build failed." exit 1 fi echo "Builds succeeded." exit 0 cozy-1.3.0/.github/000077500000000000000000000000001457036466300140555ustar00rootroot00000000000000cozy-1.3.0/.github/FUNDING.yml000066400000000000000000000000761457036466300156750ustar00rootroot00000000000000# These are supported funding model platforms patreon: geigi cozy-1.3.0/.github/dependabot.yml000066400000000000000000000003171457036466300167060ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" - package-ecosystem: "pip" directory: "/" schedule: interval: "monthly" cozy-1.3.0/.github/issue_template.md000066400000000000000000000002151457036466300174200ustar00rootroot00000000000000### Bug/Feature description ### Steps to reproduce ### System Information - Operating System: - Installation source: - Version of cozy: cozy-1.3.0/.github/workflows/000077500000000000000000000000001457036466300161125ustar00rootroot00000000000000cozy-1.3.0/.github/workflows/aur.yml000066400000000000000000000040501457036466300174230ustar00rootroot00000000000000name: Deploy on AUR on: release: types: [published] #on: # watch: # types: [started] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update sudo apt-get install libnode-dev node-gyp libssl-dev sudo apt-get install npm sudo npm install -g json - name: Download latest cozy release run: | curl -s https://api.github.com/repos/geigi/cozy/releases/latest | json tag_name > /tmp/VERSION echo https://github.com/geigi/cozy/archive/$(cat /tmp/VERSION).tar.gz > /tmp/RELEASE_URL wget -O /tmp/cozy.tar.gz $(cat /tmp/RELEASE_URL) sha256sum /tmp/cozy.tar.gz | cut -d " " -f 1 > /tmp/SHA256SUM - name: Setup SSH Keys and known_hosts env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock run: | mkdir -p ~/.ssh ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts ssh-agent -a $SSH_AUTH_SOCK > /dev/null ssh-add - <<< "${{ secrets.AUR_PRIVATE }}" - name: Clone cozy-audiobooks repository env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock run: git clone ssh://aur@aur.archlinux.org/cozy-audiobooks.git /tmp/aur - name: Update PKGBUILD run: | ls /tmp/aur cd /tmp/aur sed -i "s/^pkgver.*\$/pkgver=$(cat /tmp/VERSION)/" PKGBUILD sed -i "s/^sha256sum.*\$/sha256sums=('$(cat /tmp/SHA256SUM)')/" PKGBUILD sed -i "s/.*pkgver.*\$/ pkgver = $(cat /tmp/VERSION)/" .SRCINFO sed -i "s/.*source.*\$/ source = https\:\/\/github.com\/geigi\/cozy\/archive\/$(cat /tmp/VERSION)\.tar\.gz/" .SRCINFO sed -i "s/.*sha256sums.*\$/ sha256sums = $(cat /tmp/SHA256SUM)/" .SRCINFO - name: Push changes env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock run: | git config --global user.email "github@geigi.de" git config --global user.name "Github Actions" cd /tmp/aur git commit -am "Bump version to $(cat /tmp/VERSION)" git push cozy-1.3.0/.github/workflows/checks.yml000066400000000000000000000003571457036466300201020ustar00rootroot00000000000000name: Checks on: push: branches: - "main" pull_request: jobs: ruff: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: chartboost/ruff-action@v1 with: args: --exit-zerocozy-1.3.0/.github/workflows/flathub.yml000066400000000000000000000033351457036466300202660ustar00rootroot00000000000000name: Deploy on Flathub on: release: types: [published] #on: # watch: # types: [started] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update sudo apt-get install libnode-dev node-gyp libssl-dev sudo apt-get install npm sudo npm install -g json - name: Download latest cozy release run: | curl -s https://api.github.com/repos/geigi/cozy/releases/latest | json tag_name > /tmp/VERSION echo https://github.com/geigi/cozy/archive/$(cat /tmp/VERSION).tar.gz > /tmp/RELEASE_URL wget -O /tmp/cozy.tar.gz $(cat /tmp/RELEASE_URL) sha256sum /tmp/cozy.tar.gz | cut -d " " -f 1 > /tmp/SHA256SUM - name: Clone Flathub repository run: git clone https://geigi:${{ secrets.FLATHUB_TOKEN }}@github.com/flathub/com.github.geigi.cozy.git /tmp/flathub - name: Update Flathub json run: | ls /tmp/flathub json -I -f /tmp/flathub/com.github.geigi.cozy.json -e "this.modules[this.modules.length - 1].sources[0].url='https://github.com/geigi/cozy/archive/$(cat /tmp/VERSION).tar.gz'" json -I -f /tmp/flathub/com.github.geigi.cozy.json -e "this.modules[this.modules.length - 1].sources[0].sha256='$(cat /tmp/SHA256SUM)'" - name: Push changes run: | git config --global user.email "github@geigi.de" git config --global user.name "Github Actions" cd /tmp/flathub git commit -am "Bump version to $(cat /tmp/VERSION)" git push - name: Wait for flathub build to complete run: | cd $GITHUB_WORKSPACE/.ci chmod +x *.sh ./flathub_wait_for_build.sh cozy-1.3.0/.github/workflows/flatpak.yml000066400000000000000000000016041457036466300202600ustar00rootroot00000000000000name: Flatpak on: [push, pull_request] jobs: flatpak: runs-on: ubuntu-latest container: image: bilelmoussaoui/flatpak-github-actions:gnome-45 options: --privileged strategy: matrix: arch: [x86_64, aarch64] # Don't fail the whole workflow if one architecture fails fail-fast: false steps: - uses: actions/checkout@v4 - name: Install deps run: | dnf -y install docker if: ${{ matrix.arch == 'aarch64' }} - name: Set up QEMU id: qemu uses: docker/setup-qemu-action@v3 with: platforms: arm64 if: ${{ matrix.arch == 'aarch64' }} - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6 with: bundle: Cozy.flatpak manifest-path: com.github.geigi.cozy.json cache-key: "flatpak-builder-${{ github.sha }}" arch: ${{ matrix.arch }} cozy-1.3.0/.github/workflows/opensuse.yml000066400000000000000000000036341457036466300205040ustar00rootroot00000000000000name: Deploy on OBS (OpenSuse) on: release: types: [published] #on: # watch: # types: [started] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install dependencies run: | mkdir -p ~/.config/osc sudo apt-get update sudo apt-get install libnode-dev node-gyp libssl-dev sudo apt-get install osc npm python3-m2crypto sudo npm install -g json - name: Setup osc login run: | cat >~/.config/osc/oscrc < /tmp/VERSION curl -s https://api.github.com/repos/geigi/cozy/releases/latest | json body > /tmp/CHANGES echo https://github.com/geigi/cozy/archive/$(cat /tmp/VERSION).tar.gz > /tmp/RELEASE_URL cd X11:Pantheon:Apps/cozy rm cozy-*.tar.gz wget -O cozy-$(cat /tmp/VERSION).tar.gz $(cat /tmp/RELEASE_URL) - name: Update rpm info files run: | cd X11:Pantheon:Apps/cozy sed -i -e 's/- / * /g' /tmp/CHANGES sed -i "1s/^/Update to $(cat /tmp/VERSION)\n/" /tmp/CHANGES osc vc -m "$(cat /tmp/CHANGES)" sed -i -e "s/Version:.*/Version: $(cat /tmp/VERSION)/g" cozy.spec - name: Osc check-in run: | cd X11:Pantheon:Apps/cozy osc addremove osc ci --noservice -m "Update to version $(cat /tmp/VERSION)." - name: Wait for obs build to complete run: | chmod +x $GITHUB_WORKSPACE/.ci/*.sh cd X11:Pantheon:Apps/cozy $GITHUB_WORKSPACE/.ci/obs_wait_for_build.sh - name: Submit package run: | cd X11:Pantheon:Apps/cozy osc submitrequest -m "Update to version $(cat /tmp/VERSION)." cozy-1.3.0/.github/workflows/tests.yml000066400000000000000000000004221457036466300177750ustar00rootroot00000000000000name: Tests on: push: branches: - "main" - "master" pull_request: jobs: test: runs-on: ubuntu-latest container: image: ghcr.io/geigi/cozy-ci:main steps: - uses: actions/checkout@v4 - name: Run pytest run: pytest cozy-1.3.0/.gitignore000066400000000000000000000007161457036466300145110ustar00rootroot00000000000000.vscode/ .idea/ _build/ .buildconfig .flatpak-builder build/ build-fp/ app/ bin/ cozy/__pycache__ debian/build/ debian/com.github.geigi.cozy.debhelper.log debian/com.github.geigi.cozy.substvars debian/com.github.geigi.cozy/ debian/debhelper-build-stamp debian/files peewee/ venv/ .pytest_cache # Ignore glade tmp files *~ \#*\# # Ignore sublime files *.sublime-workspace *.sublime-project .vscode/.ropeproject .vscode/tags .tx *.log *.prof *.pyc .DS_Store cozy-1.3.0/.travis.yml000066400000000000000000000005711457036466300146310ustar00rootroot00000000000000--- language: node_js node_js: - 10/* sudo: required services: - docker addons: apt: sources: - ubuntu-toolchain-r-test packages: - libstdc++-5-dev cache: directories: - /tmp/liftoff matrix: include: - env: DIST=loki - env: DIST=juno install: - npm i -g @elementaryos/houston script: - houston ci --distribution $DIST cozy-1.3.0/AUTHORS.md000066400000000000000000000026501457036466300141670ustar00rootroot00000000000000# Code - Julian Geywitz - Benedek Dévényi - A6GibKm - alyssais - apandada1 - AsavarTzeth - Fatih20 - NathanBnm - camellan - chris-kobrzak - elya5 - foliva - grenade - jnbr - jubalh - kaphula - leuc - magnickolas - meisenzahl - naglis - oleg-krv - paper42 - phpwutz - rapenne-s - thibaultamartin - umeboshi2 - worldofpeace # Design - Julian Geywitz - Tobias Bernard - Benedek Dévényi # Icon - Jakub Steiner # Translators ``` Ainte AndreBarata Andrey389 Asyx BunColak Caarmi CiTyBear Distil62 Fitoschido Floflr Foxyriot HansCz IngrownMink4 IvoIliev Jagadeeshvarma Kwentin MageJohn NHiX Nimmerliefde Oi_Suomi_On Okton Panwar108 Potty0 Sebosun TheMBTH TheRuleOfMike Vistaus W2hJ3MOmIRovEpTeahe80jC WhiredPlanck _caasi aKodi abcmen abuyop albanobattistella amadeussss andreapillai arejano artnay b3nj4m1n baschdl78 camellan cavinsmith cho2 chris109b cjfloss ckaotik corentinbettiol dtgoitia dzerus3 elgosz endiamesos eson fishcake13 fountain fran.dieguez georgelemental giuscasula goran.p1123581321 hamidout hkoivuneva jan.sundman jan_nekvasil jouselt karaagac kevinmueller leondorus libreajans linuxmasterclub magnickolas makaleks mannycalavera42 mardojai markluethje milotype mvainola n1k7as nikkpark no404error nvivant oleg_krv ooverloord oscfdezdz pavelz rafaelff1 ragouel saarikko sobeitnow0 sojuz151 steno tclokie test21 thibaultmartin translatornator tsitokhtsev twardowskidev txelu useruseruser1233211 vanhoxx vlabo xfgusta yalexaner ``` cozy-1.3.0/DEVELOPMENT.md000066400000000000000000000054421457036466300146260ustar00rootroot00000000000000# Cozy development This document is intended for software engineers and translators who would like to help out with the development of Cozy, or simply be able to run bleeding edge versions of the code locally. ## Building with GNOME Builder (recommended) Cozy can be built and run with [GNOME Builder](https://apps.gnome.org/Builder/). 1. Open GNOME Builder 2. Click the **Clone Repository** button 3. Enter `https://github.com/geigi/cozy.git` in the **Repository URL** field 4. Click the **Clone Project** button 5. Click the ▶️**Run** button to start building the application ## Building manually _The below instructions have been tested on Ubuntu 20.04 and Fedora 39_ ### Requirements (Ubuntu) ```console sudo apt update sudo apt install \ appstreamcli \ cmake \ gettext \ git \ gstreamer1.0-libav \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-ugly \ libgirepository1.0-dev \ libgstreamer1.0-0 \ libgtk-4-dev \ libadwaita-1-dev \ pip \ python-gi-cairo \ python3-gst-1.0 \ python3-venv ``` ### Requirements (Fedora) ```console sudo dnf install \ appstream \ cmake \ gettext \ gstreamer1-libav \ gstreamer1-plugins-ugly \ gstreamer1-plugins-bad \ gstreamer1-plugins-good \ gstreamer1-devel\ gtk4-devel \ libadwaita-devel \ pipenv \ python3-cairo-devel \ python3-gstreamer1 ``` ### Source code ```console git clone https://github.com/geigi/cozy.git cd cozy ``` ### Python packages > [!TIP] > It is generally a good idea to set up a virtual environment for Python projects. It creates an isolated environment where packages can be installed without creating conflicts with other packages installed system-wide. ```console python3 -m venv venv source ./venv/bin/activate python -m pip install --upgrade pip pip install -r requirements.txt pip install meson ninja pip install pytest pytest-mock ``` To enter the virtual environment, you will need to run `source ./venv/bin/activate` every time you reopen your terminal. ### Build and install Let's assume you wish to build the application under the `build/` directory and install the binaries under `app/`: ```console meson setup --prefix=$(pwd)/app ./build ninja -C build install ``` ### Install translation files ```console ninja -C build com.github.geigi.cozy-update-po ninja -C build extra-update-po ``` ### Run application ```console XDG_DATA_DIRS=app/share:/usr/share \ PYTHONPATH=app/lib/python3.11/site-packages \ app/bin/com.github.geigi.cozy ``` Your Python path may be different so you might need to amend the `PYTHONPATH` environment variable above in case of errors. > [!NOTE] > Every time you make changes to the code, you need to execute `ninja -C build install` before you run the application. ## Running the test suite ```bash python -m pytest ``` cozy-1.3.0/LICENSE000066400000000000000000001045151457036466300135300ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . cozy-1.3.0/README.md000066400000000000000000000173521457036466300140040ustar00rootroot00000000000000![Unit Testing](https://github.com/geigi/cozy/workflows/Unit%20Testing/badge.svg)

Download on Flathub

# It's getting Cozy ![Screenshot](https://raw.githubusercontent.com/geigi/cozy/img/img/screenshot1.png) Cozy is a modern audiobook player for Linux. Head over to [Matrix](https://matrix.to/#/#cozy:gnome.org?via=matrix.org&via=gnome.org) to join the conversation. ## Here are some of the current features: - **Import** your audiobooks into Cozy to browse them comfortably - **Sort** your audio books by author, reader & name - **Remembers** your **playback position** - **Sleep timer** - **Playback speed control** - **Search** your library - **Offline Mode!** This allows you to keep an audio book on your internal storage if you store your audiobooks on an external or network drive. Perfect for listening on the go! - Add **mulitple storage locations** - **Drag & Drop** to import new audio books - Support for DRM free **mp3, m4a (aac, ALAC, …), flac, ogg, opus, wav** files - Mpris integration (**Media keys** & playback info for desktop environment) # Install | Distro | Package | |--------|:---------:| | Flatpak | Download on Flathub | | openSUSE |
cozy | | Fedora |
cozy | | Arch Linux (AUR) | cozy-audiobooks
| | VoidLinux | cozy | | Solus | cozy | | MX Linux |
Cozy | | elementaryOS | Currently out of date. Please use Flatpak for now. | | Ubuntu (PPA) |
cozy | | OpenBSD |
cozy | | Nix |
cozy | ## elementaryOS The App Center version of Cozy is currently out of date. elementaryOS ships with old versions of dependencies needed by Cozy. Those are not compatible anymore. Therefore I'm unable to update the App Center version to the latest version of Cozy. Please switch over to the Flatpak version for now. If you experience issues with moving your library, let me know! elementaryOS is working on a new version of App Center which will be based on Flatpak. When the new App Center is live, Cozy will be back on the app center! :) Thanks for everyone who supported me on the App Center. ## macOS **Currently discontinued** There is an older beta of Cozy 0.6.7 which is tested on macOS 10.14. It might not work with newer versions of macOS. Because the build process is rather complicated and not easy to automate I've currently discontinued building for macOS. If you're interested in the build process: have a look at my [writeup](https://gist.github.com/geigi/a3b6d661daeb7b181d3bdd3cab517092). Some information about the old beta: - no integration in notification center or any other desktop integration really - media keys are not working - dark mode requires 2x switching in settings + is not loading automatically at startup - large Cozy.app You can download it here: Cozy 0.6.7 beta3 for macOS # Development See [DEVELOPMENT.md](DEVELOPMENT.md) for detailed instructions and developing Cozy on Ubuntu. ## Requirements - `python3` - `meson >= 0.40.0` as build system - `gtk4 >= 4.10` - `libadwaita >= 1.4.0` - `peewee >= 3.9.6` as object relation mapper - `mutagen` for meta tag management - `distro` - `requests` - `pytz` - `gi-cairo` - `gst-1.0` - `file` - `gstreamer1.0-plugins-good` - `gstreamer1.0-plugins-bad` - `gstreamer1.0-plugins-ugly` - `gstreamer1.0-libav` for mp4 support ## Bundled Requirements - `inject`: https://github.com/ivankorobkov/python-inject This dependency is bundled because it is not generally available as a linux package. The licence is respected and included. ## Build ```bash $ git clone https://github.com/geigi/cozy.git $ cd cozy $ meson --prefix= $ ninja -C install ``` ## Update `po` files ```bash $ ninja -C com.github.geigi.cozy-update-po $ ninja -C extra-update-po ``` ## Running a local build ``` XDG_DATA_DIRS=/share:/usr/share \ PYTHONPATH=/lib/python3.[your_python3_version]/site-packages \ app/bin/com.github.geigi.cozy ``` ## Q&A ### I have imported wrong files and cannot get rid of them: Delete the following folders to reset cozy (this will loose all saved progress): ``` ~/.local/share/cozy ~/.cache/cozy ``` ### I can't uninstall the Flatpak: Try ``` flatpak uninstall com.github.geigi.cozy/x86_64/stable ``` or ``` flatpak uninstall --user com.github.geigi.cozy/x86_64/stable ``` Thanks to @Meresmata ### I store my audiobooks in a location that is not accessible in the Flatpak sandbox: You can override the flatpak settings and allow access to a path (e.g. /media) like this: ``` flatpak --user override --filesystem=/media com.github.geigi.cozy ``` ## A big thanks To the contributors on GitHub: - A6GibKm - alyssais - apandada1 - AsavarTzeth - Fatih20 - NathanBnm - camellan - chris-kobrzak - elya5 - foliva - grenade - jimmac - jnbr - jubalh - kaphula - leuc - magnickolas - meisenzahl - naglis - oleg-krv - paper42 - phpwutz - rapenne-s - rdbende - thibaultamartin - umeboshi2 - worldofpeace The translators: - Ainte - AndreBarata - Andrey389 - Asyx - BunColak - Caarmi - CiTyBear - Distil62 - Fitoschido - Floflr - Foxyriot - HansCz - IngrownMink4 - IvoIliev - Jagadeeshvarma - Kwentin - MageJohn - NHiX - Nimmerliefde - Oi_Suomi_On - Okton - Panwar108 - Potty0 - Sebosun - TheMBTH - TheRuleOfMike - Vistaus - W2hJ3MOmIRovEpTeahe80jC - WhiredPlanck - _caasi - aKodi - abcmen - abuyop - albanobattistella - amadeussss - andreapillai - arejano - artnay - b3nj4m1n - baschdl78 - camellan - cavinsmith - cho2 - chris109b - cjfloss - ckaotik - corentinbettiol - dtgoitia - dzerus3 - elgosz - endiamesos - eson - fishcake13 - fountain - fran.dieguez - georgelemental - giuscasula - goran.p1123581321 - hamidout - hkoivuneva - jan.sundman - jan_nekvasil - jouselt - karaagac - kevinmueller - leondorus - Sabri Unal - linuxmasterclub - magnickolas - makaleks - mannycalavera42 - mardojai - markluethje - milotype - mvainola - n1k7as - nikkpark - no404error - nvivant - oleg_krv - ooverloord - oscfdezdz - pavelz - rafaelff1 - ragouel - saarikko - sobeitnow0 - sojuz151 - steno - tclokie - test21 - thibaultmartin - translatornator - tsitokhtsev - twardowskidev - txelu - useruseruser1233211 - vanhoxx - vlabo - xfgusta - yalexaner - bittin To nedrichards for the Flatpak. ## Help me translate cozy! Cozy is on Transifex, where anyone can contribute and translate. Can't find your language in the list? Let me know! If you like this project, consider supporting me on Patreon :) ---- [![Maintainability](https://api.codeclimate.com/v1/badges/fde8cbdff23033adaca2/maintainability)](https://codeclimate.com/github/geigi/cozy/maintainability) cozy-1.3.0/com.github.geigi.cozy.json000066400000000000000000000115111457036466300175140ustar00rootroot00000000000000{ "app-id": "com.github.geigi.cozy", "runtime": "org.gnome.Platform", "runtime-version": "45", "sdk": "org.gnome.Sdk", "command": "com.github.geigi.cozy", "finish-args": [ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--device=dri", "--share=network", "--socket=pulseaudio", "--filesystem=host", "--filesystem=xdg-run/gvfs", "--filesystem=xdg-run/gvfsd", "--talk-name=org.freedesktop.Notifications", "--talk-name=org.gtk.vfs.*", "--own-name=org.mpris.MediaPlayer2.Cozy", "--metadata=X-DConf=migrate-path=/com/github/geigi/cozy/", "--env=LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/lib" ], "modules": [ { "name": "python3-distro", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"distro\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", "sha256": "7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" } ] }, { "name": "python3-mutagen", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"mutagen\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", "sha256": "edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719" } ] }, { "name": "python3-peewee", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"peewee>=3.9.6\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/8d/a5/89cdbc4a7f6d7a0624c120be102db770ee717aa371066581e3daf2beb96f/peewee-3.17.1.tar.gz", "sha256": "e009ac4227c4fdc0058a56e822ad5987684f0a1fbb20fed577200785102581c3" } ] }, { "name": "python3-pytz", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"pytz\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl", "sha256": "328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" } ] }, { "name": "python3-requests", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"requests\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl", "sha256": "dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", "sha256": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", "sha256": "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/88/75/311454fd3317aefe18415f04568edc20218453b709c63c58b9292c71be17/urllib3-2.2.0-py3-none-any.whl", "sha256": "ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224" } ] }, { "name": "cozy", "buildsystem": "meson", "run-tests": true, "sources": [ { "type": "dir", "path": "." } ] } ] } cozy-1.3.0/cozy.doap000066400000000000000000000015231457036466300143470ustar00rootroot00000000000000 Cozy Listen to audio books Python GTK 4 Libadwaita Julian Geywitz geigi cozy-1.3.0/cozy/000077500000000000000000000000001457036466300135015ustar00rootroot00000000000000cozy-1.3.0/cozy/__init__.py000066400000000000000000000000001457036466300156000ustar00rootroot00000000000000cozy-1.3.0/cozy/app_controller.py000066400000000000000000000170431457036466300171030ustar00rootroot00000000000000from gi.repository import Gio import cozy.ext.inject as inject from peewee import SqliteDatabase from cozy.control.offline_cache import OfflineCache from cozy.media.files import Files from cozy.media.gst_player import GstPlayer from cozy.media.player import Player from cozy.model.database_importer import DatabaseImporter from cozy.power_manager import PowerManager from cozy.report import reporter from cozy.application_settings import ApplicationSettings from cozy.architecture.singleton import Singleton from cozy.control.db import get_db from cozy.control.filesystem_monitor import FilesystemMonitor from cozy.model.book import Book from cozy.model.library import Library from cozy.model.settings import Settings from cozy.open_view import OpenView from cozy.ui.app_view import AppView from cozy.ui.book_detail_view import BookDetailView from cozy.ui.headerbar import Headerbar from cozy.ui.toaster import ToastNotifier from cozy.ui.library_view import LibraryView from cozy.ui.main_view import CozyUI from cozy.ui.media_controller import MediaController from cozy.ui.search_view import SearchView from cozy.view import View from cozy.view_model.app_view_model import AppViewModel from cozy.view_model.book_detail_view_model import BookDetailViewModel from cozy.view_model.headerbar_view_model import HeaderbarViewModel from cozy.view_model.library_view_model import LibraryViewModel, LibraryViewMode from cozy.view_model.playback_control_view_model import PlaybackControlViewModel from cozy.view_model.playback_speed_view_model import PlaybackSpeedViewModel from cozy.view_model.search_view_model import SearchViewModel from cozy.view_model.settings_view_model import SettingsViewModel from cozy.view_model.sleep_timer_view_model import SleepTimerViewModel from cozy.view_model.storages_view_model import StoragesViewModel class AppController(metaclass=Singleton): def __init__(self, gtk_app, main_window_builder, main_window): self.gtk_app = gtk_app self.main_window: CozyUI = main_window self.main_window_builder = main_window_builder inject.configure_once(self.configure_inject) reporter.info("main", "startup") self.library_view: LibraryView = LibraryView(main_window_builder) self.app_view: AppView = AppView(main_window_builder) self.headerbar: Headerbar = Headerbar(main_window_builder) self.book_detail_view: BookDetailView = BookDetailView(main_window_builder) self.media_controller: MediaController = MediaController(main_window_builder) self.search_view: SearchView = SearchView(main_window_builder, self.headerbar) self.library_view_model = inject.instance(LibraryViewModel) self.app_view_model = inject.instance(AppViewModel) self.search_view_model = inject.instance(SearchViewModel) self.book_detail_view_model = inject.instance(BookDetailViewModel) self.playback_control_view_model = inject.instance(PlaybackControlViewModel) self.sleep_timer_view_model = inject.instance(SleepTimerViewModel) self.headerbar_view_model = inject.instance(HeaderbarViewModel) self.settings_view_model = inject.instance(SettingsViewModel) self.player = inject.instance(Player) self._connect_search_button() self.search_view_model.add_listener(self._on_open_view) self.book_detail_view_model.add_listener(self._on_open_view) self.library_view_model.add_listener(self._on_open_view) self.library_view_model.add_listener(self._on_library_view_event) self.playback_control_view_model.add_listener(self._on_open_view) self.headerbar_view_model.add_listener(self._on_working_event) self.app_view_model.add_listener(self._on_app_view_event) self.main_window.add_listener(self._on_main_window_event) self.power_manager = inject.instance(PowerManager) def configure_inject(self, binder): binder.bind_to_provider(SqliteDatabase, get_db) binder.bind("MainWindow", self.main_window) binder.bind("GtkApp", self.gtk_app) binder.bind("MainWindowBuilder", self.main_window_builder) binder.bind_to_constructor(Gio.Settings, lambda: Gio.Settings("com.github.geigi.cozy")) binder.bind_to_constructor(ApplicationSettings, lambda: ApplicationSettings()) binder.bind_to_constructor(Settings, lambda: Settings()) binder.bind_to_constructor("FilesystemMonitor", lambda: FilesystemMonitor()) binder.bind_to_constructor(OfflineCache, lambda: OfflineCache()) binder.bind_to_constructor(Player, lambda: Player()) binder.bind_to_constructor(Library, lambda: Library()) binder.bind_to_constructor(DatabaseImporter, lambda: DatabaseImporter()) binder.bind_to_constructor(LibraryViewModel, lambda: LibraryViewModel()) binder.bind_to_constructor(SearchViewModel, lambda: SearchViewModel()) binder.bind_to_constructor(Files, lambda: Files()) binder.bind_to_constructor(BookDetailViewModel, lambda: BookDetailViewModel()) binder.bind_to_constructor(PlaybackControlViewModel, lambda: PlaybackControlViewModel()) binder.bind_to_constructor(HeaderbarViewModel, lambda: HeaderbarViewModel()) binder.bind_to_constructor(PlaybackSpeedViewModel, lambda: PlaybackSpeedViewModel()) binder.bind_to_constructor(SleepTimerViewModel, lambda: SleepTimerViewModel()) binder.bind_to_constructor(GstPlayer, lambda: GstPlayer()) binder.bind_to_constructor(PowerManager, lambda: PowerManager()) binder.bind_to_constructor(ToastNotifier, lambda: ToastNotifier()) binder.bind_to_constructor(AppViewModel, lambda: AppViewModel()) binder.bind_to_constructor(SettingsViewModel, lambda: SettingsViewModel()) binder.bind_to_constructor(StoragesViewModel, lambda: StoragesViewModel()) def open_author(self, author: str): self.library_view_model.library_view_mode = LibraryViewMode.AUTHOR self.library_view_model.selected_filter = author def open_reader(self, reader: str): self.library_view_model.library_view_mode = LibraryViewMode.READER self.library_view_model.selected_filter = reader def open_book(self, book: Book): self.book_detail_view_model.open_book_detail_view() self.book_detail_view_model.book = book def open_library(self): self.library_view_model.open_library() self.app_view_model.view = View.LIBRARY_FILTER def _connect_search_button(self): self.headerbar.search_button.connect( "notify::active", self.search_view.on_state_changed ) def _on_open_view(self, event, data): if event == OpenView.AUTHOR: self.open_author(data) elif event == OpenView.READER: self.open_reader(data) elif event == OpenView.BOOK: self.open_book(data) elif event == OpenView.LIBRARY: self.open_library() def _on_library_view_event(self, event: str, _): if event == "work-done": self.main_window.switch_to_playing() def _on_app_view_event(self, event: str, data): if event == "view": self.headerbar_view_model.set_view(data) def _on_working_event(self, event: str, data) -> None: if event == "working": self.book_detail_view_model.lock_ui = data self.settings_view_model.lock_ui = data def _on_main_window_event(self, event: str, data): if event == "open_view": self._on_open_view(data, None) def quit(self): self.sleep_timer_view_model.destroy() self.player.destroy() cozy-1.3.0/cozy/application.py000066400000000000000000000050171457036466300163610ustar00rootroot00000000000000import logging import os import platform import sys import threading from pathlib import Path from traceback import format_exception import distro from gi.repository import Adw, GLib from cozy.app_controller import AppController from cozy.control.db import init_db from cozy.control.mpris import MPRIS from cozy.db.settings import Settings from cozy.db.storage import Storage from cozy.report import reporter from cozy.ui.main_view import CozyUI from cozy.ui.widgets.filter_list_box import FilterListBox from cozy.version import __version__ log = logging.getLogger("application") class Application(Adw.Application): ui: CozyUI app_controller: AppController def __init__(self, pkgdatadir: str): self.pkgdatadir = pkgdatadir super().__init__(application_id='com.github.geigi.cozy') self.init_custom_widgets() GLib.setenv("PULSE_PROP_media.role", "music", True) GLib.set_application_name("Cozy") threading.excepthook = self.handle_exception def do_startup(self): log.info(distro.linux_distribution(full_distribution_name=False)) log.info("Starting up cozy %s", __version__) log.info("libadwaita version: %s", Adw._version) self.ui = CozyUI(self.pkgdatadir, self, __version__) Adw.Application.do_startup(self) init_db() self.ui.startup() def do_activate(self): main_window_builder = self.ui.get_builder() self.app_controller = AppController(self, main_window_builder, self.ui) self.ui.activate(self.app_controller.library_view) if Settings.get().first_start: Settings.update(first_start=False).execute() path = os.path.join(Path.home(), _("Audiobooks")) Storage.create(path=path, default=True) os.makedirs(path, exist_ok=True) self.add_window(self.ui.window) if platform.system().lower() == "linux": mpris = MPRIS(self) mpris._on_current_changed() def handle_exception(self, _): print("handle exception") exc_type, exc_value, exc_traceback = sys.exc_info() if exc_type is SystemExit: return try: reporter.exception("uncaught", exc_value, "\n".join(format_exception(exc_type, exc_value, exc_traceback))) finally: sys.excepthook(exc_type, exc_value, exc_traceback) def quit(self): self.app_controller.quit() super(Application, self).quit() @staticmethod def init_custom_widgets(): FilterListBox() cozy-1.3.0/cozy/application_settings.py000066400000000000000000000102141457036466300202740ustar00rootroot00000000000000from gi.repository import Gio from cozy.architecture.event_sender import EventSender from cozy.ext import inject class ApplicationSettings(EventSender): _settings: Gio.Settings = inject.attr(Gio.Settings) def __init__(self): super().__init__() self._connect() def _connect(self): self._settings.connect("changed", self._key_changed) def _key_changed(self, settings: Gio.Settings, key: str): self.emit_event(key) @property def hide_offline(self) -> bool: return self._settings.get_boolean("hide-offline") @hide_offline.setter def hide_offline(self, new_value: bool): self._settings.set_boolean("hide-offline", new_value) @property def swap_author_reader(self) -> bool: return self._settings.get_boolean("swap-author-reader") @property def volume(self) -> float: return self._settings.get_double("volume") @volume.setter def volume(self, new_value: float): self._settings.set_double("volume", new_value) @property def titlebar_remaining_time(self) -> bool: return self._settings.get_boolean("titlebar-remaining-time") @titlebar_remaining_time.setter def titlebar_remaining_time(self, new_value: bool): self._settings.set_boolean("titlebar-remaining-time", new_value) @property def replay(self) -> bool: return self._settings.get_boolean("replay") @property def autoscan(self) -> bool: return self._settings.get_boolean("autoscan") @property def prefer_external_cover(self) -> bool: return self._settings.get_boolean("prefer-external-cover") @prefer_external_cover.setter def prefer_external_cover(self, new_value: bool): self._settings.set_boolean("prefer-external-cover", new_value) @property def sleep_timer_fadeout(self) -> bool: return self._settings.get_boolean("sleep-timer-fadeout") @property def sleep_timer_fadeout_duration(self) -> int: return self._settings.get_int("sleep-timer-fadeout-duration") @property def timer(self) -> int: return self._settings.get_int("timer") @timer.setter def timer(self, new_value: int): self._settings.set_int("timer", new_value) @property def report_level(self) -> int: return self._settings.get_int("report-level") @report_level.setter def report_level(self, new_value: int): self._settings.set_int("report-level", new_value) @property def last_launched_version(self) -> str: return self._settings.get_string("last-launched-version") @last_launched_version.setter def last_launched_version(self, new_value: str): self._settings.set_string("last-launched-version", new_value) @property def rewind_duration(self) -> int: return self._settings.get_int("rewind-duration") @rewind_duration.setter def rewind_duration(self, new_value): self._settings.set_int("rewind-duration", new_value) @property def forward_duration(self) -> int: return self._settings.get_int("forward-duration") @forward_duration.setter def forward_duration(self, new_value): self._settings.set_int("forward-duration", new_value) @property def dark_mode(self) -> bool: return self._settings.get_boolean("dark-mode") @dark_mode.setter def dark_mode(self, new_value: bool): self._settings.set_boolean("dark-mode", new_value) @property def window_width(self) -> int: return self._settings.get_int("window-width") @window_width.setter def window_width(self, new_value: int): self._settings.set_int("window-width", new_value) @property def window_height(self) -> int: return self._settings.get_int("window-height") @window_height.setter def window_height(self, new_value: int): self._settings.set_int("window-height", new_value) @property def window_maximize(self) -> bool: return self._settings.get_boolean("window-maximize") @window_maximize.setter def window_maximize(self, new_value: bool): self._settings.set_boolean("window-maximize", new_value) cozy-1.3.0/cozy/architecture/000077500000000000000000000000001457036466300161635ustar00rootroot00000000000000cozy-1.3.0/cozy/architecture/__init__.py000066400000000000000000000000001457036466300202620ustar00rootroot00000000000000cozy-1.3.0/cozy/architecture/event_sender.py000066400000000000000000000013561457036466300212230ustar00rootroot00000000000000from typing import List, Callable import gi from gi.repository import GLib class EventSender: _listeners: List[Callable] def __init__(self): self._listeners = [] def emit_event(self, event, message=None): if isinstance(event, tuple) and message is None: event, message = event for function in self._listeners: function(event, message) def emit_event_main_thread(self, event: str, message=None): GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, self.emit_event, (event, message)) def add_listener(self, function: Callable[[str, object], None]): self._listeners.append(function) def destroy_listeners(self): self._listeners = [] cozy-1.3.0/cozy/architecture/observable.py000066400000000000000000000032461457036466300206660ustar00rootroot00000000000000from typing import Callable from gi.repository import GLib from cozy.report import reporter import logging log = logging.getLogger("observable") class Observable: def __init__(self): self._observers = {} def bind_to(self, prop: str, callback: Callable): if prop in self._observers: self._observers[prop].append(callback) else: self._observers[prop] = [callback] def remove_bind(self, prop: str, callback: Callable): if not prop: log.error("Cannot remove bind for empty prop.") reporter.error("observable", "Cannot remove bind for empty prop.") return if not callback: log.error("Cannot remove bind for empty callback.") reporter.error("observable", "Cannot remove bind for empty callback.") return if prop in self._observers: if callback in self._observers[prop]: self._observers[prop].remove(callback) else: log.info("Callback not found in prop's %s observers. Skipping remove bind...", prop) else: log.info("Prop not found in observers. Skipping remove bind...") def _notify(self, prop: str): if prop not in self._observers: return try: for callback in self._observers[prop]: callback() except Exception as e: log.error(e) reporter.exception("observable", e) def _notify_main_thread(self, prop: str): GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, self._notify, prop) def _destroy_observers(self): self._observers = {} cozy-1.3.0/cozy/architecture/profiler.py000066400000000000000000000005351457036466300203620ustar00rootroot00000000000000import time import logging import functools log = logging.getLogger("timing") def timing(f): @functools.wraps(f) def wrap(*args): time1 = time.perf_counter() ret = f(*args) time2 = time.perf_counter() log.info('%s function took %.3f ms', f.__name__, (time2-time1)*1000.0) return ret return wrapcozy-1.3.0/cozy/architecture/singleton.py000066400000000000000000000003661457036466300205440ustar00rootroot00000000000000class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] cozy-1.3.0/cozy/control/000077500000000000000000000000001457036466300151615ustar00rootroot00000000000000cozy-1.3.0/cozy/control/__init__.py000066400000000000000000000000001457036466300172600ustar00rootroot00000000000000cozy-1.3.0/cozy/control/application_directories.py000066400000000000000000000006001457036466300224260ustar00rootroot00000000000000import os from gi.repository import GLib def get_artwork_cache_dir(): return os.path.join(get_cache_dir(), "artwork") def get_cache_dir(): cache_dir = os.path.join(GLib.get_user_cache_dir(), "cozy") if not os.path.exists(cache_dir): os.makedirs(cache_dir) return cache_dir def get_data_dir(): return os.path.join(GLib.get_user_data_dir(), "cozy") cozy-1.3.0/cozy/control/artwork_cache.py000066400000000000000000000177141457036466300203610ustar00rootroot00000000000000import os import uuid import logging from gi.repository import Gdk, GdkPixbuf from cozy.application_settings import ApplicationSettings from cozy.control.application_directories import get_cache_dir from cozy.db.artwork_cache import ArtworkCache as ArtworkCacheModel from cozy.ext import inject from cozy.media.importer import Importer, ScanStatus from cozy.report import reporter log = logging.getLogger("artwork_cache") class ArtworkCache: def __init__(self): _importer = inject.instance(Importer) _importer.add_listener(self._on_importer_event) _app_settings = inject.instance(ApplicationSettings) _app_settings.add_listener(self._on_app_setting_changed) def get_cover_paintable(self, book, scale, size=0) -> Gdk.Texture | None: pixbuf = None size *= scale if size > 0: # First try the cache pixbuf = self._load_pixbuf_from_cache(book, size) if not pixbuf: # Then try the db or file pixbuf = self._load_cover_pixbuf(book) if not pixbuf: return None elif size > 0: # Resize and cache artwork if size is greater than 0 pixbuf = self._create_artwork_cache(book, pixbuf, size) return Gdk.Texture.new_for_pixbuf(pixbuf) def delete_artwork_cache(self): """ Deletes the artwork cache completely. """ cache_dir = os.path.join(get_cache_dir(), "artwork") import shutil if os.path.exists(cache_dir): shutil.rmtree(cache_dir) q = ArtworkCacheModel.delete() q.execute() def _on_importer_event(self, event, data): if event == "scan": if data == ScanStatus.STARTED: self.delete_artwork_cache() def _create_artwork_cache(self, book, pixbuf, size): """ Creates a resized cache version of the given pixbuf and saves it in the cozy cache folder under a unique identifier. :param book: Book which the artwork is from :param pixbuf: Pixbuf to be cached :param size: Size for the cached version :return: Resized pixbuf """ query = ArtworkCacheModel.select().where(ArtworkCacheModel.book == book.id) gen_uuid = "" if query.exists(): gen_uuid = str(query.first().uuid) else: gen_uuid = str(uuid.uuid4()) ArtworkCacheModel.create(book=book.id, uuid=gen_uuid) cache_dir = os.path.join(os.path.join(get_cache_dir(), "artwork"), gen_uuid) if not os.path.exists(cache_dir): os.makedirs(cache_dir) resized_pixbuf = self._resize_pixbuf(pixbuf, size) file_path = os.path.join(cache_dir, str(size) + ".jpg") if not os.path.exists(file_path): try: resized_pixbuf.savev(file_path, "jpeg", ["quality", None], ["95"]) except Exception as e: reporter.warning("artwork_cache", "Failed to save resized cache albumart") log.warning("Failed to save resized cache albumart for uuid %r: %s", gen_uuid, e) return resized_pixbuf def get_album_art_path(self, book, size): query = ArtworkCacheModel.select().where(ArtworkCacheModel.book == book.id) if query.exists(): try: uuid = query.first().uuid except Exception as e: reporter.error("artwork_cache", "load_pixbuf_from_cache: query exists but query.first().uuid crashed.") return None else: return None cache_dir = os.path.join(get_cache_dir(), "artwork") cache_dir = os.path.join(cache_dir, uuid) try: if os.path.exists(cache_dir): file_path = os.path.join(cache_dir, str(size) + ".jpg") if os.path.exists(file_path): return file_path else: return None except Exception as e: log.warning(e) return None return None def _load_pixbuf_from_cache(self, book, size): path = self.get_album_art_path(book, size) try: if path: pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) else: pixbuf = None except Exception as e: log.warning("Failed to load pixbuf from path: %s. Deleting file.", path) log.debug(e) os.remove(path) return None return pixbuf @inject.autoparams() def _load_cover_pixbuf(self, book, app_settings: ApplicationSettings): """ Load the cover from a given book and create a pixbuf object with a given from it. :param book: The book object :param size: The size of the bigger side in pixels :return: pixbuf object containing the cover """ pixbuf = None if app_settings.prefer_external_cover: pixbuf = self._load_pixbuf_from_file(book) if pixbuf is None: pixbuf = self._load_pixbuf_from_db(book) else: pixbuf = self._load_pixbuf_from_db(book) if pixbuf is None: pixbuf = self._load_pixbuf_from_file(book) return pixbuf def _load_pixbuf_from_db(self, book): pixbuf = None if book and book.cover: try: loader = GdkPixbuf.PixbufLoader.new() loader.write(book.cover) loader.close() pixbuf = loader.get_pixbuf() except Exception as e: reporter.warning("artwork_cache", "Could not get book cover from db.") log.warning("Could not get cover for book %r: %s", book.name, e) return pixbuf def _resize_pixbuf(self, pixbuf, size): """ Resizes an pixbuf and keeps the aspect ratio. :return: Resized pixbuf. """ resized_pixbuf = pixbuf if size > 0: if pixbuf.get_height() > pixbuf.get_width(): width = int(pixbuf.get_width() / (pixbuf.get_height() / size)) resized_pixbuf = pixbuf.scale_simple( width, size, GdkPixbuf.InterpType.BILINEAR) else: height = int(pixbuf.get_height() / (pixbuf.get_width() / size)) resized_pixbuf = pixbuf.scale_simple( size, height, GdkPixbuf.InterpType.BILINEAR) return resized_pixbuf def _load_pixbuf_from_file(self, book): """ Try to load the artwork from a book from image files. :param book: The book to load the artwork from. :return: Artwork as pixbuf object. """ pixbuf = None cover_files = [] try: directory = os.path.dirname(os.path.normpath(book.chapters[0].file)) cover_files = [f for f in os.listdir(directory) if f.lower().endswith('.png') or f.lower().endswith(".jpg") or f.lower().endswith(".gif")] except Exception as e: log.warning("Could not open audiobook directory and look for cover files: %s", e) for elem in (x for x in cover_files if os.path.splitext(x.lower())[0] == "cover"): # find cover.[jpg,png,gif] try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(directory, elem)) except Exception as e: log.debug(e) if pixbuf: break if pixbuf is None: # find other cover file (sort alphabet) cover_files.sort(key=str.lower) for elem in cover_files: try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(directory, elem)) except Exception as e: log.debug(e) if pixbuf: break return pixbuf def _on_app_setting_changed(self, event: str, data): if event == "prefer-external-cover": self.delete_artwork_cache() cozy-1.3.0/cozy/control/db.py000066400000000000000000000065331457036466300161270ustar00rootroot00000000000000import logging import time from cozy.control.db_updater import update_db from cozy.db.artwork_cache import ArtworkCache from cozy.db.book import Book from cozy.db.collation import collate_natural from cozy.db.file import File from cozy.db.model_base import get_sqlite_database from cozy.db.offline_cache import OfflineCache from cozy.db.settings import Settings from cozy.db.storage import Storage from cozy.db.storage_blacklist import StorageBlackList from cozy.db.track import Track from cozy.db.track_to_file import TrackToFile from cozy.report import reporter log = logging.getLogger("db") _db = get_sqlite_database() def init_db(): _connect_db(_db) sqlite_version = ".".join([str(num) for num in _db.server_version]) log.info("SQLite version: %s", sqlite_version) if Settings.table_exists(): update_db() _db.stop() _db.start() else: _db.create_tables( [Track, Book, Settings, ArtworkCache, Storage, StorageBlackList, OfflineCache, TrackToFile, File]) _db.stop() _db.start() while not _db.table_exists("settings"): time.sleep(0.01) _db.bind([Book, Track, Settings, ArtworkCache, StorageBlackList, OfflineCache, Storage, TrackToFile, File], bind_refs=False, bind_backrefs=False) _db.register_collation(collate_natural) if (Settings.select().count() == 0): Settings.create(path="", last_played_book=None) # TODO: Properly handle errors within the database # Remove this later. It prevents empty book objects in the database clean_books() def _connect_db(db): try: db.connect(reuse_if_open=True) except Exception as e: reporter.exception("db", e) log.error("Could not connect to database: %s", e) def books(): """ Find all books in the database :return: all books """ return Book.select() def get_tracks(book): """ Find all tracks that belong to a given book :param book: the book object :return: all tracks belonging to the book object """ return Track.select().join(Book).where(Book.id == book.id).order_by(Track.disk, Track.number, Track.name) def get_track_for_playback(book): """ Finds the current track to playback for a given book. :param book: book which the next track is required from :return: current track position from book db """ book = Book.select().where(Book.id == book.id).get() query = Track.select().where(Track.id == book.position) if book.position < 1: track_items = get_tracks(book) if len(track_items) > 0: track = get_tracks(book)[0] else: track = None elif query.exists(): track = query.get() else: track = None return track def clean_books(): """ Remove all books that have no tracks """ for book in Book.select(): if not get_track_for_playback(book): Book.update(position=0).where(Book.id == book.id).execute() if Track.select().where(Track.book == book).count() < 1: if Settings.get().last_played_book and Settings.get().last_played_book.id == book.id: Settings.update(last_played_book=None).execute() book.delete_instance() def get_db(): global _db return _db def close_db(): global _db log.info("Closing.") _db.close() cozy-1.3.0/cozy/control/db_updater.py000066400000000000000000000236771457036466300176630ustar00rootroot00000000000000import logging import os import shutil from datetime import datetime from typing import List from peewee import IntegerField, BooleanField, FloatField, ForeignKeyField, fn from playhouse.migrate import SqliteMigrator, migrate from playhouse.reflection import generate_models from cozy.control.application_directories import get_cache_dir from cozy.db.file import File from cozy.db.model_base import get_data_dir, get_sqlite_database from cozy.db.offline_cache import OfflineCache from cozy.db.settings import Settings from cozy.db.storage import Storage from cozy.db.storage_blacklist import StorageBlackList from cozy.db.track import Track from cozy.db.track_to_file import TrackToFile from cozy.report import reporter log = logging.getLogger("db_updater") def __update_db_1(db): migrator = SqliteMigrator(db) version = IntegerField(default=1) crc32 = BooleanField(default=False) migrate( migrator.add_column('settings', 'version', version), migrator.add_column('track', 'crc32', crc32), ) def __update_db_2(db): migrator = SqliteMigrator(db) playback_speed = FloatField(default=1.0) migrate( migrator.add_column('book', 'playback_speed', playback_speed), ) Settings.update(version=2).execute() def __update_db_3(db): current_path = Settings.get().path db.create_tables([Storage]) Storage.create(path=current_path, default=True) Settings.update(path="NOT_USED").execute() Settings.update(version=3).execute() def __update_db_4(db): migrator = SqliteMigrator(db) last_played = IntegerField(default=0) migrate( migrator.add_column('book', 'last_played', last_played), ) Settings.update(version=4).execute() def __update_db_5(db): db.create_tables([StorageBlackList]) Settings.update(version=5).execute() def __update_db_6(db): migrator = SqliteMigrator(db) db.create_tables([OfflineCache]) external = BooleanField(default=False) offline = BooleanField(default=False) downloaded = BooleanField(default=False) migrate( migrator.add_column('storage', 'external', external), migrator.add_column('book', 'offline', offline), migrator.add_column('book', 'downloaded', downloaded) ) Settings.update(version=6).execute() import shutil shutil.rmtree(get_cache_dir()) def __update_db_7(db): from cozy.control.artwork_cache import ArtworkCache artwork_cache = ArtworkCache() artwork_cache.delete_artwork_cache() Settings.update(version=7).execute() def __update_db_8(db): db.execute_sql('UPDATE track SET modified=0 WHERE crc32=1') migrator: SqliteMigrator = SqliteMigrator(db) migrate( migrator.drop_column("track", "crc32") ) Settings.update(version=8).execute() def _update_db_9(db): log.info("Migrating to DB Version 9...") models = generate_models(db) migrator: SqliteMigrator = SqliteMigrator(db) db.create_tables([File, TrackToFile]) db.stop() db.start() files: List[File] = [] track_to_files: List[TrackToFile] = [] file_id = 1 if "file" in models["track"]._meta.sorted_field_names: log.info("Generating File and TrackToFile objects...") for track in models["track"].select(): path = track.file file = next((f for f in files if f.path == path), None) if File.select().where(File.path == path).count() > 0: log.info("Path already existing in db: %s", path) file = File.select().where(File.path == path).get() elif not file: file = File(path=path, modified=track.modified, id=file_id) files.append(file) file_id += 1 if TrackToFile.select().join(Track).where(TrackToFile.track.id == track.id).count() > 0: log.info("TrackToFile already existing in db: %s", path) continue track_to_file = TrackToFile(track=track.id, file=file, start_at=0) track_to_files.append(track_to_file) log.info("Inserting File and TrackToFile objects...") File.bulk_create(files, batch_size=300) TrackToFile.bulk_create(track_to_files, batch_size=300) field = ForeignKeyField(File, null=True, field=File.id) if "cached_file" not in models["offlinecache"]._meta.sorted_field_names: log.info("Rename in OfflineCache: file to cached_file...") migrate( migrator.rename_column("offlinecache", "file", "cached_file"), ) if "original_file" not in models["offlinecache"]._meta.sorted_field_names: log.info("Add in OfflineCache: original_file_id...") migrate( migrator.add_column("offlinecache", "original_file_id", field) ) db.stop() db.start() models = generate_models(db) if "file" in models["track"]._meta.sorted_field_names: log.info("Migrating OfflineCache...") for cache in models["offlinecache"].select(): file_query = File.select().where(File.path == cache.track.file) if file_query.count() < 0: cache.delete_instance() file = file_query.get() cache.original_file = file cache.save(only=cache.dirty_fields) if "file" in models["track"]._meta.sorted_field_names: log.info("Drop in Track: file...") migrate( migrator.drop_column("track", "file") ) if "modified" in models["track"]._meta.sorted_field_names: log.info("Drop in Track: modified...") migrate( migrator.drop_column("track", "modified") ) if "track_id" in models["offlinecache"]._meta.sorted_field_names: log.info("Drop in OfflineCache: track_id...") migrate( migrator.drop_column("offlinecache", "track_id") ) migrate( migrator.add_not_null("offlinecache", "original_file_id") ) db.stop() db.start() log.info("Reset modified on all m4b files") File.update(modified=0).where(fn.Lower(File.path).endswith("m4b")).execute() db.stop() db.start() Settings.update(version=9).execute() def _update_db_10(db): log.info("Migrating to DB Version 10...") models = generate_models(db) migrator: SqliteMigrator = SqliteMigrator(db) if "track" in models["offlinecache"]._meta.sorted_field_names: log.info("Drop in OfflineCache: track_id...") migrate( migrator.drop_column("offlinecache", "track_id") ) db.stop() db.start() Settings.update(version=10).execute() def update_db(): db = get_sqlite_database() # First test for version 1 try: next(c for c in db.get_columns("settings") if c.name == "version") except Exception as e: if len(db.get_tables()) == 0: data_dir = get_data_dir() if os.path.exists(os.path.join(data_dir, "cozy.db")): os.remove(os.path.join(data_dir, "cozy.db")) os.remove(os.path.join(data_dir, "cozy.db-shm")) os.remove(os.path.join(data_dir, "cozy.db-wal")) __update_db_1(db) version = Settings.get().version # then for version 2 and so on if version < 2: __update_db_2(db) if version < 3: __update_db_3(db) if version < 4: __update_db_4(db) if version < 5: __update_db_5(db) if version < 6: __update_db_6(db) if version < 7: __update_db_7(db) if version < 8: __update_db_8(db) if version < 9: backup_dir_name = _backup_db(db) try: _update_db_9(db) except Exception as e: log.error(e) reporter.exception("db_updator", e) db.stop() _restore_db(backup_dir_name) from cozy.ui.db_migration_failed_view import DBMigrationFailedView DBMigrationFailedView().present() exit(1) if version < 10: backup_dir_name = _backup_db(db) try: _update_db_10(db) except Exception as e: log.error(e) reporter.exception("db_updator", e) db.stop() _restore_db(backup_dir_name) from cozy.ui.db_migration_failed_view import DBMigrationFailedView DBMigrationFailedView().present() exit(1) def _backup_db(db) -> str: log.info("Backing up DB...") db.stop() now = datetime.now() dt_string = now.strftime("%Y-%m-%d %H-%M-%S") backup_dir = os.path.join(get_data_dir(), dt_string) if os.path.exists(backup_dir): backup_dir += "-1" os.makedirs(backup_dir, exist_ok=True) db_path = os.path.join(get_data_dir(), "cozy.db") shm_path = os.path.join(get_data_dir(), "cozy.db-shm") wal_path = os.path.join(get_data_dir(), "cozy.db-wal") if os.path.exists(db_path): shutil.copyfile(db_path, os.path.join(backup_dir, "cozy.db")) if os.path.exists(shm_path): shutil.copyfile(shm_path, os.path.join(backup_dir, "cozy.db-shm")) if os.path.exists(wal_path): shutil.copyfile(wal_path, os.path.join(backup_dir, "cozy.db-wal")) db.start() return dt_string def _restore_db(backup_dir_name: str): log.info("Restoring DB...") backup_dir = os.path.join(get_data_dir(), backup_dir_name) db_path = os.path.join(get_data_dir(), "cozy.db") shm_path = os.path.join(get_data_dir(), "cozy.db-shm") wal_path = os.path.join(get_data_dir(), "cozy.db-wal") db_path_backup = os.path.join(backup_dir, "cozy.db") shm_path_backup = os.path.join(backup_dir, "cozy.db-shm") wal_path_backup = os.path.join(backup_dir, "cozy.db-wal") if os.path.exists(db_path_backup): log.info("Copying db file") shutil.copyfile(db_path_backup, db_path) if os.path.exists(shm_path_backup): log.info("Copying shm file") shutil.copyfile(shm_path_backup, shm_path) if os.path.exists(wal_path_backup): log.info("Copying wal file") shutil.copyfile(wal_path_backup, wal_path) cozy-1.3.0/cozy/control/filesystem_monitor.py000066400000000000000000000127071457036466300214750ustar00rootroot00000000000000import logging from typing import List import cozy.ext.inject as inject from gi.repository import Gio from cozy.architecture.event_sender import EventSender from cozy.model.book import Book from cozy.model.settings import Settings from cozy.model.storage import Storage from cozy.report import reporter log = logging.getLogger("fs_monitor") class StorageNotFound(Exception): pass class ExternalStorage: storage: Storage online: bool def __init__(self, storage: Storage, online: bool): self.storage = storage self.online = online class FilesystemMonitor(EventSender): external_storage: List[ExternalStorage] = [] _settings: Settings = inject.attr(Settings) def __init__(self): super().__init__() self.volume_monitor: Gio.VolumeMonitor = Gio.VolumeMonitor.get() self.volume_monitor.connect("mount-added", self.__on_mount_added) self.volume_monitor.connect("mount-removed", self.__on_mount_removed) self.init_offline_mode() from cozy.view_model.settings_view_model import SettingsViewModel self._settings_view_model = inject.instance(SettingsViewModel) self._settings_view_model.add_listener(self.__on_settings_changed) def init_offline_mode(self): external_storage = [] mounts = self.volume_monitor.get_mounts() # go through all audiobook locations and test if they can be found in the mounts list for storage in self._settings.external_storage_locations: online = any( mount.get_root().get_path() and mount.get_root().get_path() in storage.path for mount in mounts ) self.external_storage.append(ExternalStorage(storage=storage, online=online)) def close(self): """ Free all references. """ # self.volume_monitor.unref() pass def get_book_online(self, book: Book): try: return next( (storage.online for storage in self.external_storage if storage.storage.path in book.chapters[0].file), True) except IndexError: return True def is_track_online(self, track): return next((storage.online for storage in self.external_storage if storage.storage.path in track.file), True) def get_offline_storages(self): return [i.storage.path for i in self.external_storage if not i.online] def is_storage_online(self, storage: Storage) -> bool: storage = next((storage for storage in self.external_storage if storage.storage == storage), None) if not storage: raise StorageNotFound return storage.online def is_external(self, directory: str) -> bool: mounts: List[Gio.Mount] = self.volume_monitor.get_mounts() for mount in mounts: root = mount.get_root() if not root: log.error("Failed to test for external drive. Mountpoint has no root object.") reporter.error("fs_monitor", "Failed to test for external drive. Mountpoint has no root object.") return False path = root.get_path() if not path: log.error("Failed to test for external drive. Root object has no path.") reporter.error("fs_monitor", "Failed to test for external drive. Root object has no path.") return False if path in directory and mount.can_unmount(): log.info("Storage location %s is external", directory) return True log.info("Storage location %s is not external", directory) return False def __on_mount_added(self, monitor, mount): """ A volume was mounted. Disable offline mode for this volume. """ mount_path = mount.get_root().get_path() if not mount_path: log.warning("Mount added but no mount_path is present. Skipping...") return log.debug("Volume mounted: %s", mount_path) storage = next((s for s in self.external_storage if mount_path in s.storage.path), None) if storage: log.info("Storage online: %s", mount_path) storage.online = True self.emit_event("storage-online", storage.storage.path) def __on_mount_removed(self, monitor, mount): """ A volume was unmounted. Enable offline mode for this volume. """ mount_path = mount.get_root().get_path() if not mount_path: log.warning("Mount removed but no mount_path is present. Skipping...") return log.debug("Volume unmounted: %s", mount_path) storage = next((s for s in self.external_storage if mount_path in s.storage.path), None) if storage: log.info("Storage offline: %s", mount_path) storage.online = False self.emit_event("storage-offline", storage.storage.path) # switch to offline version if currently playing def __on_settings_changed(self, event, message): """ This method reacts to storage settings changes. """ if event == "external-storage-added" or event == "storage-changed" or ( event == "storage-added" and message != ""): self.init_offline_mode() elif event == "storage-removed" or event == "external-storage-removed": self.external_storage = [item for item in self.external_storage if item.storage.path not in message.path] cozy-1.3.0/cozy/control/mpris.py000066400000000000000000000343751457036466300167010ustar00rootroot00000000000000# Forked from https://github.com/gnumdk/lollypop/blob/master/lollypop/mpris.py # copyright (c) 2014-2017 Cedric Bellegarde # copyright (c) 2016 Gaurav Narula # copyright (c) 2016 Felipe Borges # copyright (c) 2013 Arnel A. Borja # copyright (c) 2013 Vadim Rutkovsky # copyright (c) 2017 Julian Geywitz # copyright (c) 2023 Benedek Dévényi import logging import re import time from dataclasses import dataclass from gi.repository import Gio, GLib from cozy.application_settings import ApplicationSettings from cozy.control.artwork_cache import ArtworkCache from cozy.ext import inject from cozy.media.player import NS_TO_SEC, US_TO_SEC, Player from cozy.model.book import Book from cozy.report import reporter log = logging.getLogger("mpris") CamelCasePattern = re.compile(r"(? str: return CamelCasePattern.sub("_", name).lower() @dataclass(kw_only=True, frozen=True, slots=True) class Metadata: track_id: str track_number: int title: str album: str artist: list[str] length: int url: str artwork_uri: str def to_dict(self) -> dict[str, GLib.Variant]: data = {} data["mpris:trackid"] = GLib.Variant("o", self.track_id) data["xesam:trackNumber"] = GLib.Variant("i", self.track_number) data["xesam:title"] = GLib.Variant("s", self.title) data["xesam:album"] = GLib.Variant("s", self.album) data["xesam:artist"] = GLib.Variant("as", self.artist) data["mpris:length"] = GLib.Variant("x", self.length) data["xesam:url"] = GLib.Variant("s", self.url) if self.artwork_uri: data["mpris:artUrl"] = GLib.Variant("s", "file://" + self.artwork_uri) return data @staticmethod def no_track() -> dict[str, GLib.Variant]: no_track_path = GLib.Variant("o", "/org/mpris/MediaPlayer2/TrackList/NoTrack") return {"mpris:trackid": no_track_path} class Server: def __init__(self, connection: Gio.DBusConnection, path: str) -> None: self.method_outargs = {} self.method_inargs = {} for interface in Gio.DBusNodeInfo.new_for_xml(self.__doc__).interfaces: for method in interface.methods: self.method_inargs[method.name] = tuple( arg.signature for arg in method.in_args ) out_sig = [arg.signature for arg in method.out_args] self.method_outargs[method.name] = "(" + "".join(out_sig) + ")" try: connection.register_object( object_path=path, interface_info=interface, method_call_closure=self.on_method_call, ) except Exception: log.error("MPRIS is already connected from another Cozy process.") def on_method_call( self, connection: Gio.DBusConnection, sender: str, object_path: str, interface_name: str, method_name: str, parameters: GLib.Variant, invocation: Gio.DBusMethodInvocation, ) -> None: args = list(parameters.unpack()) for i, sig in enumerate(self.method_inargs[method_name]): if sig == "h": msg = invocation.get_message() fd_list = msg.get_unix_fd_list() args[i] = fd_list.get(args[i]) snake_method = to_snake_case(method_name) try: result = getattr(self, snake_method)(*args) except AttributeError: invocation.return_dbus_error( f"{interface_name}.Error.NotSupported", "Unsupported property" ) except Exception as e: log.error(e) reporter.exception("mpris", e) reporter.error( "mpris", f"MPRIS method call failed with method name: {method_name}", ) invocation.return_dbus_error( f"{interface_name}.Error.Failed", "Internal exception occurred" ) else: # out_args is at least (signature1). # We therefore always wrap the result as a tuple. # Reference: # https://bugzilla.gnome.org/show_bug.cgi?id=765603 result = (result,) out_args = self.method_outargs[method_name] if out_args != "()" and result[0]: variant = GLib.Variant(out_args, result) invocation.return_value(variant) else: invocation.return_value(None) class MPRIS(Server): """ """ MEDIA_PLAYER2_INTERFACE = "org.mpris.MediaPlayer2" MEDIA_PLAYER2_PLAYER_INTERFACE = "org.mpris.MediaPlayer2.Player" _player: Player = inject.attr(Player) _artwork_cache: ArtworkCache = inject.attr(ArtworkCache) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self, app) -> None: self._bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) Gio.bus_own_name_on_connection( self._bus, "org.mpris.MediaPlayer2.Cozy", Gio.BusNameOwnerFlags.NONE, None, None, ) super().__init__(self._bus, "/org/mpris/MediaPlayer2") self._application = app self._metadata = self._get_new_metadata() self._player.add_listener(self._on_player_changed) self._app_settings.add_listener(self._on_app_setting_changed) def introspect(self): return self.__doc__ def quit(self): self._application.quit() def next(self): self._player.forward() def previous(self): self._player.rewind() def play(self): self._player.play_pause() def pause(self): self._player.pause() def play_pause(self): self._player.play_pause() def stop(self): self._player.destroy() def set_position(self, track_id: str, position: int): self._player.position = position / US_TO_SEC def seek(self, offset: int): self._player.position = self._player.position / NS_TO_SEC + offset / US_TO_SEC def get(self, interface: str, property_name: str) -> GLib.Variant: if property_name in {"CanQuit", "CanControl"}: return GLib.Variant("b", True) elif property_name in {"CanRaise", "HasTrackList"}: return GLib.Variant("b", False) elif property_name in { "CanGoNext", "CanGoPrevious", "CanPlay", "CanPause", "CanSeek", }: return GLib.Variant("b", self._player.loaded_book is not None) elif property_name in {"SupportedUriSchemes", "SupportedMimeTypes"}: return GLib.Variant("as", []) # Might raise an AttributeError. We handle that in Server.on_method_call return getattr(self, to_snake_case(property_name)) def get_all(self, interface): if interface == self.MEDIA_PLAYER2_INTERFACE: properties = ( "CanQuit", "CanRaise", "HasTrackList", "Identity", "DesktopEntry", "SupportedUriSchemes", "SupportedMimeTypes", ) elif interface == self.MEDIA_PLAYER2_PLAYER_INTERFACE: properties = ( "PlaybackStatus", "Metadata", "Position", "CanGoNext", "CanGoPrevious", "CanPlay", "CanPause", "CanSeek", "CanControl", "Volume", ) return {property: self.get(interface, property) for property in properties} def properties_changed(self, iface_name, changed_props, invalidated_props): self._bus.emit_signal( None, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "PropertiesChanged", GLib.Variant.new_tuple( GLib.Variant("s", iface_name), GLib.Variant("a{sv}", changed_props), GLib.Variant("as", invalidated_props), ), ) @property def desktop_entry(self): return GLib.Variant("s", "com.github.geigi.cozy") @property def identity(self): return GLib.Variant("s", "Cozy") @property def playback_status(self): if self._player.playing: return GLib.Variant("s", "Playing") elif not self._player.loaded_book: return GLib.Variant("s", "Stopped") else: return GLib.Variant("s", "Paused") @property def metadata(self): return GLib.Variant("a{sv}", self._metadata) @property def position(self): return GLib.Variant("x", round(self._player.position / 1e3)) @property def volume(self): return GLib.Variant("d", self._player.volume) def _get_track_id(self) -> float: """ Track IDs must be unique even up to the point that if a song is repeated in a playlist it must have a different TrackId. """ return time.time() * 1e10 % 1e10 def _get_new_metadata(self, book: Book | None = None) -> dict[str, GLib.Variant]: if book is None: return Metadata.no_track() track_path_template = "/com/github/geigi/cozy/TrackId/{id:.0f}" uri_template = "file://{path}" metadata = Metadata( track_id=track_path_template.format(id=self._get_track_id()), track_number=book.current_chapter.number, title=book.current_chapter.name, album=book.name, artist=[book.author], length=book.current_chapter.length * US_TO_SEC, url=uri_template.format(path=book.current_chapter.file), artwork_uri=self._artwork_cache.get_album_art_path(book, 256), ) return metadata.to_dict() def _on_player_changed(self, event: str, _) -> None: if event == "chapter-changed": self._on_current_changed() elif event == "play": self._on_status_changed("Playing") elif event == "pause": self._on_status_changed("Paused") elif event == "stop": self._on_status_changed("Stopped") def _on_app_setting_changed(self, event: str, _): if event == "swap-author-reader": self._on_current_changed() def _on_current_changed(self) -> None: if not self._player.loaded_book: return self._metadata = self._get_new_metadata(self._player.loaded_book) properties = { "Metadata": GLib.Variant("a{sv}", self._metadata), "CanPlay": GLib.Variant("b", True), "CanPause": GLib.Variant("b", True), "CanGoNext": GLib.Variant("b", True), "CanGoPrevious": GLib.Variant("b", True), } self.properties_changed(self.MEDIA_PLAYER2_PLAYER_INTERFACE, properties, []) def _on_status_changed(self, status: str) -> None: properties = {"PlaybackStatus": GLib.Variant("s", status)} self.properties_changed(self.MEDIA_PLAYER2_PLAYER_INTERFACE, properties, []) cozy-1.3.0/cozy/control/offline_cache.py000066400000000000000000000244031457036466300203030ustar00rootroot00000000000000import logging import uuid import os from cozy.architecture.event_sender import EventSender from cozy.control.application_directories import get_cache_dir import cozy.tools as tools import cozy.ui from gi.repository import Gio from cozy.db.file import File from cozy.db.offline_cache import OfflineCache as OfflineCacheModel from cozy.db.track_to_file import TrackToFile from cozy.ext import inject from cozy.model.book import Book from cozy.model.chapter import Chapter from cozy.report import reporter from cozy.view_model.settings_view_model import SettingsViewModel log = logging.getLogger("offline_cache") class OfflineCache(EventSender): """ This class is responsible for all actions on the offline cache. This includes operations like copying to the cache and adding or removing files from the cache. """ queue = [] total_batch_count = 0 current_batch_count = 0 current = None thread = None filecopy_cancel = None last_ui_update = 0 current_book_processing = None def __init__(self): super().__init__() from cozy.media.importer import Importer self._importer = inject.instance(Importer) from cozy.model.library import Library self._library = inject.instance(Library) self._importer.add_listener(self._on_importer_event) self.cache_dir = os.path.join(get_cache_dir(), "offline") if not os.path.exists(self.cache_dir): os.makedirs(self.cache_dir) self._start_processing() inject.instance(SettingsViewModel).add_listener(self.__on_settings_changed) def add(self, book: Book): """ Add all tracks of a book to the offline cache and start copying. """ files_to_cache = [] file_ids = {chapter.file_id for chapter in book.chapters} for file_id in file_ids: cached_file_name = str(uuid.uuid4()) files_to_cache.append((file_id, cached_file_name)) chunks = [files_to_cache[x:x + 500] for x in range(0, len(files_to_cache), 500)] for chunk in chunks: query = OfflineCacheModel.insert_many(chunk, fields=[OfflineCacheModel.original_file, OfflineCacheModel.cached_file]) self.total_batch_count += len(chunk) query.execute() self._start_processing() def remove(self, book: Book): """ Remove all tracks of the given book from the cache. """ self._stop_processing() ids = {t.file_id for t in book.chapters} offline_elements = OfflineCacheModel.select().join(File).where(OfflineCacheModel.original_file.id << ids) for element in offline_elements: file_path = os.path.join(self.cache_dir, element.cached_file) if file_path == self.cache_dir: continue file = Gio.File.new_for_path(file_path) if file.query_exists(): file.delete() for item in self.queue: if self.current and item.id == self.current.id: self.filecopy_cancel.cancel() entries_to_delete = OfflineCacheModel.select().join(File).where(OfflineCacheModel.original_file.id << ids) ids_to_delete = [t.id for t in entries_to_delete] OfflineCacheModel.delete().where(OfflineCacheModel.id << ids_to_delete).execute() book.downloaded = False self.emit_event("book-offline-removed", book) self.queue = [] self._start_processing() def remove_all_for_storage(self, storage): for element in OfflineCacheModel.select().join(File).where( storage.path in OfflineCacheModel.original_file.path): file_path = os.path.join(self.cache_dir, element.cached_file) if file_path == self.cache_dir: continue file = Gio.File.new_for_path(file_path) if file.query_exists(): file.delete() OfflineCacheModel.delete().where(storage.path in OfflineCacheModel.original_file.path).execute() def get_cached_path(self, chapter: Chapter): query = OfflineCacheModel.select().where(OfflineCacheModel.original_file == chapter.file_id, OfflineCacheModel.copied == True) if query.count() > 0: return os.path.join(self.cache_dir, query.get().cached_file) else: return None def update_cache(self, paths): """ Update the cached version of the given files. """ if OfflineCacheModel.select().count() > 0: OfflineCacheModel.update(copied=False).where( OfflineCacheModel.original_file.path in paths).execute() self._fill_queue_from_db() def delete_cache(self): """ Deletes the entire offline cache files. Doesn't delete anything from the cozy.db. """ cache_dir = os.path.join(get_cache_dir(), "offline") import shutil shutil.rmtree(cache_dir) def _stop_processing(self): """ """ if not self._is_processing() or not self.thread: return self.filecopy_cancel.cancel() self.thread.stop() def _start_processing(self): """ """ if self._is_processing(): return self.thread = tools.StoppableThread(target=self._process_queue) self.thread.start() def _process_queue(self): log.info("Started processing offline cache queue") self.filecopy_cancel = Gio.Cancellable() self._fill_queue_from_db() self.total_batch_count = len(self.queue) self.current_batch_count = 0 if len(self.queue) > 0: self.current_book_processing = self._get_book_to_file(self.queue[0].original_file).id self.emit_event_main_thread("start") while len(self.queue) > 0: self.current_batch_count += 1 item = self.queue[0] if self.thread.stopped(): break log.info("Processing item: %r", item) query = OfflineCacheModel.select().where(OfflineCacheModel.id == item.id) if not query.exists(): continue new_item = OfflineCacheModel.get(OfflineCacheModel.id == item.id) book = self._get_book_to_file(new_item.original_file) if self.current_book_processing != book.id: self._update_book_download_status(self.current_book_processing) self.current_book_processing = book.id if not new_item.copied and os.path.exists(new_item.original_file.path): log.info("Copying item: %r", new_item) self.emit_event_main_thread("message", _("Copying") + " " + tools.shorten_string(book.name, 30)) self.current = new_item destination = Gio.File.new_for_path(os.path.join(self.cache_dir, new_item.cached_file)) source = Gio.File.new_for_path(new_item.original_file.path) flags = Gio.FileCopyFlags.OVERWRITE try: copied = source.copy(destination, flags, self.filecopy_cancel, self.__update_copy_status, None) except Exception as e: if e.code == Gio.IOErrorEnum.CANCELLED: log.info("Download of book was cancelled.") self.thread.stop() break reporter.exception("offline_cache", e) log.error("Could not copy file %r to offline cache: %s", new_item.original_file.path, e) self.queue.remove(item) continue if copied: OfflineCacheModel.update(copied=True).where( OfflineCacheModel.id == new_item.id).execute() self.queue.remove(item) if self.current_book_processing: self._update_book_download_status(self.current_book_processing) self.current = None self.emit_event_main_thread("finished") def _get_book_to_file(self, file: File): track_to_file = TrackToFile.select().join(File).where(TrackToFile.file == file.id).get() return track_to_file.track.book def _update_book_download_status(self, book_id): book = next(book for book in self._library.books if book.id == book_id) downloaded = self._is_book_downloaded(book) book.downloaded = downloaded if downloaded: self.emit_event("book-offline", book) else: self.emit_event("book-offline-removed", book) def _is_book_downloaded(self, book: Book): file_ids = [chapter.file_id for chapter in book.chapters] offline_files = OfflineCacheModel.select().where(OfflineCacheModel.original_file << file_ids) offline_file_ids = [file.original_file.id for file in offline_files] for chapter in book.chapters: if chapter.file_id not in offline_file_ids: return False return True def _is_processing(self): """ """ if self.thread: return self.thread.is_alive() else: return False def _fill_queue_from_db(self): for item in OfflineCacheModel.select().where(OfflineCacheModel.copied == False): if not any(item.id == queued.id for queued in self.queue): self.queue.append(item) self.total_batch_count += 1 def _on_importer_event(self, event: str, message): if event == "new-or-updated-files": self.update_cache(message) self._start_processing() def __update_copy_status(self, current_num_bytes, total_num_bytes, _): total_batch_count = max(self.total_batch_count, 1) finished_files_progress = (self.current_batch_count - 1) / total_batch_count current_file_progress = current_num_bytes / max(total_num_bytes, 1) progress = finished_files_progress + (current_file_progress / total_batch_count) self.emit_event_main_thread("progress", min(progress, 1)) def __on_settings_changed(self, event, message): if event == "storage-removed" or event == "external-storage-removed": self.remove_all_for_storage(message) cozy-1.3.0/cozy/control/string_representation.py000066400000000000000000000012311457036466300221600ustar00rootroot00000000000000def seconds_to_str(seconds, max_length=None, include_seconds=True): """ Converts seconds to a string with the following apperance: hh:mm:ss :param seconds: The seconds as float """ m, s = divmod(seconds, 60) h, m = divmod(m, 60) if max_length: max_m, max_s = divmod(max_length, 60) max_h, max_m = divmod(max_m, 60) else: max_h = h max_m = m max_s = s if (max_h >= 10): result = "%02d:%02d" % (h, m) elif (max_h >= 1): result = "%d:%02d" % (h, m) else: result = "%02d" % (m) if include_seconds: result += ":%02d" % (s) return result cozy-1.3.0/cozy/db/000077500000000000000000000000001457036466300140665ustar00rootroot00000000000000cozy-1.3.0/cozy/db/__init__.py000066400000000000000000000000001457036466300161650ustar00rootroot00000000000000cozy-1.3.0/cozy/db/artwork_cache.py000066400000000000000000000003171457036466300172550ustar00rootroot00000000000000from peewee import ForeignKeyField, CharField from cozy.db.book import Book from cozy.db.model_base import ModelBase class ArtworkCache(ModelBase): book = ForeignKeyField(Book) uuid = CharField() cozy-1.3.0/cozy/db/book.py000066400000000000000000000007441457036466300153770ustar00rootroot00000000000000from cozy.db.model_base import ModelBase from peewee import CharField, IntegerField, BlobField, FloatField, BooleanField class Book(ModelBase): name = CharField() author = CharField() reader = CharField() position = IntegerField() rating = IntegerField() cover = BlobField(null=True) playback_speed = FloatField(default=1.0) last_played = IntegerField(default=0) offline = BooleanField(default=False) downloaded = BooleanField(default=False) cozy-1.3.0/cozy/db/collation.py000066400000000000000000000005341457036466300164260ustar00rootroot00000000000000import re def collate_natural(s1, s2): if s1 == s2: return 0 convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] list = sorted([s1, s2], key=alphanum_key) if list.index(s1) == 0: return -1 else: return 1 cozy-1.3.0/cozy/db/file.py000066400000000000000000000002561457036466300153620ustar00rootroot00000000000000from peewee import CharField, IntegerField from cozy.db.model_base import ModelBase class File(ModelBase): path = CharField(unique=True) modified = IntegerField() cozy-1.3.0/cozy/db/model_base.py000066400000000000000000000014231457036466300165320ustar00rootroot00000000000000import logging import os from peewee import Model from playhouse.sqliteq import SqliteQueueDatabase from cozy.control.application_directories import get_data_dir log = logging.getLogger("db") _db = None def get_sqlite_database(): global _db return _db def database_file_exists(): return os.path.exists(os.path.join(get_data_dir(), "cozy.db")) def __open_database(): global _db if not os.path.exists(get_data_dir()): os.makedirs(get_data_dir()) _db = SqliteQueueDatabase(os.path.join(get_data_dir(), "cozy.db"), queue_max_size=128, results_timeout=15.0, timeout=15.0, pragmas=[('cache_size', -1024 * 32), ('journal_mode', 'wal')]) __open_database() class ModelBase(Model): class Meta: database = _db cozy-1.3.0/cozy/db/offline_cache.py000066400000000000000000000004431457036466300172060ustar00rootroot00000000000000from peewee import ForeignKeyField, BooleanField, CharField from cozy.db.model_base import ModelBase from cozy.db.file import File class OfflineCache(ModelBase): original_file = ForeignKeyField(File, unique=True) copied = BooleanField(default=False) cached_file = CharField() cozy-1.3.0/cozy/db/settings.py000066400000000000000000000005531457036466300163030ustar00rootroot00000000000000from peewee import CharField, BooleanField, ForeignKeyField, IntegerField from cozy.db.model_base import ModelBase from cozy.db.book import Book DB_VERSION = 10 class Settings(ModelBase): path = CharField() first_start = BooleanField(default=True) last_played_book = ForeignKeyField(Book, null=True) version = IntegerField(default=DB_VERSION) cozy-1.3.0/cozy/db/storage.py000066400000000000000000000004271457036466300161070ustar00rootroot00000000000000from peewee import CharField, IntegerField, BooleanField from cozy.db.model_base import ModelBase class Storage(ModelBase): path = CharField() location_type = IntegerField(default=0) default = BooleanField(default=False) external = BooleanField(default=False) cozy-1.3.0/cozy/db/storage_blacklist.py000066400000000000000000000002031457036466300201270ustar00rootroot00000000000000from peewee import CharField from cozy.db.model_base import ModelBase class StorageBlackList(ModelBase): path = CharField() cozy-1.3.0/cozy/db/track.py000066400000000000000000000005201457036466300155410ustar00rootroot00000000000000from peewee import CharField, IntegerField, ForeignKeyField, FloatField from cozy.db.model_base import ModelBase from cozy.db.book import Book class Track(ModelBase): name = CharField() number = IntegerField() disk = IntegerField() position = IntegerField() book = ForeignKeyField(Book) length = FloatField() cozy-1.3.0/cozy/db/track_to_file.py000066400000000000000000000005171457036466300172500ustar00rootroot00000000000000from peewee import ForeignKeyField, IntegerField from cozy.db.file import File from cozy.db.model_base import ModelBase from cozy.db.track import Track class TrackToFile(ModelBase): track = ForeignKeyField(Track, unique=True, backref='track_to_file') file = ForeignKeyField(File, unique=False) start_at = IntegerField() cozy-1.3.0/cozy/ext/000077500000000000000000000000001457036466300143015ustar00rootroot00000000000000cozy-1.3.0/cozy/ext/__init__.py000066400000000000000000000000001457036466300164000ustar00rootroot00000000000000cozy-1.3.0/cozy/ext/inject/000077500000000000000000000000001457036466300155555ustar00rootroot00000000000000cozy-1.3.0/cozy/ext/inject/LICENCE000066400000000000000000000261361457036466300165520ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. cozy-1.3.0/cozy/ext/inject/__init__.py000066400000000000000000000376231457036466300177010ustar00rootroot00000000000000""" Python dependency injection framework. Usage: - Create an optional configuration:: def my_config(binder): binder.bind(Cache, RedisCache('localhost:1234')) binder.bind_to_provider(CurrentUser, get_current_user) - Create a shared injector:: inject.configure(my_config) - Use `inject.instance`, `inject.attr` or `inject.param` to inject dependencies:: class User(object): cache = inject.attr(Cache) @classmethod def load(cls, id): return cls.cache.load('user', id) def save(self): self.cache.save(self) def foo(bar): cache = inject.instance(Cache) cache.save('bar', bar) @inject.params(cache=Cache) def bar(foo, cache=None): cache.save('foo', foo) Binding types: - Instance bindings configured via `bind(cls, instance) which always return the same instance. - Constructor bindings `bind_to_constructor(cls, callable)` which create a singleton on first access. - Provider bindings `bind_to_provider(cls, callable)` which call the provider for each injection. - Runtime bindings which automatically create class singletons. Thread-safety: After configuration the injector is thread-safe and can be safely reused by multiple threads. Unit testing: In tests use `inject.clear_and_configure(callable)` to create a new injector on setup, and `inject.clear()` to clean-up on tear down. Runtime bindings greatly reduce the required configuration by automatically creating singletons on first access. For example, below only the Config class requires binding configuration, all other classes are runtime bindings:: class Cache(object): config = inject.attr(Config) def __init__(self): self._redis = connect(self.config.redis_address) class Db(object): pass class UserRepo(object): cache = inject.attr(Cache) db = inject.attr(Db) def load(self, user_id): return cache.load('user', user_id) or db.load('user', user_id) class Config(object): def __init__(self, redis_address): self.redis_address = redis_address def my_config(binder): binder.bind(Config, load_config_file()) inject.configure(my_config) """ __version__ = '4.3.1' __author__ = 'Ivan Korobkov ' __license__ = 'Apache License 2.0' __url__ = 'https://github.com/ivan-korobkov/python-inject' import inspect import logging import sys import threading import types from functools import wraps from typing import (Any, Awaitable, Callable, Dict, Generic, Hashable, Optional, Type, TypeVar, Union, cast, get_type_hints, overload) _NEW_TYPING = sys.version_info[:3] >= (3, 7, 0) # PEP 560 _RETURN = 'return' if _NEW_TYPING: from typing import ForwardRef, _GenericAlias else: from typing import _Union logger = logging.getLogger('inject') _INJECTOR = None # Shared injector instance. _INJECTOR_LOCK = threading.RLock() # Guards injector initialization. _BINDING_LOCK = threading.RLock() # Guards runtime bindings. Injectable = Union[object, Any] T = TypeVar('T', bound=Injectable) Binding = Union[Type[Injectable], Hashable] Constructor = Callable[[], Injectable] Provider = Constructor BinderCallable = Callable[['Binder'], None] class ConstructorTypeError(TypeError): def __init__(self, constructor: Callable, previous_error: TypeError): super(ConstructorTypeError, self).__init__("%s raised an error: %s" % (constructor, previous_error)) class Binder(object): _bindings: Dict[Binding, Constructor] def __init__(self) -> None: self._bindings = {} def install(self, config: BinderCallable) -> 'Binder': """Install another callable configuration.""" config(self) return self def bind(self, cls: Binding, instance: T) -> 'Binder': """Bind a class to an instance.""" self._check_class(cls) b = lambda: instance self._bindings[cls] = b self._maybe_bind_forward(cls, b) logger.debug('Bound %s to an instance %s', cls, instance) return self def bind_to_constructor(self, cls: Binding, constructor: Constructor) -> 'Binder': """Bind a class to a callable singleton constructor.""" self._check_class(cls) if constructor is None: raise InjectorException('Constructor cannot be None, key=%s' % cls) b = _ConstructorBinding(constructor) self._bindings[cls] = b self._maybe_bind_forward(cls, b) logger.debug('Bound %s to a constructor %s', cls, constructor) return self def bind_to_provider(self, cls: Binding, provider: Provider) -> 'Binder': """Bind a class to a callable instance provider executed for each injection.""" self._check_class(cls) if provider is None: raise InjectorException('Provider cannot be None, key=%s' % cls) b = provider self._bindings[cls] = b self._maybe_bind_forward(cls, b) logger.debug('Bound %s to a provider %s', cls, provider) return self def _check_class(self, cls: Binding) -> None: if cls is None: raise InjectorException('Binding key cannot be None') if cls in self._bindings: raise InjectorException('Duplicate binding, key=%s' % cls) if self._is_forward_str(cls): ref = ForwardRef(cls) if ref in self._bindings: raise InjectorException('Duplicate forward binding, i.e. "int" and int, key=%s', cls) def _maybe_bind_forward(self, cls: Binding, binding: Any) -> None: """Bind a string forward reference.""" if not _NEW_TYPING: return if not isinstance(cls, str): return ref = ForwardRef(cls) self._bindings[ref] = binding logger.debug('Bound forward ref "%s"', cls) def _is_forward_str(self, cls: Binding) -> bool: return _NEW_TYPING and isinstance(cls, str) class Injector(object): _bindings: Dict[Binding, Constructor] def __init__(self, config: Optional[BinderCallable] = None, bind_in_runtime: bool = True): self._bind_in_runtime = bind_in_runtime if config: binder = Binder() config(binder) self._bindings = binder._bindings else: self._bindings = {} @overload def get_instance(self, cls: Type[T]) -> T: ... @overload def get_instance(self, cls: Hashable) -> Injectable: ... def get_instance(self, cls: Binding) -> Injectable: """Return an instance for a class.""" binding = self._bindings.get(cls) if binding: return binding() # Try to create a runtime binding. with _BINDING_LOCK: binding = self._bindings.get(cls) if binding: return binding() if not self._bind_in_runtime: raise InjectorException( 'No binding was found for key=%s' % cls) if not callable(cls): raise InjectorException( 'Cannot create a runtime binding, the key is not callable, key=%s' % cls) try: instance = cls() except TypeError as previous_error: raise ConstructorTypeError(cls, previous_error) self._bindings[cls] = lambda: instance logger.debug( 'Created a runtime binding for key=%s, instance=%s', cls, instance) return instance class InjectorException(Exception): pass class _ConstructorBinding(Generic[T]): _instance: Optional[T] def __init__(self, constructor: Callable[[], T]) -> None: self._constructor = constructor self._created = False self._instance = None def __call__(self) -> T: if self._created and self._instance is not None: return self._instance with _BINDING_LOCK: if self._created and self._instance is not None: return self._instance self._instance = self._constructor() self._created = True return self._instance class _AttributeInjection(object): def __init__(self, cls: Binding) -> None: self._cls = cls def __get__(self, obj: Any, owner: Any) -> Injectable: return instance(self._cls) class _ParameterInjection(Generic[T]): __slots__ = ('_name', '_cls') def __init__(self, name: str, cls: Optional[Binding] = None) -> None: self._name = name self._cls = cls def __call__(self, func: Callable[..., Union[T, Awaitable[T]]]) -> Callable[..., Union[T, Awaitable[T]]]: if inspect.iscoroutinefunction(func): @wraps(func) async def async_injection_wrapper(*args: Any, **kwargs: Any) -> T: if self._name not in kwargs: kwargs[self._name] = instance(self._cls or self._name) async_func = cast(Callable[..., Awaitable[T]], func) return await async_func(*args, **kwargs) return async_injection_wrapper @wraps(func) def injection_wrapper(*args: Any, **kwargs: Any) -> T: if self._name not in kwargs: kwargs[self._name] = instance(self._cls or self._name) sync_func = cast(Callable[..., T], func) return sync_func(*args, **kwargs) return injection_wrapper class _ParametersInjection(Generic[T]): __slots__ = ('_params',) def __init__(self, **kwargs: Any) -> None: self._params = kwargs def __call__(self, func: Callable[..., Union[Awaitable[T], T]]) -> Callable[..., Union[Awaitable[T], T]]: if sys.version_info.major == 2: arg_names = inspect.getargspec(func).args else: arg_names = inspect.getfullargspec(func).args params_to_provide = self._params if inspect.iscoroutinefunction(func): @wraps(func) async def async_injection_wrapper(*args: Any, **kwargs: Any) -> T: provided_params = frozenset( arg_names[:len(args)]) | frozenset(kwargs.keys()) for param, cls in params_to_provide.items(): if param not in provided_params: kwargs[param] = instance(cls) async_func = cast(Callable[..., Awaitable[T]], func) try: return await async_func(*args, **kwargs) except TypeError as previous_error: raise ConstructorTypeError(func, previous_error) return async_injection_wrapper @wraps(func) def injection_wrapper(*args: Any, **kwargs: Any) -> T: provided_params = frozenset( arg_names[:len(args)]) | frozenset(kwargs.keys()) for param, cls in params_to_provide.items(): if param not in provided_params: kwargs[param] = instance(cls) sync_func = cast(Callable[..., T], func) try: return sync_func(*args, **kwargs) except TypeError as previous_error: raise ConstructorTypeError(func, previous_error) return injection_wrapper def configure(config: Optional[BinderCallable] = None, bind_in_runtime: bool = True) -> Injector: """Create an injector with a callable config or raise an exception when already configured.""" global _INJECTOR with _INJECTOR_LOCK: if _INJECTOR: raise InjectorException('Injector is already configured') _INJECTOR = Injector(config, bind_in_runtime=bind_in_runtime) logger.debug('Created and configured an injector, config=%s', config) return _INJECTOR def configure_once(config: Optional[BinderCallable] = None, bind_in_runtime: bool = True) -> Injector: """Create an injector with a callable config if not present, otherwise, do nothing.""" with _INJECTOR_LOCK: if _INJECTOR: return _INJECTOR return configure(config, bind_in_runtime=bind_in_runtime) def clear_and_configure(config: Optional[BinderCallable] = None, bind_in_runtime: bool = True) -> Injector: """Clear an existing injector and create another one with a callable config.""" with _INJECTOR_LOCK: clear() return configure(config, bind_in_runtime=bind_in_runtime) def is_configured() -> bool: """Return true if an injector is already configured.""" with _INJECTOR_LOCK: return _INJECTOR is not None def clear() -> None: """Clear an existing injector if present.""" global _INJECTOR with _INJECTOR_LOCK: if _INJECTOR is None: return _INJECTOR = None logger.debug('Cleared an injector') @overload def instance(cls: Type[T]) -> T: ... @overload def instance(cls: Hashable) -> Injectable: ... def instance(cls: Binding) -> Injectable: """Inject an instance of a class.""" return get_injector_or_die().get_instance(cls) @overload def attr(cls: Type[T]) -> T: ... @overload def attr(cls: Hashable) -> Injectable: ... def attr(cls: Binding) -> Injectable: """Return a attribute injection (descriptor).""" return _AttributeInjection(cls) def param(name: str, cls: Optional[Binding] = None) -> Callable: """Deprecated, use @inject.params. Return a decorator which injects an arg into a function.""" return _ParameterInjection(name, cls) def params(**args_to_classes: Binding) -> Callable: """Return a decorator which injects args into a function. For example:: @inject.params(cache=RedisCache, db=DbInterface) def sign_up(name, email, cache, db): pass """ return _ParametersInjection(**args_to_classes) def autoparams(*selected: str) -> Callable: """Return a decorator that will inject args into a function using type annotations, Python >= 3.5 only. For example:: @inject.autoparams() def refresh_cache(cache: RedisCache, db: DbInterface): pass There is an option to specify which arguments we want to inject without attempts of injecting everything: For example:: @inject.autoparams('cache', 'db') def sign_up(name, email, cache: RedisCache, db: DbInterface): pass """ def autoparams_decorator(fn: Callable[..., T]) -> Callable[..., T]: if inspect.isclass(fn): types = get_type_hints(fn.__init__) else: types = get_type_hints(fn) # Skip the return annotation. types = {name: typ for name, typ in types.items() if name != _RETURN} # Convert Union types into single types, i.e. Union[A, None] => A. types = {name: _unwrap_union_arg(typ) for name, typ in types.items()} # Filter types if selected args present. if selected: types = {name: typ for name, typ in types.items() if name in selected} wrapper: _ParametersInjection[T] = _ParametersInjection(**types) return wrapper(fn) return autoparams_decorator def get_injector() -> Optional[Injector]: """Return the current injector or None.""" return _INJECTOR def get_injector_or_die() -> Injector: """Return the current injector or raise an InjectorException.""" injector = _INJECTOR if not injector: raise InjectorException('No injector is configured') return injector def _unwrap_union_arg(typ): """Return the first type A in typing.Union[A, B] or typ if not Union.""" if not _is_union_type(typ): return typ return typ.__args__[0] def _is_union_type(typ): """Test if the type is a union type. Examples:: is_union_type(int) == False is_union_type(Union) == True is_union_type(Union[int, int]) == False is_union_type(Union[T, int]) == True Source: https://github.com/ilevkivskyi/typing_inspect/blob/master/typing_inspect.py """ if _NEW_TYPING: return (typ is Union or isinstance(typ, _GenericAlias) and typ.__origin__ is Union) return type(typ) is _Union cozy-1.3.0/cozy/ext/inject/py.typed000066400000000000000000000000001457036466300172420ustar00rootroot00000000000000cozy-1.3.0/cozy/extensions/000077500000000000000000000000001457036466300157005ustar00rootroot00000000000000cozy-1.3.0/cozy/extensions/__init__.py000066400000000000000000000000001457036466300177770ustar00rootroot00000000000000cozy-1.3.0/cozy/extensions/is_same_book.py000066400000000000000000000001461457036466300207050ustar00rootroot00000000000000def is_same_book(book_a: str, book_b: str) -> bool: return book_a.casefold() == book_b.casefold() cozy-1.3.0/cozy/extensions/set.py000066400000000000000000000002451457036466300170460ustar00rootroot00000000000000import re def split_strings_to_set(set_to_split: set[str]) -> set[str]: return {entry.strip() for item in set_to_split for entry in re.split(",|;|/|&", item)} cozy-1.3.0/cozy/media/000077500000000000000000000000001457036466300145605ustar00rootroot00000000000000cozy-1.3.0/cozy/media/__init__.py000066400000000000000000000000001457036466300166570ustar00rootroot00000000000000cozy-1.3.0/cozy/media/chapter.py000066400000000000000000000004241457036466300165600ustar00rootroot00000000000000class Chapter: name: str position: int length: float number: int def __init__(self, name: str, position: int, length: float, number: int): self.name = name self.position = position self.number = number self.length = length cozy-1.3.0/cozy/media/files.py000066400000000000000000000100441457036466300162330ustar00rootroot00000000000000import logging import os import urllib from pathlib import Path from gi.repository import Gio from cozy.architecture.event_sender import EventSender from cozy.ext import inject from cozy.media.importer import Importer from cozy.model.settings import Settings from cozy.report import reporter from cozy.ui.toaster import ToastNotifier log = logging.getLogger("files") class Files(EventSender): _settings = inject.attr(Settings) _importer = inject.attr(Importer) _toast: ToastNotifier = inject.attr(ToastNotifier) _file_count = 0 _file_progess = 0 def __init__(self): super().__init__() def copy(self, selection): log.info("Start of copying files") self.emit_event_main_thread("start-copy", None) paths = [f.get_path() for f in selection] storage_location = self._settings.default_location.path self._file_count = 0 self._file_progess = 0 self._count_all_files(paths) self._copy_all(paths, storage_location) log.info("Copying of files finished") self._importer.scan() def _copy_all(self, sources, destination: str): for path in sources: if os.path.isdir(path): self._copy_directory(path, destination) else: filename = os.path.basename(path) file_copy_destination = os.path.join(destination, filename) self._copy_file(path, file_copy_destination) def _copy_file(self, source_path: str, dest_path: str): log.info("Copy file %s to %s", source_path, dest_path) source = Gio.File.new_for_path(source_path) destination = Gio.File.new_for_path(dest_path) flags = Gio.FileCopyFlags.OVERWRITE self.filecopy_cancel = Gio.Cancellable() try: copied = source.copy(destination, flags, self.filecopy_cancel, self._update_copy_status, None) except Exception as e: if e.code == Gio.IOErrorEnum.CANCELLED: pass elif e.code == Gio.IOErrorEnum.READ_ONLY: self._toast.show(_("Cannot copy: Audiobook directory is read only")) elif e.code == Gio.IOErrorEnum.NO_SPACE: self._toast.show(_("Cannot copy: Disk is full")) elif e.code == Gio.IOErrorEnum.PERMISSION_DENIED: self._toast.show(_("Cannot copy: Permission denied")) else: reporter.exception("files", e) log.error("Failed to copy file: %s", e) self._file_progess += 1 def _copy_directory(self, path, destination): main_source_path = os.path.split(path)[0] for dirpath, dirnames, filenames in os.walk(path): dirname = os.path.relpath(dirpath, main_source_path) destination_dir = os.path.join(destination, dirname) try: Path(destination_dir).mkdir(parents=True, exist_ok=True) except PermissionError as e: log.error(e) self._toast.show(_("Cannot copy: Permission denied")) return for file in filenames: source = os.path.join(dirpath, file) file_copy_destination = os.path.join(destination, dirname, file) self._copy_file(source, file_copy_destination) def _count_all_files(self, paths: list[str]) -> None: for path in paths: if os.path.isdir(path): self._file_count += self._count_files_in_folder(path) else: self._file_count += 1 def _update_copy_status(self, current_num_bytes, total_num_bytes, _): if total_num_bytes == 0: total_num_bytes = 1 if self._file_count == 0: progress = 1.0 else: progress = (self._file_progess / self._file_count) + ( (current_num_bytes / total_num_bytes) / self._file_count) self.emit_event_main_thread("copy-progress", progress) def _count_files_in_folder(self, path: str) -> int: return sum([len(files) for r, d, files in os.walk(path)]) cozy-1.3.0/cozy/media/gst_player.py000066400000000000000000000204441457036466300173070ustar00rootroot00000000000000import logging import os import threading import time from enum import Enum, auto from typing import Optional from cozy.architecture.event_sender import EventSender from cozy.report import reporter from gi.repository import Gst log = logging.getLogger("gst_player") class GstPlayerState(Enum): STOPPED = auto() PAUSED = auto() PLAYING = auto() class GstPlayer(EventSender): def __init__(self): super().__init__() self._bus: Optional[Gst.Bus] = None self._player: Optional[Gst.Bin] = None self._bus_signal_id: Optional[int] = None self._playback_speed: float = 1.0 self._playback_speed_timer_running: bool = False self._volume: float = 1.0 Gst.init(None) @property def position(self) -> int: if not self._is_player_loaded(): return 0 position = self._query_gst_time(self._player.query_position) if position: return position log.warning("Failed to query position from player.") reporter.warning("gst_player", "Failed to query position from player.") return 0 @position.setter def position(self, new_position_ns: int): new_position_ns = max(0, new_position_ns) duration = self._query_gst_time(self._player.query_duration) if duration: new_position_ns = min(new_position_ns, duration) self._execute_seek(new_position_ns) @property def playback_speed(self) -> float: return self._playback_speed @playback_speed.setter def playback_speed(self, value: float): if not self._is_player_loaded(): return self._playback_speed = value if self._playback_speed_timer_running: return self._playback_speed_timer_running = True t = threading.Timer(0.2, self._on_playback_speed_timer) t.name = "PlaybackSpeedDelayTimer" t.start() @property def loaded_file_path(self) -> Optional[str]: if not self._is_player_loaded(): return None uri = self._player.get_property("current-uri") if uri: return uri.replace("file://", "") else: return None @property def state(self) -> GstPlayerState: if not self._is_player_loaded(): return GstPlayerState.STOPPED _, state, __ = self._player.get_state(Gst.CLOCK_TIME_NONE) if state == Gst.State.PLAYING: return GstPlayerState.PLAYING elif state == Gst.State.PAUSED: return GstPlayerState.PAUSED else: log.debug("GST player state was not playing or paused but %s", state) return GstPlayerState.STOPPED @property def volume(self) -> float: if not self._is_player_loaded(): log.error("Could not determine volume because player is not loaded.") return 1.0 return self._player.get_property("volume") @volume.setter def volume(self, new_value: float): self._volume = max(0.0, min(1.0, new_value)) if not self._is_player_loaded(): log.warning("Could not set volume because player is not loaded.") return self._player.set_property("volume", self._volume) self._player.set_property("mute", False) def init(self): if self._player: self.dispose() self._player = Gst.ElementFactory.make("playbin", "player") scaletempo = Gst.ElementFactory.make("scaletempo", "scaletempo") scaletempo.sync_state_with_parent() audiobin = Gst.ElementFactory.make("bin", "audiosink") audiobin.add(scaletempo) audiosink = Gst.ElementFactory.make("autoaudiosink", "audiosink") audiobin.add(audiosink) scaletempo.link(audiosink) pad = scaletempo.get_static_pad("sink") ghost_pad = Gst.GhostPad.new("sink", pad) audiobin.add_pad(ghost_pad) self._player.set_property("audio-sink", audiobin) self._bus = self._player.get_bus() self._bus.add_signal_watch() self._bus_signal_id = self._bus.connect("message", self._on_gst_message) def dispose(self): if not self._player: return if self._bus_signal_id: self._bus.disconnect(self._bus_signal_id) self._player.set_state(Gst.State.NULL) self._playback_speed = 1.0 log.info("Dispose") self.emit_event("dispose") def load_file(self, path: str): self.init() if not os.path.exists(path): raise FileNotFoundError() self._player.set_property("uri", "file://" + path) self._player.set_state(Gst.State.PAUSED) self._player.set_property("volume", self._volume) self._player.set_property("mute", False) def play(self): if not self._is_player_loaded() or self.state == GstPlayerState.PLAYING: return success = self._player.set_state(Gst.State.PLAYING) if success == Gst.StateChangeReturn.FAILURE: log.warning("Failed set gst player to play.") reporter.warning("gst_player", "Failed set gst player to play.") else: self.emit_event("state", GstPlayerState.PLAYING) def pause(self): if not self._is_player_loaded(): return success = self._player.set_state(Gst.State.PAUSED) if success == Gst.StateChangeReturn.FAILURE: log.warning("Failed set gst player to pause.") reporter.warning("gst_player", "Failed set gst player to pause.") else: self.emit_event("state", GstPlayerState.PAUSED) def stop(self): if not self._is_player_loaded(): return self.dispose() self.emit_event("state", GstPlayerState.STOPPED) def _is_player_loaded(self) -> bool: if not self._player: return False _, state, __ = self._player.get_state(Gst.CLOCK_TIME_NONE) if state != Gst.State.PLAYING and state != Gst.State.PAUSED: return False return True @staticmethod def _query_gst_time(query_function) -> Optional[int]: success = False counter = 0 while not success and counter < 10: success, value = query_function(Gst.Format.TIME) if success: return value else: counter += 1 time.sleep(0.01) return None def _execute_seek(self, new_position_ns: int): counter = 0 seeked = False while not seeked and counter < 500: seeked = self._player.seek(self._playback_speed, Gst.Format.TIME, Gst.SeekFlags.FLUSH, Gst.SeekType.SET, new_position_ns, Gst.SeekType.NONE, 0) if not seeked: counter += 1 time.sleep(0.01) if not seeked: log.info("Failed to seek, counter expired.") reporter.warning("gst_player", "Failed to seek, counter expired.") def _on_playback_speed_timer(self): self._player.seek(self._playback_speed, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE, Gst.SeekType.SET, self.position, Gst.SeekType.NONE, 0) self._playback_speed_timer_running = False def _on_gst_message(self, _, message: Gst.Message): t = message.type if t == Gst.MessageType.BUFFERING: if message.percentage < 100: self._player.set_state(Gst.State.PAUSED) log.info("Buffering…") else: self._player.set_state(Gst.State.PLAYING) log.info("Buffering finished.") elif t == Gst.MessageType.EOS: self.emit_event("file-finished") elif t == Gst.MessageType.ERROR: error, debug_msg = message.parse_error() if error.code == Gst.ResourceError.NOT_FOUND: self.stop() self.emit_event("resource-not-found") log.warning("gst: Resource not found. Stopping player.") reporter.warning("gst_player", "gst: Resource not found. Stopping player.") return reporter.error("player", f"{error.code}: {error}") log.error("%s: %s", error.code, error) log.debug(debug_msg) self.emit_event("error", error) cozy-1.3.0/cozy/media/importer.py000066400000000000000000000163101457036466300167740ustar00rootroot00000000000000import itertools import logging import os import time from enum import Enum, auto from multiprocessing.pool import Pool as Pool from typing import List, Set from urllib.parse import urlparse, unquote from cozy.architecture.event_sender import EventSender from cozy.architecture.profiler import timing from cozy.control.filesystem_monitor import FilesystemMonitor, StorageNotFound from cozy.ext import inject from cozy.media.media_detector import MediaDetector, NotAnAudioFile, AudioFileCouldNotBeDiscovered from cozy.media.media_file import MediaFile from cozy.model.database_importer import DatabaseImporter from cozy.model.library import Library from cozy.model.settings import Settings from cozy.report import reporter from cozy.ui.toaster import ToastNotifier log = logging.getLogger("importer") CHUNK_SIZE = 100 class ScanStatus(Enum): STARTED = auto() SUCCESS = auto() ABORTED = auto() FINISHED_WITH_ERRORS = auto() def import_file(path: str): if not os.path.isfile(path): return None try: media_detector = MediaDetector(path) media_data = media_detector.get_media_data() except NotAnAudioFile as e: return None except AudioFileCouldNotBeDiscovered as e: return unquote(urlparse(str(e)).path) except Exception as e: log.error(e) reporter.exception("media_detector", e) return None return media_data class Importer(EventSender): _fs_monitor: FilesystemMonitor = inject.attr("FilesystemMonitor") _settings = inject.attr(Settings) _library = inject.attr(Library) _database_importer = inject.attr(DatabaseImporter) _toast: ToastNotifier = inject.attr(ToastNotifier) def __init__(self): super().__init__() self._files_count: int = 0 self._progress: int = 0 @timing def scan(self): logging.info("Starting import") self.emit_event_main_thread("scan", ScanStatus.STARTED) files_to_scan = self._get_files_to_scan() self.emit_event_main_thread("scan-progress", 0.025) new_or_changed_files, undetected_files = self._execute_import(files_to_scan) self._library.invalidate() self.emit_event_main_thread("scan-progress", 1) logging.info("Import finished") self.emit_event_main_thread("scan", ScanStatus.SUCCESS) self.emit_event_main_thread("new-or-updated-files", new_or_changed_files) if len(undetected_files) > 0: logging.info("Some files could not be imported:") logging.info(undetected_files) self.emit_event_main_thread("import-failed", undetected_files) def _execute_import(self, files_to_scan: List[str]) -> (Set[str], Set[str]): new_or_changed_files = set() undetected_files = set() self._files_count = self._count_files_to_scan() self.emit_event_main_thread("scan-progress", 0.05) self._progress = 0 pool = Pool() while True: try: job = pool.map_async(import_file, itertools.islice(files_to_scan, CHUNK_SIZE)) except StopIteration as e: log.warning("importer", e, "_execute_import raised a stop iteration.") break self._wait_for_job_to_complete(job) import_result = job.get() undetected_files.update({file for file in import_result if isinstance(file, str)}) media_files = {file for file in import_result if isinstance(file, MediaFile)} new_or_changed_files.update((file.path for file in media_files)) self._progress += CHUNK_SIZE if len(media_files) != 0: try: self._database_importer.insert_many(media_files) except Exception as e: log.exception("Error while inserting new tracks to the database") reporter.exception("importer", e) self._toast.show("{}: {}".format(_("Error while importing new files"), str(e.__class__))) if self._progress >= self._files_count: break pool.close() return new_or_changed_files, undetected_files def _wait_for_job_to_complete(self, job): while not job.ready(): jobs_finished = max(0, CHUNK_SIZE - job._number_left * job._chunksize) progress = 0.05 + ((self._progress + jobs_finished) / self._files_count) * 0.9 self.emit_event_main_thread("scan-progress", progress) time.sleep(0.1) @timing def _count_files_to_scan(self) -> int: files_to_scan = self._get_files_to_scan() try: return max(1, len(list(files_to_scan))) except StopIteration as e: reporter.exception("importer", e, "_count_files_to_scan raised a stop iteration.") return 1 def _get_files_to_scan(self) -> List[str]: paths_to_scan = self._get_configured_storage_paths() files_in_media_folders = self._walk_paths_to_scan(paths_to_scan) files_to_scan = self._filter_unchanged_files(files_in_media_folders) return files_to_scan def _get_configured_storage_paths(self) -> List[str]: """From all storage path configured by the user, we only want to scan those paths that are currently online and exist.""" paths = [storage.path for storage in self._settings.storage_locations if not storage.external] for storage in self._settings.external_storage_locations: try: if self._fs_monitor.is_storage_online(storage): paths.append(storage.path) except StorageNotFound: paths.append(storage.path) return [path for path in paths if os.path.exists(path)] def _walk_paths_to_scan(self, paths: List[str]) -> List[str]: """Get all files recursive inside a directory. Returns absolute paths.""" for path in paths: for directory, subdirectories, files in os.walk(path): for file in files: filepath = os.path.join(directory, file) yield filepath def _filter_unchanged_files(self, files: List[str]) -> List[str]: """Filter all files that are already imported and that have not changed from a list of paths.""" imported_files = self._library.files for file in files: if file in imported_files: try: chapter = next(chapter for chapter in self._library.chapters if chapter.file == file) except StopIteration as e: log.warning("_filter_unchanged_files raised a stop iteration.") log.debug(e) yield file continue try: mtime = os.path.getmtime(file) if mtime > chapter.modified: yield file except Exception as e: log.debug(e) log.info("Could not get modified timestamp for file %s", file) continue continue yield file cozy-1.3.0/cozy/media/media_detector.py000066400000000000000000000040071457036466300201030ustar00rootroot00000000000000import logging import pathlib from cozy.architecture.event_sender import EventSender from cozy.media.media_file import MediaFile from cozy.media.tag_reader import TagReader from gi.repository import Gst, GstPbutils log = logging.getLogger("media_detector") class NotAnAudioFile(Exception): pass class AudioFileCouldNotBeDiscovered(Exception): pass class MediaDetector(EventSender): def __init__(self, path: str): super().__init__() self.uri = pathlib.Path(path).as_uri() Gst.init(None) self.discoverer: GstPbutils.Discoverer = GstPbutils.Discoverer() def get_media_data(self) -> MediaFile: if not self._has_audio_file_ending(): raise NotAnAudioFile try: discoverer_info: GstPbutils.DiscovererInfo = self.discoverer.discover_uri(self.uri) except Exception as e: log.info("Skipping file because it couldn't be detected: %s", self.uri) raise AudioFileCouldNotBeDiscovered(self.uri) is_valid_audio_file = self._is_valid_audio_file(discoverer_info) if is_valid_audio_file: tag_reader = TagReader(self.uri, discoverer_info) tags = tag_reader.get_tags() return tags else: raise AudioFileCouldNotBeDiscovered(self.uri) def _is_valid_audio_file(self, discoverer_info: GstPbutils.DiscovererInfo): audio_streams = discoverer_info.get_audio_streams() video_streams = discoverer_info.get_video_streams() if len(audio_streams) < 1: log.info("File contains no audio stream.") return False elif len(audio_streams) > 1: log.info("File contains more than one audio stream.") return False elif len(video_streams) > 0: log.info("File contains a video stream.") return False return True def _has_audio_file_ending(self) -> bool: return self.uri.lower().endswith(('.mp3', '.ogg', '.flac', '.m4a', '.m4b', '.mp4', '.wav', '.opus')) cozy-1.3.0/cozy/media/media_file.py000066400000000000000000000011551457036466300172120ustar00rootroot00000000000000from typing import List from cozy.media.chapter import Chapter class MediaFile: book_name: str author: str reader: str disk: int cover: bytes path: str modified: int chapters: List[Chapter] def __init__(self, book_name: str, author: str, reader: str, disk: int, cover: bytes, path: str, modified: int, chapters: List[Chapter]): self.book_name = book_name self.author = author self.reader = reader self.disk = disk self.cover = cover self.path = path self.modified = modified self.chapters = chapters cozy-1.3.0/cozy/media/player.py000066400000000000000000000351401457036466300164310ustar00rootroot00000000000000import logging import os import time from threading import Thread from typing import Optional from cozy.media.importer import Importer, ScanStatus from gi.repository import GLib, Gst from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.control.offline_cache import OfflineCache from cozy.ext import inject from cozy.media.gst_player import GstPlayer, GstPlayerState from cozy.model.book import Book from cozy.model.chapter import Chapter from cozy.model.library import Library from cozy.report import reporter from cozy.tools import IntervalTimer from cozy.ui.file_not_found_dialog import FileNotFoundDialog from cozy.ui.toaster import ToastNotifier log = logging.getLogger("mediaplayer") US_TO_SEC = 10 ** 6 NS_TO_SEC = 10 ** 9 class Player(EventSender): _library: Library = inject.attr(Library) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) _offline_cache: OfflineCache = inject.attr(OfflineCache) _toast: ToastNotifier = inject.attr(ToastNotifier) _importer: Importer = inject.attr(Importer) _gst_player: GstPlayer = inject.attr(GstPlayer) def __init__(self): super().__init__() self._book: Optional[Book] = None self._play_next_chapter: bool = True self._importer.add_listener(self._on_importer_event) self._gst_player.add_listener(self._on_gst_player_event) self.play_status_updater: IntervalTimer = IntervalTimer(1, self._emit_tick) self._fadeout_thread: Optional[Thread] = None self._gst_player.init() self.volume = self._app_settings.volume self._load_last_book() def _load_last_book(self): last_book = self._library.last_played_book if last_book: self._continue_book(last_book) self._rewind_feature() @property def loaded_book(self) -> Optional[Book]: return self._book @property def loaded_chapter(self) -> Optional[Chapter]: if self._book: return self._book.current_chapter else: return None @property def playing(self) -> bool: return self._gst_player.state == GstPlayerState.PLAYING @property def position(self) -> int: return self._gst_player.position @position.setter def position(self, new_value: int): # FIXME: setter expects seconds, but getter returns nanoseconds if self.loaded_chapter is not None: self._gst_player.position = max(self.loaded_chapter.start_position + (new_value * NS_TO_SEC), 0) @property def volume(self) -> float: return self._gst_player.volume @volume.setter def volume(self, new_value: float): self._gst_player.volume = new_value self._app_settings.volume = new_value @property def play_next_chapter(self) -> bool: return self._play_next_chapter @play_next_chapter.setter def play_next_chapter(self, value: bool): self._play_next_chapter = value @property def playback_speed(self) -> float: return self._gst_player.playback_speed @playback_speed.setter def playback_speed(self, value: float): self._gst_player.playback_speed = value def play_pause(self): if self._gst_player.state == GstPlayerState.PAUSED: self._gst_player.play() elif self._gst_player.state == GstPlayerState.PLAYING: self._gst_player.pause() else: log.error("Trying to play/pause although player is in STOP state.") reporter.error("player", "Trying to play/pause although player is in STOP state.") def pause(self, fadeout: bool = False): if fadeout and not self._fadeout_thread: log.info("Starting fadeout playback") self._fadeout_thread = Thread(target=self._fadeout_playback, name="PlayerFadeoutThread") self._fadeout_thread.start() return if self._gst_player.state == GstPlayerState.PLAYING: self._gst_player.pause() def play_pause_book(self, book: Book): if not book: log.error("Cannot play book which is None.") reporter.error("player", "Cannot play book which is None.") return if self._book == book: self.play_pause() else: self._continue_book(book) self._gst_player.play() def play_pause_chapter(self, book: Book, chapter: Chapter): if not book or not chapter: log.error("Cannot play chapter which is None.") reporter.error("player", "Cannot play chapter which is None.") return if self._book and self._book.current_chapter == chapter: self.play_pause() return if self._book != book: self._load_book(book) self._load_chapter(chapter) self._gst_player.play() book.position = chapter.id def rewind(self): state = self._gst_player.state if state != GstPlayerState.STOPPED: self._rewind_in_book() if state == GstPlayerState.PLAYING: self._gst_player.play() def forward(self): state = self._gst_player.state if state != GstPlayerState.STOPPED: self._forward_in_book() if state == GstPlayerState.PLAYING: self._gst_player.play() def destroy(self): self._gst_player.dispose() self._stop_playback() if self._fadeout_thread: self._fadeout_thread.stop() def _load_book(self, book: Book): if self._book == book: log.info("Not loading new book because it's unchanged.") return self._book = book self._book.last_played = int(time.time()) def _continue_book(self, book: Book): if self._book == book: log.info("Not loading new book because it's unchanged.") return self._load_book(book) self._load_chapter(book.current_chapter) def _load_chapter(self, chapter: Chapter): file_changed = False if not self._book: log.error("There is no book loaded but there should be.") reporter.error("player", "There is no book loaded but there should be.") return self._library.last_played_book = self._book media_file_path = self._get_playback_path(chapter) if self._gst_player.loaded_file_path == media_file_path: log.info("Not loading a new file because the new chapter is within the old file.") else: log.info("Loading new file for chapter.") try: self._gst_player.load_file(media_file_path) file_changed = True except FileNotFoundError: self._handle_file_not_found() return if file_changed or self._should_jump_to_chapter_position(chapter.position): self._gst_player.position = chapter.position self._gst_player.playback_speed = self._book.playback_speed if file_changed or self._book.position != chapter.id: self._book.position = chapter.id self.emit_event_main_thread("chapter-changed", self._book) def _get_playback_path(self, chapter: Chapter): if self._book.offline and self._book.downloaded: path = self._offline_cache.get_cached_path(chapter) if path and os.path.exists(path): return path return chapter.file def _rewind_in_book(self): if not self._book: log.error("Rewind in book not possible because no book is loaded.") reporter.error("player", "Rewind in book not possible because no book is loaded.") return current_position = self._gst_player.position current_position_relative = max(current_position - self.loaded_chapter.start_position, 0) chapter_number = self._book.chapters.index(self._book.current_chapter) rewind_seconds = self._app_settings.rewind_duration * self.playback_speed if current_position_relative / NS_TO_SEC - rewind_seconds > 0: self._gst_player.position = current_position - NS_TO_SEC * rewind_seconds elif chapter_number > 0: previous_chapter = self._book.chapters[chapter_number - 1] self._load_chapter(previous_chapter) self._gst_player.position = previous_chapter.end_position + ( current_position_relative - NS_TO_SEC * rewind_seconds) else: self._gst_player.position = 0 def _forward_in_book(self): if not self._book: log.error("Forward in book not possible because no book is loaded.") reporter.error("player", "Forward in book not possible because no book is loaded.") return current_position = self._gst_player.position current_position_relative = max(current_position - self.loaded_chapter.start_position, 0) old_chapter = self._book.current_chapter chapter_number = self._book.chapters.index(self._book.current_chapter) forward_seconds = self._app_settings.forward_duration * self.playback_speed if current_position_relative / NS_TO_SEC + forward_seconds < self._book.current_chapter.length: self._gst_player.position = current_position + (NS_TO_SEC * forward_seconds) elif chapter_number < len(self._book.chapters) - 1: next_chapter = self._book.chapters[chapter_number + 1] self._load_chapter(next_chapter) self._gst_player.position = next_chapter.start_position + ( NS_TO_SEC * forward_seconds - (old_chapter.length * NS_TO_SEC - current_position_relative)) else: self._next_chapter() def _rewind_feature(self): if self._app_settings.replay: self._rewind_in_book() self._emit_tick() def _next_chapter(self): if not self._book: log.error("Cannot play next chapter because no book reference is stored.") reporter.error("player", "Cannot play next chapter because no book reference is stored.") return index_current_chapter = self._book.chapters.index(self._book.current_chapter) self._book.current_chapter.position = self._book.current_chapter.start_position if len(self._book.chapters) <= index_current_chapter + 1: log.info("Book finished, stopping playback.") self._finish_book() self._gst_player.stop() else: chapter = self._book.chapters[index_current_chapter + 1] chapter.position = chapter.start_position self.play_pause_chapter(self._book, chapter) def _on_importer_event(self, event: str, message): if event == "scan" and message == ScanStatus.SUCCESS: log.info("Reloading current book") last_book = self._library.last_played_book if last_book: self._continue_book(last_book) # we need to tell everybody the new book object # it represents the same book but after a scan the old objects do get destroyed self.emit_event_main_thread("chapter-changed", self._book) def _on_gst_player_event(self, event: str, message): if event == "file-finished": self._next_chapter() elif event == "resource-not-found": self._handle_file_not_found() elif event == "state" and message == GstPlayerState.PLAYING: self._book.last_played = int(time.time()) self._start_tick_thread() self.emit_event_main_thread("play", self._book) elif event == "state" and message == GstPlayerState.PAUSED: self._stop_tick_thread() self.emit_event_main_thread("pause") elif event == "state" and message == GstPlayerState.STOPPED: self._stop_playback() elif event == "error": self._handle_gst_error(message) def _handle_gst_error(self, error: GLib.Error): if error.code != Gst.ResourceError.BUSY: self._toast.show(error.message) if error.code == Gst.ResourceError.OPEN_READ or Gst.ResourceError.READ: self._stop_playback() def _handle_file_not_found(self): if self.loaded_chapter: FileNotFoundDialog(self.loaded_chapter).present() self._stop_playback() else: log.warning("No chapter loaded, cannot display file not found dialog.") def _stop_playback(self): self._stop_tick_thread() self._book = None self.emit_event_main_thread("pause") self.emit_event_main_thread("stop") def _finish_book(self): if self._book: self._book.position = -1 self._library.last_played_book = None self.emit_event_main_thread("book-finished", self._book) def _start_tick_thread(self): if self.play_status_updater: self.play_status_updater.stop() self.play_status_updater = IntervalTimer(1, self._emit_tick) self.play_status_updater.start() def _stop_tick_thread(self): if self.play_status_updater: self.play_status_updater.stop() self.play_status_updater = None def _emit_tick(self): if not self.loaded_chapter or not self.loaded_book: log.info("Not emitting tick because no book/chapter is loaded.") return if self.position > self.loaded_chapter.end_position: self._next_chapter() try: self.loaded_chapter.position = self.position position_for_ui = self.position - self.loaded_chapter.start_position self.emit_event_main_thread("position", position_for_ui) except Exception as e: log.warning("Could not emit position event: %s", e) def _fadeout_playback(self): duration = self._app_settings.sleep_timer_fadeout_duration * 20 current_vol = self._gst_player.volume for i in range(0, duration): volume = max(current_vol - (i / duration), 0) self._gst_player.position = volume time.sleep(0.05) log.info("Fadeout completed.") self.play_pause() self._gst_player.volume = current_vol self.emit_event_main_thread("fadeout-finished", None) self._fadeout_thread = None def _should_jump_to_chapter_position(self, position: int) -> bool: """ Should the player jump to the given position? This allows gapless playback for media files that contain many chapters. """ difference = abs(self.position - position) if difference < 10 ** 9: return False return True cozy-1.3.0/cozy/media/tag_reader.py000066400000000000000000000127021457036466300172310ustar00rootroot00000000000000import os from typing import List from urllib.parse import unquote, urlparse import mutagen from mutagen.mp4 import MP4 from gi.repository import GstPbutils, Gst, GLib from cozy.media.chapter import Chapter from cozy.media.media_file import MediaFile NS_TO_SEC = 10 ** 9 class TagReader: def __init__(self, uri: str, discoverer_info: GstPbutils.DiscovererInfo): if not uri: raise ValueError("URI must not be None or emtpy") if not discoverer_info: raise ValueError("discoverer_info must not be None") self.uri: str = uri self.discoverer_info: GstPbutils.DiscovererInfo = discoverer_info self.tags: Gst.TagList = discoverer_info.get_tags() if not self.tags: raise ValueError("Failed to retrieve tags from discoverer_info") def get_tags(self) -> MediaFile: media_file = MediaFile( path=unquote(urlparse(self.uri).path), book_name=self._get_book_name(), author=self._get_author(), reader=self._get_reader(), disk=self._get_disk(), chapters=self._get_chapters(), cover=self._get_cover(), modified=self._get_modified() ) return media_file def _get_book_name(self): success, value = self.tags.get_string_index(Gst.TAG_ALBUM, 0) return value.strip() if success else self._get_book_name_fallback() def _get_book_name_fallback(self): path = os.path.normpath(self.uri) directory_path = os.path.dirname(path) directory = os.path.basename(directory_path) return unquote(directory) def _get_author(self): authors = self._get_string_list(Gst.TAG_COMPOSER) if len(authors) > 0 and authors[0]: return "; ".join(authors) else: return "Unknown" def _get_reader(self): readers = self._get_string_list(Gst.TAG_ARTIST) if len(readers) > 0 and readers[0]: return "; ".join(readers) else: return "Unknown" def _get_disk(self): success, value = self.tags.get_uint_index(Gst.TAG_ALBUM_VOLUME_NUMBER, 0) return value if success else 1 def _get_track_number(self): success, value = self.tags.get_uint_index(Gst.TAG_TRACK_NUMBER, 0) return value if success else 0 def _get_track_name(self): success, value = self.tags.get_string_index(Gst.TAG_TITLE, 0) return value.strip() if success else self._get_track_name_fallback() def _get_track_name_fallback(self): filename = os.path.basename(self.uri) filename_without_extension = os.path.splitext(filename)[0] return unquote(filename_without_extension) def _get_chapters(self): if self.uri.lower().endswith("m4b") and self._mutagen_supports_chapters(): mutagen_tags = self._parse_with_mutagen() return self._get_m4b_chapters(mutagen_tags) else: return self._get_single_chapter() def _get_single_chapter(self): chapter = Chapter( name=self._get_track_name(), position=0, length=self._get_length_in_seconds(), number=self._get_track_number() ) return [chapter] def _get_cover(self): success, sample = self.tags.get_sample_index(Gst.TAG_IMAGE, 0) if not success: success, sample = self.tags.get_sample_index(Gst.TAG_PREVIEW_IMAGE, 0) if not success: return None success, mapflags = sample.get_buffer().map(Gst.MapFlags.READ) if not success: return None cover_bytes = GLib.Bytes(mapflags.data).get_data() return cover_bytes def _get_length_in_seconds(self): return self.discoverer_info.get_duration() / Gst.SECOND def _get_modified(self): path = unquote(urlparse(self.uri).path) return int(os.path.getmtime(path)) def _get_string_list(self, tag: str): success, value = self.tags.get_string_index(tag, 0) values = [] for i in range(self.tags.get_tag_size(tag)): (success, value) = self.tags.get_string_index(tag, i) if success: values.append(value.strip()) return values def _get_m4b_chapters(self, mutagen_tags: MP4) -> List[Chapter]: chapters = [] if not mutagen_tags.chapters or len(mutagen_tags.chapters) == 0: return self._get_single_chapter() index = 0 for chapter in mutagen_tags.chapters: if index < len(mutagen_tags.chapters) - 1: length = mutagen_tags.chapters[index + 1].start - chapter.start else: length = self._get_length_in_seconds() - chapter.start if chapter.title: title = chapter.title else: title = "" chapters.append(Chapter( name=title, position=int(chapter.start * NS_TO_SEC), length=length, number=index + 1 )) index += 1 return chapters def _parse_with_mutagen(self) -> MP4: path = unquote(urlparse(self.uri).path) mutagen_mp4 = MP4(path) return mutagen_mp4 @staticmethod def _mutagen_supports_chapters() -> bool: if mutagen.version[0] > 1: return True if mutagen.version[0] == 1 and mutagen.version[1] >= 45: return True return False cozy-1.3.0/cozy/model/000077500000000000000000000000001457036466300146015ustar00rootroot00000000000000cozy-1.3.0/cozy/model/__init__.py000066400000000000000000000000001457036466300167000ustar00rootroot00000000000000cozy-1.3.0/cozy/model/book.py000066400000000000000000000164741457036466300161210ustar00rootroot00000000000000import logging from typing import List from peewee import SqliteDatabase, DoesNotExist from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.architecture.profiler import timing from cozy.db.collation import collate_natural from cozy.db.book import Book as BookModel from cozy.db.track import Track as TrackModel from cozy.db.track_to_file import TrackToFile from cozy.ext import inject from cozy.model.chapter import Chapter from cozy.model.settings import Settings from cozy.model.track import Track, TrackInconsistentData log = logging.getLogger("BookModel") class BookIsEmpty(Exception): pass class Book(Observable, EventSender): _chapters: List[Chapter] = None _settings: Settings = inject.attr(Settings) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self, db: SqliteDatabase, book: BookModel): super().__init__() super(Observable, self).__init__() self._db: SqliteDatabase = db self.id: int = book.id self._db_object: BookModel = book if TrackModel.select().where(TrackModel.book == self._db_object).count() < 1: raise BookIsEmpty @property def name(self): return self._db_object.name @name.setter def name(self, new_name: str): self._db_object.name = new_name self._db_object.save(only=self._db_object.dirty_fields) @property def author(self): if not self._app_settings.swap_author_reader: return self._db_object.author else: return self._db_object.reader @author.setter def author(self, new_author: str): if not self._app_settings.swap_author_reader: self._db_object.author = new_author else: self._db_object.reader = new_author self._db_object.save(only=self._db_object.dirty_fields) @property def reader(self): if not self._app_settings.swap_author_reader: return self._db_object.reader else: return self._db_object.author @reader.setter def reader(self, new_reader: str): if not self._app_settings.swap_author_reader: self._db_object.reader = new_reader else: self._db_object.author = new_reader self._db_object.save(only=self._db_object.dirty_fields) @property def position(self) -> int: return self._db_object.position @position.setter def position(self, new_position: int): self._db_object.position = new_position self._db_object.save(only=self._db_object.dirty_fields) self._notify("position") self._notify("current_chapter") @property def rating(self): return self._db_object.rating @rating.setter def rating(self, new_rating: int): self._db_object.rating = new_rating self._db_object.save(only=self._db_object.dirty_fields) @property def cover(self): return self._db_object.cover @cover.setter def cover(self, new_cover: bytes): self._db_object.cover = new_cover self._db_object.save(only=self._db_object.dirty_fields) @property def playback_speed(self): return self._db_object.playback_speed @playback_speed.setter def playback_speed(self, new_playback_speed: float): self._db_object.playback_speed = new_playback_speed self._db_object.save(only=self._db_object.dirty_fields) self._notify("playback_speed") @property def last_played(self): return self._db_object.last_played @last_played.setter def last_played(self, new_last_played: int): self._db_object.last_played = new_last_played self._db_object.save(only=self._db_object.dirty_fields) self._notify("last_played") @property def offline(self): return self._db_object.offline @offline.setter def offline(self, new_offline: bool): self._db_object.offline = new_offline self._db_object.save(only=self._db_object.dirty_fields) @property def downloaded(self): return self._db_object.downloaded @downloaded.setter def downloaded(self, new_downloaded: bool): self._db_object.downloaded = new_downloaded self._db_object.save(only=self._db_object.dirty_fields) @property def chapters(self): if not self._chapters: self._fetch_chapters() return self._chapters @property def current_chapter(self): return next((chapter for chapter in self.chapters if chapter.id == self.position), self.chapters[0]) @property def duration(self): return sum((chapter.length for chapter in self.chapters)) @property def progress(self): progress = 0 if self.position == 0: return 0 elif self.position == -1: return self.duration for chapter in self.chapters: if chapter.id == self.position: relative_position = max(chapter.position - chapter.start_position, 0) progress += int(relative_position / 1000000000) return progress progress += chapter.length return progress def remove(self): if self._settings.last_played_book and self._settings.last_played_book.id == self._db_object.id: self._settings.last_played_book = None book_tracks = [TrackModel.get_by_id(chapter.id) for chapter in self.chapters] track_to_files = TrackToFile.select().join(TrackModel).where(TrackToFile.track << book_tracks) for track in track_to_files: try: track.file.delete_instance(recursive=True) except DoesNotExist: track.delete_instance() for track in book_tracks: track.delete_instance(recursive=True) self._db_object.delete_instance(recursive=True) self.destroy_listeners() self._destroy_observers() def _fetch_chapters(self): tracks = TrackModel \ .select() \ .where(TrackModel.book == self._db_object) \ .order_by(TrackModel.disk, TrackModel.number, collate_natural.collation(TrackModel.name)) self._chapters = [] for track in tracks: try: track_model = Track(self._db, track) self._chapters.append(track_model) except TrackInconsistentData: log.warning("Skipping inconsistent model") except Exception as e: log.error("Could not create chapter object: %s", e) for chapter in self._chapters: chapter.add_listener(self._on_chapter_event) def _on_chapter_event(self, event: str, chapter: Chapter): if event == "chapter-deleted": try: self.chapters.remove(chapter) except ValueError: pass if len(self._chapters) < 1: if self._settings.last_played_book and self._settings.last_played_book.id == self._db_object.id: self._settings.last_played_book = None self._db_object.delete_instance(recursive=True) self.emit_event("book-deleted", self) self.destroy_listeners() self._destroy_observers() cozy-1.3.0/cozy/model/chapter.py000066400000000000000000000032541457036466300166050ustar00rootroot00000000000000from abc import ABC, abstractmethod from cozy.architecture.event_sender import EventSender class Chapter(ABC, EventSender): id: int def __init__(self): super().__init__() super(ABC, self).__init__() @property @abstractmethod def name(self) -> str: pass @name.setter @abstractmethod def name(self, new_name: str): pass @property @abstractmethod def number(self) -> int: pass @number.setter @abstractmethod def number(self, new_number: int): pass @property @abstractmethod def disk(self) -> int: pass @disk.setter @abstractmethod def disk(self, new_disk: int): pass @property @abstractmethod def position(self) -> int: pass @position.setter @abstractmethod def position(self, new_position: int): pass @property @abstractmethod def file(self) -> str: pass @file.setter @abstractmethod def file(self, new_file: str): pass @property @abstractmethod def file_id(self) -> int: pass @property @abstractmethod def length(self) -> float: pass @length.setter @abstractmethod def length(self, new_length: float): pass @property @abstractmethod def modified(self) -> int: pass @modified.setter @abstractmethod def modified(self, new_modified: int): pass @property @abstractmethod def start_position(self) -> int: pass @property @abstractmethod def end_position(self) -> int: pass @abstractmethod def delete(self): pass cozy-1.3.0/cozy/model/database_importer.py000066400000000000000000000170271457036466300206470ustar00rootroot00000000000000import logging from typing import List, Set from peewee import fn, SqliteDatabase from cozy.db.book import Book as BookModel from cozy.db.file import File from cozy.db.track import Track from cozy.db.track_to_file import TrackToFile from cozy.ext import inject from cozy.extensions.is_same_book import is_same_book from cozy.media.media_file import MediaFile from cozy.model.book import Book, BookIsEmpty log = logging.getLogger("db_importer") class TrackInsertRequest: track_data: object file: File start_at: int def __init__(self, track_data: object, file: File, start_at: int): self.track_data = track_data self.file = file self.start_at = start_at class BookUpdatePositionRequest: book_id: int progress: int def __init__(self, book_id: int, progress: int): self.book_id = book_id self.progress = progress class DatabaseImporter: _db = inject.attr(SqliteDatabase) def __init__(self): self._book_update_positions: List[BookUpdatePositionRequest] = [] def insert_many(self, media_files: Set[MediaFile]): self._book_update_positions = [] files = self._prepare_files_db_objects(media_files) File.insert_many(files).execute() tracks = self._prepare_track_db_objects(media_files) self._insert_tracks(tracks) self._update_book_positions() def _prepare_files_db_objects(self, media_files: Set[MediaFile]) -> List[object]: files = [] for media_file in media_files: query = File.select().where(File.path == media_file.path) if query.exists(): self._update_files_in_db(query.get(), media_file) continue file_already_in_list = any(f["path"] == media_file.path for f in files) if not file_already_in_list: files.append({"path": media_file.path, "modified": media_file.modified}) return files def _update_files_in_db(self, file: File, media_file: MediaFile): file.modified = media_file.modified file.save(only=file.dirty_fields) def _prepare_track_db_objects(self, media_files: Set[MediaFile]) -> Set[TrackInsertRequest]: book_db_objects: Set[BookModel] = set() for media_file in media_files: if not media_file: continue book = next((book for book in book_db_objects if is_same_book(book.name, media_file.book_name)), None) file_query = File.select().where(File.path == media_file.path) if not file_query.exists(): log.error("No file object with path present: %s", media_file.path) continue file = file_query.get() if not book: book = self._import_or_update_book(media_file) book_db_objects.add(book) try: book_model = Book(self._db, book) progress = book_model.progress except BookIsEmpty: progress = 0 self._delete_tracks_from_db(media_file) tracks = self._get_track_list_for_db(media_file, book) for track in tracks: start_at = track.pop("startAt") yield TrackInsertRequest(track, file, start_at) update_position_request_present = any(b.book_id == book.id for b in self._book_update_positions) if progress > 0 and not update_position_request_present: self._book_update_positions.append(BookUpdatePositionRequest(book.id, progress)) def _import_or_update_book(self, media_file): if BookModel.select(BookModel.name).where(self._matches_db_book(media_file.book_name)).count() < 1: book = self._create_book_db_object(media_file) else: book = self._update_book_db_object(media_file) return book def _matches_db_book(self, book_name: str) -> bool: return fn.Lower(BookModel.name) == book_name.lower() def _get_track_list_for_db(self, media_file: MediaFile, book: BookModel): tracks = [] for chapter in media_file.chapters: tracks.append({ "name": chapter.name, "number": chapter.number, "disk": media_file.disk, "book": book, "length": chapter.length, "startAt": chapter.position, "position": 0 }) return tracks def _update_book_db_object(self, media_file: MediaFile) -> BookModel: BookModel.update(name=media_file.book_name, author=media_file.author, reader=media_file.reader, cover=media_file.cover) \ .where(self._matches_db_book(media_file.book_name)) \ .execute() return BookModel.select().where(self._matches_db_book(media_file.book_name)).get() def _create_book_db_object(self, media_file: MediaFile) -> BookModel: return BookModel.create(name=media_file.book_name, author=media_file.author, reader=media_file.reader, cover=media_file.cover, position=0, rating=-1) def _get_track_db_objects_for_media_file(self, media_file: MediaFile) -> List[Track]: all_track_mappings = TrackToFile.select().join(File).where(TrackToFile.file.path == media_file.path) for item in all_track_mappings: yield item.track def _delete_tracks_from_db(self, media_file: MediaFile): for track in self._get_track_db_objects_for_media_file(media_file): track.delete_instance(recursive=True) def _is_chapter_count_in_db_different(self, media_file: MediaFile) -> bool: all_track_mappings = self._get_chapter_count_in_db(media_file) if all_track_mappings != len(media_file.chapters): return True else: return False def _get_chapter_count_in_db(self, media_file: MediaFile) -> int: all_track_mappings = TrackToFile.select().join(File).where(TrackToFile.file.path == media_file.path) return all_track_mappings.count() def _insert_tracks(self, tracks: Set[TrackInsertRequest]): for track in tracks: track_db = Track.insert(track.track_data).execute() TrackToFile.create(track=track_db, file=track.file, start_at=track.start_at) def _update_book_positions(self): for book_position in self._book_update_positions: book = BookModel.get_or_none(book_position.book_id) if not book: log.error("Could not restore book position because book is not present") continue self._update_book_position(book, book_position.progress) self._book_update_positions = [] def _update_book_position(self, book: BookModel, progress: int): try: book_model = Book(self._db, book) except BookIsEmpty: log.error("Could not restore book position because book is empty") return completed_chapter_length = 0 for chapter in book_model.chapters: old_position = progress if completed_chapter_length + chapter.length > old_position: chapter.position = chapter.start_position + ((old_position - completed_chapter_length) * 10 ** 9) book_model.position = chapter.id return else: completed_chapter_length += chapter.length book_model.position = 0 cozy-1.3.0/cozy/model/library.py000066400000000000000000000103011457036466300166120ustar00rootroot00000000000000import logging from typing import List, Set, Optional from peewee import SqliteDatabase from cozy.architecture.event_sender import EventSender from cozy.architecture.profiler import timing from cozy.db.book import Book as BookModel from cozy.db.file import File from cozy.ext import inject from cozy.extensions.set import split_strings_to_set from cozy.model.book import Book, BookIsEmpty from cozy.model.chapter import Chapter from cozy.model.settings import Settings log = logging.getLogger("ui") class Library(EventSender): _db = cache = inject.attr(SqliteDatabase) _settings: Settings = inject.attr(Settings) _books: List[Book] = [] _chapters: Set[Chapter] = set() _files: Set[str] = set() def __init__(self): super().__init__() @property def authors(self): authors = {book.author for book in self.books} authors = split_strings_to_set(authors) return authors @property def readers(self): readers = {book.reader for book in self.books} readers = split_strings_to_set(readers) return readers @property def books(self) -> List[Book]: if not self._books: self._load_all_books() return self._books @property def chapters(self) -> Set[Chapter]: if not self._chapters: self._load_all_chapters() return self._chapters @property def files(self) -> Set[str]: if not self._files: self._load_all_files() return self._files @property def last_played_book(self) -> Optional[Book]: if not self._settings.last_played_book: return None last_book = next((book for book in self.books if book.id == self._settings.last_played_book.id), None) return last_book @last_played_book.setter def last_played_book(self, new_value: Optional[Book]): self._settings.last_played_book = new_value def invalidate(self): for book in self._books: book.destroy_listeners() self._books = [] for chapter in self._chapters: chapter.destroy_listeners() self._chapters = set() self._files = set() @timing def rebase_path(self, old_path: str, new_path: str): self.emit_event_main_thread("rebase-started") chapter_count = len(self.chapters) for progress, chapter in enumerate(self.chapters, 1): if chapter.file.startswith(old_path): chapter.file = chapter.file.replace(old_path, new_path) self.emit_event_main_thread("rebase-progress", progress / chapter_count) self.emit_event_main_thread("rebase-finished") @staticmethod def reset_modified_date_for_all(): File.update(modified=0).execute() def _load_all_books(self): for book_db_obj in BookModel.select(): try: book = Book(self._db, book_db_obj) book.add_listener(self._on_book_event) self._books.append(book) except BookIsEmpty: pass def _load_all_chapters(self): self._chapters = {chapter for book_chapters in [book.chapters for book in self.books] for chapter in book_chapters} for chapter in self._chapters: chapter.add_listener(self._on_chapter_event) def _load_all_files(self): self._files = {chapter.file for chapter in self.chapters} def _on_chapter_event(self, event: str, chapter: Chapter): if event == "chapter-deleted": try: self.chapters.remove(chapter) except KeyError: log.error("Could not remove chapter from library chapter list.") try: self.files.remove(chapter.file) except KeyError: log.error("Could not remove file from library file list.") self._files = [] def _on_book_event(self, event: str, book): if event == "book-deleted": self.books.remove(book) cozy-1.3.0/cozy/model/settings.py000066400000000000000000000055131457036466300170170ustar00rootroot00000000000000import logging from typing import NoReturn import peewee from peewee import SqliteDatabase import cozy.ext.inject as inject from cozy.db.book import Book from cozy.db.settings import Settings as SettingsModel from cozy.db.storage import Storage as StorageModel from cozy.model.storage import InvalidPath, Storage from cozy.report import reporter log = logging.getLogger("model.storage_location") class Settings: _storages: list[Storage] = [] _db = inject.attr(SqliteDatabase) def __init__(self): self._db_object: SettingsModel = SettingsModel.get() @property def first_start(self) -> bool: return self._db_object.first_start @property def last_played_book(self) -> Book | None: try: return self._db_object.last_played_book except peewee.DoesNotExist: log.warning( "last_played_book references an non existent object. Setting last_played_book to None." ) reporter.warning( "settings_model", "last_played_book references an non existent object. Setting last_played_book to None.", ) self.last_played_book = None return None @last_played_book.setter def last_played_book(self, new_value) -> None: if new_value: self._db_object.last_played_book = new_value._db_object else: self._db_object.last_played_book = None self._db_object.save(only=self._db_object.dirty_fields) @property def default_location(self) -> Storage | NoReturn: for location in self.storage_locations: if location.default: return location raise AssertionError("This should never happen") @property def storage_locations(self) -> list[Storage]: if not self._storages: self._load_all_storage_locations() return self._storages @property def external_storage_locations(self) -> list[Storage]: if not self._storages: self._load_all_storage_locations() return [storage for storage in self._storages if storage.external] def invalidate(self) -> None: self._storages.clear() def _load_all_storage_locations(self) -> None: self.invalidate() for storage_db_obj in StorageModel.select(StorageModel.id): try: self._storages.append(Storage(self._db, storage_db_obj.id)) except InvalidPath: log.error("Invalid path found in database, skipping: %s", storage_db_obj.path) self._ensure_default_storage_is_present() def _ensure_default_storage_is_present(self): default_storage_present = any(storage.default for storage in self._storages) if not default_storage_present and self._storages: self._storages[0].default = True cozy-1.3.0/cozy/model/storage.py000066400000000000000000000034521457036466300166230ustar00rootroot00000000000000from pathlib import Path from peewee import SqliteDatabase from cozy.db.storage import Storage as StorageModel class InvalidPath(Exception): pass class Storage: def __init__(self, db: SqliteDatabase, db_id: int): self._db: SqliteDatabase = db self.id: int = db_id self._get_db_object() @staticmethod def new(db: SqliteDatabase, path: str): db_obj = StorageModel.create(path=path) return Storage(db, db_obj.id) def _get_db_object(self): self._db_object: StorageModel = StorageModel.get(self.id) @property def db_object(self): return self._db_object @property def path(self): return self._db_object.path @path.setter def path(self, path: str): if not Path(path).is_absolute(): raise InvalidPath self._db_object.path = path self._db_object.save(only=self._db_object.dirty_fields) @property def location_type(self): return self._db_object.location_type @location_type.setter def location_type(self, new_location_type: int): self._db_object.location_type = new_location_type self._db_object.save(only=self._db_object.dirty_fields) @property def default(self): return self._db_object.default @default.setter def default(self, new_default: bool): self._db_object.default = new_default self._db_object.save(only=self._db_object.dirty_fields) @property def external(self): return self._db_object.external @external.setter def external(self, new_external: bool): self._db_object.external = new_external self._db_object.save(only=self._db_object.dirty_fields) def delete(self): self._db_object.delete_instance(recursive=True, delete_nullable=False) cozy-1.3.0/cozy/model/track.py000066400000000000000000000077711457036466300162730ustar00rootroot00000000000000import logging from peewee import SqliteDatabase, DoesNotExist from cozy.db.file import File from cozy.db.track import Track as TrackModel from cozy.db.track_to_file import TrackToFile from cozy.model.chapter import Chapter NS_TO_SEC = 10 ** 9 log = logging.getLogger("TrackModel") class TrackInconsistentData(Exception): pass class Track(Chapter): def __init__(self, db: SqliteDatabase, track: TrackModel): super().__init__() self._db: SqliteDatabase = db self.id: int = track.id self._db_object: TrackModel = track try: self._track_to_file_db_object: TrackToFile = track.track_to_file.get() except DoesNotExist: log.error("Inconsistent DB, TrackToFile object is missing. Deleting this track.") self._db_object.delete_instance(recursive=True, delete_nullable=False) raise TrackInconsistentData @property def name(self): if self._db_object.name: return self._db_object.name return f"{_('Chapter')} {self.number}" @name.setter def name(self, new_name: str): self._db_object.name = new_name self._db_object.save(only=self._db_object.dirty_fields) @property def number(self): return self._db_object.number @number.setter def number(self, new_number: int): self._db_object.number = new_number self._db_object.save(only=self._db_object.dirty_fields) @property def disk(self): return self._db_object.disk @disk.setter def disk(self, new_disk: int): self._db_object.disk = new_disk self._db_object.save(only=self._db_object.dirty_fields) @property def position(self): return self._db_object.position @position.setter def position(self, new_position: int): self._db_object.position = new_position self._db_object.save(only=self._db_object.dirty_fields) @property def start_position(self) -> int: return self._track_to_file_db_object.start_at @property def end_position(self) -> int: return self.start_position + (int(self.length) * NS_TO_SEC) @property def file(self): return self._track_to_file_db_object.file.path @file.setter def file(self, new_file: str): file_query = File.select().where(File.path == new_file) if file_query.count() > 0: self._exchange_file(file_query.get()) else: self._create_new_file(new_file) @property def file_id(self): return self._track_to_file_db_object.file.id @property def length(self) -> float: return self._db_object.length @length.setter def length(self, new_length: float): self._db_object.length = new_length self._db_object.save(only=self._db_object.dirty_fields) @property def modified(self): return self._track_to_file_db_object.file.modified @modified.setter def modified(self, new_modified: int): file = self._track_to_file_db_object.file file.modified = new_modified file.save(only=file.dirty_fields) def delete(self): file_id = self.file_id self._db_object.delete_instance(recursive=True) if TrackToFile.select().join(File).where(TrackToFile.file.id == file_id).count() == 0: File.delete().where(File.id == file_id).execute() self.emit_event("chapter-deleted", self) self.destroy_listeners() def _exchange_file(self, file: File): old_file_id = self._track_to_file_db_object.file.id self._track_to_file_db_object.file = file self._track_to_file_db_object.save(only=self._track_to_file_db_object.dirty_fields) if TrackToFile.select().join(File).where(TrackToFile.file.id == old_file_id).count() == 0: File.delete().where(File.id == old_file_id).execute() def _create_new_file(self, new_file: str): file = self._track_to_file_db_object.file file.path = new_file file.save(only=file.dirty_fields) cozy-1.3.0/cozy/open_view.py000066400000000000000000000002251457036466300160450ustar00rootroot00000000000000from enum import Enum, auto class OpenView(Enum): AUTHOR = auto() READER = auto() BOOK = auto() LIBRARY = auto() BACK = auto() cozy-1.3.0/cozy/power_manager.py000066400000000000000000000017151457036466300167050ustar00rootroot00000000000000import logging from gi.repository import Gtk from cozy.ext import inject from cozy.media.player import Player log = logging.getLogger("power_mgr") class PowerManager: _player: Player = inject.attr(Player) _gtk_app = inject.attr("GtkApp") def __init__(self): self._inhibit_cookie = None self._player.add_listener(self._on_player_changed) def _on_player_changed(self, event: str, data): if event in ["pause", "stop"]: if self._inhibit_cookie: log.info("Uninhibited standby.") self._gtk_app.uninhibit(self._inhibit_cookie) self._inhibit_cookie = None elif event == "play": if self._inhibit_cookie: return self._inhibit_cookie = self._gtk_app.inhibit(None, Gtk.ApplicationInhibitFlags.SUSPEND, "Playback of audiobook") log.info("Inhibited standby.") cozy-1.3.0/cozy/report/000077500000000000000000000000001457036466300150145ustar00rootroot00000000000000cozy-1.3.0/cozy/report/__init__.py000066400000000000000000000000001457036466300171130ustar00rootroot00000000000000cozy-1.3.0/cozy/report/log_level.py000066400000000000000000000001461457036466300173370ustar00rootroot00000000000000from enum import Enum class LogLevel(Enum): DEBUG = 1 INFO = 2 WARNING = 3 ERROR = 4cozy-1.3.0/cozy/report/report_to_loki.py000066400000000000000000000053701457036466300204260ustar00rootroot00000000000000import os import requests import datetime import pytz import distro import platform from cozy.application_settings import ApplicationSettings from cozy.ext import inject from cozy.report.log_level import LogLevel from cozy.version import __version__ as CozyVersion from peewee import __version__ as PeeweeVersion from mutagen import version_string as MutagenVersion from gi.repository import Gtk URL = 'https://errors.cozy.sh:3100/api/prom/push' ENABLE = '@INSTALLED@' LOG_LEVEL_MAP = { LogLevel.DEBUG: "DEBUG", LogLevel.INFO: "INFO", LogLevel.WARNING: "WARN", LogLevel.ERROR: "ERROR" } def report(component: str, type: LogLevel, message: str, exception: Exception): if ENABLE != 'true': return app_settings = inject.instance(ApplicationSettings) report_level = app_settings.report_level if report_level == 0: return curr_datetime = datetime.datetime.now(pytz.timezone('Europe/Berlin')) curr_datetime = curr_datetime.isoformat('T') if not component or not type or not message: raise ValueError("component, type and message are mandatory") labels = __append_label("", "component", component) if exception: labels = __append_label(labels, "exception_type", exception.__class__.__name__) labels = __append_label(labels, "app", "cozy") labels = __append_label(labels, "level", LOG_LEVEL_MAP[type]) labels = __append_label(labels, "gtk_version", "{}.{}".format(Gtk.get_major_version(), Gtk.get_minor_version())) labels = __append_label(labels, "python_version", platform.python_version()) labels = __append_label(labels, "peewee_version", PeeweeVersion) labels = __append_label(labels, "mutagen_version", MutagenVersion) labels = __append_label(labels, "version", CozyVersion) if report_level > 1: labels = __append_label(labels, "distro", distro.name()) labels = __append_label(labels, "distro_version", distro.version()) labels = __append_label(labels, "desktop_environment", os.environ.get('DESKTOP_SESSION')) line = f"[{LOG_LEVEL_MAP[type]}] {message}" headers = { 'Content-type': 'application/json' } payload = { 'streams': [ { 'labels': "{{{}}}".format(labels), 'entries': [ { 'ts': curr_datetime, 'line': line } ] } ] } try: requests.post(URL, json=payload, headers=headers, timeout=10) except: pass def __append_label(labels, new_label_name, new_label_content): if labels: labels += "," else: labels = "" labels += "{}=\"{}\"".format(new_label_name, new_label_content) return labels cozy-1.3.0/cozy/report/reporter.py000066400000000000000000000015051457036466300172310ustar00rootroot00000000000000import traceback from cozy.report.log_level import LogLevel from multiprocessing.pool import ThreadPool as Pool from cozy.report.report_to_loki import report report_pool = Pool(5) def info(component: str, message: str): report_pool.apply_async(report, [component, LogLevel.INFO, message, None]) def warning(component: str, message: str): report_pool.apply_async(report, [component, LogLevel.WARNING, message, None]) def error(component: str, message: str): report_pool.apply_async(report, [component, LogLevel.ERROR, message, None]) def exception(component: str, exception: Exception, message=None): if not message: message = traceback.format_exc() report_pool.apply_async(report, [component, LogLevel.ERROR, message, exception]) def close(): report_pool.close() report_pool.terminate() cozy-1.3.0/cozy/tools.py000066400000000000000000000073361457036466300152240ustar00rootroot00000000000000from datetime import datetime import time import threading from platform import system as get_system from enum import Enum from gettext import ngettext import logging as log import distro class Platform(Enum): Linux = 0 Mac = 1 def system_platform(): os = get_system().upper() if "LINUX" in os: return Platform.Linux else: return Platform.Mac def shorten_string(string, length): """ Shortens a string when it is longer than length and adds … at the end. :param string: Text to be shortened :param length: Max. length of string :return : string or shortened string """ return (string[:length] + '…') if len(string) > length else string def is_elementary(): """ Currently we are only checking for elementaryOS """ dist = distro.linux_distribution(full_distribution_name=False) log.debug(dist) if '"elementary"' in dist or 'elementary' in dist: return True else: return False # https://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python class StoppableThread(threading.Thread): """Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.""" def __init__(self, target=None): super(StoppableThread, self).__init__(target=target) self._stop_event = threading.Event() def stop(self): self._stop_event.set() def stopped(self): return self._stop_event.is_set() # From https://stackoverflow.com/questions/11488877/periodically-execute-function-in-thread-in-real-time-every-n-seconds class IntervalTimer(StoppableThread): def __init__(self, interval, worker_func): super().__init__() self._interval = interval self._worker_func = worker_func def run(self): while not self.stopped(): self._worker_func() time.sleep(self._interval) def seconds_to_human_readable(seconds): """ Create a string with the following format: 6 hours 1 minute 45 minutes 21 seconds :param seconds: Integer """ m, s = divmod(seconds, 60) h, m = divmod(m, 60) h = int(h) m = int(m) s = int(s) result = "" if h > 0 and m > 0: result = ngettext('{hours} hour', '{hours} hours', h).format(hours=h) + \ " " + \ ngettext('{minutes} minute', '{minutes} minutes', m).format(minutes=m) elif h > 0: result = ngettext('{hours} hour', '{hours} hours', h).format(hours=h) elif m > 0: result = ngettext('{minutes} minute', '{minutes} minutes', m).format(minutes=m) elif s > 0: result = ngettext('{seconds} second', '{seconds} seconds', s).format(seconds=s) else: result = _("finished") return result def past_date_to_human_readable(unix_time): """ Converts the date to the following strings (from today): today yesterday x days ago x week(s) ago x month(s) ago x year(s) ago :param unix_time: """ date = datetime.fromtimestamp(unix_time) past = datetime.today().date() - date.date() days = int(past.days) weeks = int(days / 7) months = int(days / 30) years = int(months / 12) if unix_time < 1: return _("never") elif days < 1: return _("today") elif days < 2: return _("yesterday") elif days < 7: return _("%s days ago") % str(days) elif weeks < 5: return ngettext('{weeks} week ago', '{weeks} weeks ago', weeks).format(weeks=weeks) elif months < 12: return ngettext('{months} month ago', '{months} months ago', months).format(months=months) else: return ngettext('{years} year ago', '{years} years ago', years).format(years=years) cozy-1.3.0/cozy/ui/000077500000000000000000000000001457036466300141165ustar00rootroot00000000000000cozy-1.3.0/cozy/ui/__init__.py000066400000000000000000000000001457036466300162150ustar00rootroot00000000000000cozy-1.3.0/cozy/ui/app_view.py000066400000000000000000000037071457036466300163110ustar00rootroot00000000000000from gi.repository import Gtk, Adw from cozy.ext import inject from cozy.view_model.app_view_model import AppViewModel from cozy.view import View LIBRARY = "main" EMPTY_STATE = "welcome" PREPARING_LIBRARY = "import" BOOK_DETAIL = "book_overview" class AppView: _view_model: AppViewModel = inject.attr(AppViewModel) def __init__(self, builder: Gtk.Builder): self._builder = builder self._get_ui_elements() self._connect_view_model() self._connect_ui_elements() self._update_view_model_view(None, None) def _get_ui_elements(self): self._main_stack: Gtk.Stack = self._builder.get_object("main_stack") self._navigation_view: Adw.NavigationView = self._builder.get_object("navigation_view") def _connect_ui_elements(self): self._main_stack.connect("notify::visible-child", self._update_view_model_view) self._navigation_view.connect("notify::visible-page", self._update_view_model_view) def _connect_view_model(self): self._view_model.bind_to("view", self._on_view_changed) def _on_view_changed(self): view = self._view_model.view if view == View.EMPTY_STATE: self._main_stack.set_visible_child_name(EMPTY_STATE) elif view == View.PREPARING_LIBRARY: self._main_stack.set_visible_child_name(PREPARING_LIBRARY) elif view == View.LIBRARY: self._main_stack.set_visible_child_name(LIBRARY) def _update_view_model_view(self, *_): page = self._main_stack.props.visible_child_name if page == LIBRARY: if self._navigation_view.props.visible_page.props.tag == BOOK_DETAIL: self._view_model.view = View.BOOK_DETAIL else: self._view_model.view = View.LIBRARY elif page == EMPTY_STATE: self._view_model.view = View.EMPTY_STATE elif page == PREPARING_LIBRARY: self._view_model.view = View.PREPARING_LIBRARY cozy-1.3.0/cozy/ui/book_detail_view.py000066400000000000000000000270531457036466300200050ustar00rootroot00000000000000import logging import time from threading import Event, Thread from typing import Optional, Callable import gi from cozy.control.artwork_cache import ArtworkCache from cozy.ext import inject from cozy.model.book import Book from cozy.model.chapter import Chapter from cozy.report import reporter from cozy.ui.chapter_element import ChapterElement from cozy.ui.disk_element import DiskElement from cozy.view_model.book_detail_view_model import BookDetailViewModel from gi.repository import Adw, GLib, Gtk log = logging.getLogger("BookDetailView") ALBUM_ART_SIZE = 256 @Gtk.Template.from_resource('/com/github/geigi/cozy/book_detail.ui') class BookDetailView(Gtk.Box): __gtype_name__ = 'BookDetail' play_book_button: Gtk.Button = Gtk.Template.Child() book_label: Gtk.Label = Gtk.Template.Child() author_label: Gtk.Label = Gtk.Template.Child() last_played_label: Gtk.Label = Gtk.Template.Child() total_label: Gtk.Label = Gtk.Template.Child() remaining_label: Gtk.Label = Gtk.Template.Child() book_progress_bar: Gtk.ProgressBar = Gtk.Template.Child() published_label: Gtk.Label = Gtk.Template.Child() published_text: Gtk.Label = Gtk.Template.Child() download_box: Gtk.Box = Gtk.Template.Child() download_label: Gtk.Label = Gtk.Template.Child() download_image: Gtk.Image = Gtk.Template.Child() download_switch: Gtk.Switch = Gtk.Template.Child() album_art: Gtk.Picture = Gtk.Template.Child() album_art_container: Gtk.Box = Gtk.Template.Child() unavailable_box: Gtk.Box = Gtk.Template.Child() chapters_stack: Gtk.Stack = Gtk.Template.Child() chapter_box: Gtk.Box = Gtk.Template.Child() book_overview_scroller: Gtk.ScrolledWindow = Gtk.Template.Child() main_flow_box: Gtk.FlowBox = Gtk.Template.Child() _view_model: BookDetailViewModel = inject.attr(BookDetailViewModel) _artwork_cache: ArtworkCache = inject.attr(ArtworkCache) _current_selected_chapter: Optional[ChapterElement] = None def __init__(self, main_window_builder: Gtk.Builder): super().__init__() self._navigation_view: Adw.NavigationView = main_window_builder.get_object("navigation_view") self._book_details_container: Adw.ToolbarView = main_window_builder.get_object("book_details_container") self._book_details_container.set_content(self) headerbar = Adw.HeaderBar() self.header_title = Adw.WindowTitle() headerbar.set_title_widget(self.header_title) self._book_details_container.add_top_bar(headerbar) self.book_overview_scroller.props.propagate_natural_height = True self._chapters_event: Event = Event() self._chapters_thread: Thread = None self._prepare_chapters_job() self._connect_view_model() self._connect_widgets() def _connect_view_model(self): self._view_model.bind_to("book", self._on_book_changed) self._view_model.bind_to("playing", self._on_play_changed) self._view_model.bind_to("is_book_available", self._on_book_available_changed) self._view_model.bind_to("downloaded", self._set_book_download_status) self._view_model.bind_to("current_chapter", self._on_current_chapter_changed) self._view_model.bind_to("last_played_text", self._on_last_played_text_changed) self._view_model.bind_to("remaining_text", self._on_times_changed) self._view_model.bind_to("progress_percent", self._on_times_changed) self._view_model.bind_to("total_text", self._on_times_changed) self._view_model.bind_to("playback_speed", self._on_times_changed) self._view_model.bind_to("lock_ui", self._on_lock_ui_changed) self._view_model.bind_to("open", self._on_open) def _connect_widgets(self): self.play_book_button.connect("clicked", self._play_book_clicked) self.download_switch.connect("state-set", self._download_switch_changed) def _on_book_changed(self): if not self._view_model.book: msg = "ViewModel book was None." log.warning(msg) reporter.warning("BookDetailView", msg) return self._chapters_event.clear() book = self._view_model.book self.chapters_stack.set_visible_child_name("chapters_loader") self.book_overview_scroller.set_visible(False) self._run_display_chapters_job(book) self._current_selected_chapter = None self.published_label.set_visible(False) self.published_text.set_visible(False) self.total_label.set_visible(False) self.unavailable_box.set_visible(False) self.book_label.set_text(book.name) self.author_label.set_text(book.author) self.header_title.set_title(book.name) self.header_title.set_subtitle(book.author) self.last_played_label.set_text(self._view_model.last_played_text) self._set_cover_image(book) self._display_external_section() self._set_progress() def _on_open(self): if self._navigation_view.props.visible_page.props.tag == "book_overview": self._navigation_view.pop_to_tag("book_overview") else: self._navigation_view.push_by_tag("book_overview") def _on_play_changed(self): playing = self._view_model.playing if playing: self.play_book_button.set_icon_name("media-playback-pause-symbolic") else: self.play_book_button.set_icon_name("media-playback-start-symbolic") if self._current_selected_chapter: self._current_selected_chapter.set_playing(playing) else: log.error("_current_selected_chapter is null. Skipping...") reporter.error("book_detail_view", "_current_selected_chapter was NULL. No play/pause chapter icon was changed") def _on_book_available_changed(self): info_visibility = not self._view_model.is_book_available self.unavailable_box.set_visible(info_visibility) def _on_current_chapter_changed(self): if self._current_selected_chapter: self._current_selected_chapter.deselect() self._current_selected_chapter.set_playing(False) current_chapter = self._view_model.current_chapter for child in self.chapter_box: if not isinstance(child, ChapterElement): continue if child.chapter == current_chapter: self._current_selected_chapter = child child.select() child.set_playing(self._view_model.playing) break def _on_last_played_text_changed(self): self.last_played_label.set_text(self._view_model.last_played_text) def _on_times_changed(self): self.total_label.set_text(self._view_model.total_text) self._set_progress() def _on_lock_ui_changed(self): lock = self._view_model.lock_ui self.download_switch.set_sensitive(not lock) def _run_display_chapters_job(self, book): self._chapters_event.clear() # The job might be running on another thread. Attempt to cancel it first, wait a while and trigger the new one. self._interrupt_chapters_jobs() time.sleep(0.05) # This is done on a the UI thread to prevent chapters from the previous book flashing before the new chapters # are ready self._schedule_chapters_clearing() self._prepare_chapters_job() self._chapters_thread: Thread = Thread(target=self._schedule_chapters_rendering, args=[book, self._on_chapters_displayed]) self._chapters_thread.start() def _schedule_chapters_rendering(self, book: Book, callback: Callable): disk_number = -1 multiple_disks = self._view_model.disk_count > 1 for chapter in book.chapters: if self._chapters_job_locked: self._schedule_chapters_clearing() return if multiple_disks and disk_number != chapter.disk: GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, self._add_disk, book.id, chapter) GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, self._add_chapter, book.id, chapter) disk_number = chapter.disk # TODO We need a timeout value self._chapters_event.wait() self._chapters_event.clear() GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, callback) def _on_chapters_displayed(self): self.total_label.set_text(self._view_model.total_text) self.total_label.set_visible(True) self._set_book_download_status() self._on_current_chapter_changed() self._on_play_changed() self._on_book_available_changed() self.book_overview_scroller.set_visible(True) self.chapters_stack.set_visible_child_name("chapters_wrapper") def _display_external_section(self): external = self._view_model.is_book_external self.download_box.set_visible(external) self.download_switch.set_visible(external) if external: self.download_switch.handler_block_by_func(self._download_switch_changed) self.download_switch.set_active(self._view_model.book.offline) self.download_switch.handler_unblock_by_func(self._download_switch_changed) def _add_disk(self, book_id: int, chapter: Chapter): if book_id != self._view_model.book.id: return disc_element = DiskElement(chapter.disk) self.chapter_box.append(disc_element) self._chapters_event.set() def _add_chapter(self, book_id: int, chapter: Chapter): if book_id != self._view_model.book.id: return chapter_element = ChapterElement(chapter) chapter_element.connect("play-pause-clicked", self._play_chapter_clicked) self.chapter_box.append(chapter_element) self._chapters_event.set() def _schedule_chapters_clearing(self): GLib.MainContext.default().invoke_full(GLib.PRIORITY_DEFAULT_IDLE, self.chapter_box.remove_all_children) def _set_progress(self): self.remaining_label.set_text(self._view_model.remaining_text) self.book_progress_bar.set_fraction(self._view_model.progress_percent) def _set_cover_image(self, book: Book): paintable = self._artwork_cache.get_cover_paintable(book, self.get_scale_factor(), ALBUM_ART_SIZE) if paintable: self.album_art_container.set_visible(True) self.album_art.set_paintable(paintable) self.album_art.set_overflow(True) else: self.album_art_container.set_visible(False) def _interrupt_chapters_jobs(self): self._chapters_job_locked = True try: self._chapters_thread.join(timeout=0.2) except AttributeError as e: pass def _prepare_chapters_job(self): self._chapters_job_locked: bool = False def _download_switch_changed(self, _, state: bool): self._view_model.download_book(state) def _set_book_download_status(self): if not self._view_model.is_book_external: return if self._view_model.book.downloaded: icon_name = "downloaded-symbolic" text = _("Downloaded") else: icon_name = "download-symbolic" text = _("Download") self.download_image.set_from_icon_name(icon_name) self.download_label.set_text(text) def _play_chapter_clicked(self, _, chapter: Chapter): self._view_model.play_chapter(chapter) def _play_book_clicked(self, _): self._view_model.play_book() cozy-1.3.0/cozy/ui/chapter_element.py000066400000000000000000000045421457036466300176340ustar00rootroot00000000000000from gi.repository import Gtk, Pango, GObject, Gdk from cozy.control.string_representation import seconds_to_str from cozy.model.chapter import Chapter @Gtk.Template.from_resource('/com/github/geigi/cozy/chapter_element.ui') class ChapterElement(Gtk.Box): __gtype_name__ = "ChapterElement" icon_stack: Gtk.Stack = Gtk.Template.Child() number_label: Gtk.Label = Gtk.Template.Child() play_icon: Gtk.Image = Gtk.Template.Child() title_label: Gtk.Label = Gtk.Template.Child() duration_label: Gtk.Label = Gtk.Template.Child() def __init__(self, chapter: Chapter): self.selected = False self.chapter = chapter super().__init__() gesture = Gtk.GestureClick(button=Gdk.BUTTON_PRIMARY) gesture.connect("released", self._on_button_press) self.add_controller(gesture) motion = Gtk.EventControllerMotion() motion.connect("enter", self._on_enter_notify) motion.connect("leave", self._on_leave_notify) self.add_controller(motion) self.number_label.set_text(str(self.chapter.number)) self.title_label.set_text(self.chapter.name) self.duration_label.set_text(seconds_to_str(self.chapter.length)) def _on_button_press(self, *_): self.emit("play-pause-clicked", self.chapter) def _on_enter_notify(self, *_): self.add_css_class("box_hover") self.play_icon.add_css_class("box_hover") if not self.selected: self.icon_stack.set_visible_child_name("play_icon") def _on_leave_notify(self, *_): self.remove_css_class("box_hover") self.play_icon.remove_css_class("box_hover") if not self.selected: self.icon_stack.set_visible_child_name("number") def select(self): self.selected = True self.icon_stack.set_visible_child_name("play_icon") def deselect(self): self.selected = False self.icon_stack.set_visible_child_name("number") def set_playing(self, playing): if playing: self.play_icon.set_from_icon_name("media-playback-pause-symbolic") else: self.play_icon.set_from_icon_name("media-playback-start-symbolic") GObject.type_register(ChapterElement) GObject.signal_new('play-pause-clicked', ChapterElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) cozy-1.3.0/cozy/ui/db_migration_failed_view.py000066400000000000000000000020511457036466300214620ustar00rootroot00000000000000import webbrowser import gi from gi.repository import Adw EXPLANATION = _("During an update of the database an error occurred and Cozy will not be able to startup.\ A backup of the database was created before the update and has been restored now.\ Until this issue is resolved please use version 0.9.5 of Cozy.\ You can help resolve this problem by reporting an issue on GitHub.") class DBMigrationFailedView(Adw.MessageDialog): def __init__(self): super().__init__( heading=_("Failed to Update Database"), body=EXPLANATION, default_response="help", close_response="close", modal=True, ) self.add_response("close", _("Close Cozy")) self.add_response("help", _("Receive help on GitHub")) self.set_response_appearance("help", Adw.ResponseAppearance.SUGGESTED) self.connect("response", self.get_help) def get_help(self, *_, response): if response == "help": webbrowser.open("https://github.com/geigi/cozy/issues", new=2) cozy-1.3.0/cozy/ui/delete_book_view.py000066400000000000000000000017431457036466300200030ustar00rootroot00000000000000from gi.repository import Adw, Gtk from cozy.ext import inject from cozy.model.book import Book from cozy.ui.widgets.book_row import BookRow class DeleteBookView(Adw.MessageDialog): main_window = inject.attr("MainWindow") def __init__(self, callback, book: Book): super().__init__( heading=_("Delete Audiobook?"), body=_("The audiobook will be removed from your disk and from Cozy's library."), default_response="cancel", close_response="cancel", transient_for=self.main_window.window, modal=True, ) self.add_response("cancel", _("Cancel")) self.add_response("delete", _("Remove Audiobook")) self.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE) list_box = Gtk.ListBox(margin_top=12, css_classes=["boxed-list"]) list_box.append(BookRow(book)) self.set_extra_child(list_box) self.connect("response", callback, book) cozy-1.3.0/cozy/ui/disk_element.py000066400000000000000000000013171457036466300171350ustar00rootroot00000000000000from gi.repository import Gtk class DiskElement(Gtk.Box): """ This class represents a small disk number header for the book overview track list. """ def __init__(self, disc_number): super().__init__() self.add_css_class("dim-label") if disc_number > 1: self.set_margin_top(18) self.set_margin_bottom(3) self.set_margin_start(6) image = Gtk.Image.new_from_icon_name("media-optical-cd-audio-symbolic") self.append(image) label = Gtk.Label(margin_start=5) text = _("Disc") + " " + str(disc_number) # TODO: use formatted translation string here label.set_markup(f"{text}") self.append(label) cozy-1.3.0/cozy/ui/file_not_found_dialog.py000066400000000000000000000043301457036466300210010ustar00rootroot00000000000000from pathlib import Path from gi.repository import Adw, Gio, GLib, Gtk from cozy.ext import inject from cozy.media.importer import Importer from cozy.model.chapter import Chapter class FileNotFoundDialog(Adw.MessageDialog): main_window = inject.attr("MainWindow") _importer: Importer = inject.attr(Importer) def __init__(self, chapter: Chapter): self.missing_chapter = chapter super().__init__( heading=_("File not found"), body=_("This file could not be found. Do you want to locate it manually?"), default_response="locate", close_response="cancel", transient_for=self.main_window.window, modal=True, ) self.add_response("cancel", _("Cancel")) self.add_response("locate", _("Locate")) self.set_response_appearance("locate", Adw.ResponseAppearance.SUGGESTED) label = Gtk.Label(label=chapter.file, margin_top=12) label.add_css_class("monospace") self.set_extra_child(label) self.connect("response", self._on_locate) def _on_locate(self, __, response): if response == "locate": file_dialog = Gtk.FileDialog(title=_("Locate Missing File")) extension = Path(self.missing_chapter.file).suffix[1:] current_extension_filter = Gtk.FileFilter(name=_("{ext} files").format(ext=extension)) current_extension_filter.add_suffix(extension) audio_files_filter = Gtk.FileFilter(name=_("Audio files")) audio_files_filter.add_mime_type("audio/*") filters = Gio.ListStore.new(Gtk.FileFilter) filters.append(current_extension_filter) filters.append(audio_files_filter) file_dialog.set_filters(filters) file_dialog.set_default_filter(current_extension_filter) file_dialog.open(self.main_window.window, None, self._file_dialog_open_callback) def _file_dialog_open_callback(self, dialog, result): try: file = dialog.open_finish(result) except GLib.GError: pass else: if file is not None: self.missing_chapter.file = file.get_path() self._importer.scan() cozy-1.3.0/cozy/ui/headerbar.py000066400000000000000000000120531457036466300164060ustar00rootroot00000000000000import logging import gi from cozy.ext import inject from cozy.ui.widgets.progress_popover import ProgressPopover from cozy.view_model.headerbar_view_model import HeaderbarViewModel, HeaderBarState from gi.repository import Adw, Gtk, GObject from cozy.ext import inject from cozy.ui.widgets.progress_popover import ProgressPopover from cozy.view_model.headerbar_view_model import HeaderBarState, HeaderbarViewModel log = logging.getLogger("Headerbar") @Gtk.Template.from_resource("/com/github/geigi/cozy/headerbar.ui") class Headerbar(Gtk.Box): __gtype_name__ = "Headerbar" headerbar: Adw.HeaderBar = Gtk.Template.Child() search_bar: Gtk.SearchBar = Gtk.Template.Child() search_entry: Gtk.SearchEntry = Gtk.Template.Child() show_sidebar_button: Gtk.ToggleButton = Gtk.Template.Child() search_button: Gtk.MenuButton = Gtk.Template.Child() menu_button: Gtk.MenuButton = Gtk.Template.Child() progress_menu_button: Gtk.MenuButton = Gtk.Template.Child() progress_spinner: Gtk.Spinner = Gtk.Template.Child() view_switcher: Adw.ViewSwitcher = Gtk.Template.Child() def __init__(self, main_window_builder: Gtk.Builder): super().__init__() self.header_container: Adw.ToolbarView = main_window_builder.get_object("header_container") self.header_container.add_top_bar(self) self.mobile_view_switcher: Adw.ViewSwitcherBar = main_window_builder.get_object( "mobile_view_switcher" ) self.split_view: Adw.OverlaySplitView = main_window_builder.get_object("split_view") self.sort_stack: Adw.ViewStack = main_window_builder.get_object("sort_stack") self.view_switcher.set_stack(self.sort_stack) self.mobile_view_switcher.set_stack(self.sort_stack) self.progress_popover = ProgressPopover() self.progress_menu_button.set_popover(self.progress_popover) self.search_bar.connect_entry(self.search_entry) self.search_bar.set_key_capture_widget(self.header_container) self._headerbar_view_model: HeaderbarViewModel = inject.instance(HeaderbarViewModel) self._connect_view_model() self._connect_widgets() self._set_show_sidebar_button_visible() def _connect_view_model(self): self._headerbar_view_model.bind_to("state", self._on_state_changed) self._headerbar_view_model.bind_to("work_progress", self._on_work_progress_changed) self._headerbar_view_model.bind_to("work_message", self._on_work_message_changed) self._headerbar_view_model.bind_to("lock_ui", self._on_lock_ui_changed) def _connect_widgets(self): self.split_view.connect("notify::show-sidebar", self._on_sidebar_toggle) self.show_sidebar_button.connect("notify::active", self._on_sidebar_toggle) self.mobile_view_switcher.connect("notify::reveal", self._on_mobile_view) self.sort_stack.connect("notify::visible-child", self._set_show_sidebar_button_visible) self.mobile_view_switcher.bind_property( "reveal", self.split_view, "collapsed", GObject.BindingFlags.SYNC_CREATE ) def _on_mobile(self) -> bool: return self.mobile_view_switcher.props.reveal def _set_show_sidebar_button_visible(self, *_): page = self.sort_stack.props.visible_child_name if not self._on_mobile(): self.show_sidebar_button.set_visible(False) self.split_view.set_collapsed(False) self.split_view.set_show_sidebar(page != "recent") return if self.mobile_view_switcher.props.reveal: self.show_sidebar_button.set_visible(page != "recent") else: self.show_sidebar_button.set_visible(False) self.search_button.set_active(False) def _on_mobile_view(self, widget, _): page = self.sort_stack.props.visible_child_name if widget.props.reveal: self.headerbar.set_title_widget(Adw.WindowTitle(title="Cozy")) else: self.headerbar.set_title_widget(self.view_switcher) self._set_show_sidebar_button_visible() def _on_sidebar_toggle(self, widget, param): show_sidebar = widget.get_property(param.name) if widget is self.show_sidebar_button: self.split_view.set_show_sidebar(show_sidebar) elif widget is self.split_view: self.show_sidebar_button.set_active(show_sidebar) def _on_state_changed(self): if self._headerbar_view_model.state == HeaderBarState.PLAYING: self.progress_menu_button.set_visible(False) self.progress_popover.set_progress(0) self.progress_spinner.stop() else: self.progress_menu_button.set_visible(True) self.progress_spinner.start() def _on_work_progress_changed(self): self.progress_popover.set_progress(self._headerbar_view_model.work_progress) def _on_work_message_changed(self): self.progress_popover.set_message(self._headerbar_view_model.work_message) def _on_lock_ui_changed(self): self.search_button.set_sensitive(not self._headerbar_view_model.lock_ui) cozy-1.3.0/cozy/ui/import_failed_dialog.py000066400000000000000000000032031457036466300206230ustar00rootroot00000000000000from gettext import gettext as _ from gi.repository import Adw, Gtk from cozy.ext import inject HEADER = _("This can have multiple reasons:") POSSIBILITIES = "\n • ".join(( # yes, it is a hack, because \t would be too wide "", _("The audio format is not supported"), _("The path or filename contains non utf-8 characters"), _("The file(s) are no valid audio files"), _("The file(s) are corrupt"), )) message = HEADER + POSSIBILITIES class ImportFailedDialog(Adw.MessageDialog): """ Dialog that displays failed files on import. """ main_window = inject.attr("MainWindow") def __init__(self, files: list[str]): super().__init__( heading=_("Some files could not be imported"), default_response="cancel", close_response="cancel", transient_for=self.main_window.window, modal=True, ) self.add_response("cancel", _("Ok")) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=18) body_label = Gtk.Label(label=message) text_buffer = Gtk.TextBuffer( text="\n".join(files).encode("utf-8", errors="replace").decode("utf-8") ) text_view = Gtk.TextView( buffer=text_buffer, editable=False, cursor_visible=False, css_classes=["card", "failed-import-card", "monospace"] ) scroller = Gtk.ScrolledWindow( max_content_height=200, propagate_natural_height=True, child=text_view ) box.append(body_label) box.append(scroller) self.set_extra_child(box) cozy-1.3.0/cozy/ui/library_view.py000066400000000000000000000200701457036466300171650ustar00rootroot00000000000000import functools from typing import Optional from gi.repository import Adw, Gtk from cozy.ext import inject from cozy.ui.widgets.book_element import BookElement from cozy.ui.delete_book_view import DeleteBookView from cozy.ui.widgets.filter_list_box import FilterListBox from cozy.view_model.library_view_model import LibraryViewModel, LibraryViewMode READER_PAGE = "reader" AUTHOR_PAGE = "author" RECENT_PAGE = "recent" MAIN_BOOK_PAGE = "main" WELCOME_PAGE = "welcome" NO_RECENT_PAGE = "no_recent" BOOKS_PAGE = "books" class LibraryView: _view_model: LibraryViewModel = inject.attr(LibraryViewModel) def __init__(self, builder: Gtk.Builder): self._builder = builder self._connected_book_element: Optional[BookElement] = None self._get_ui_elements() self._connect_ui_elements() self._connect_view_model() self.populate_book_box() self.populate_author() self.populate_reader() self._on_library_view_mode_changed() def _get_ui_elements(self): self._filter_stack: Gtk.Stack = self._builder.get_object("sort_stack") self._main_stack: Gtk.Stack = self._builder.get_object("main_stack") self._navigation_view: Adw.NavigationView = self._builder.get_object("navigation_view") self._split_view: Adw.OverlaySplitView = self._builder.get_object("split_view") self._book_box: Gtk.FlowBox = self._builder.get_object("book_box") self._filter_stack_revealer: Gtk.Revealer = self._builder.get_object("sort_stack_revealer") self._author_box: FilterListBox = self._builder.get_object("author_box") self._reader_box: FilterListBox = self._builder.get_object("reader_box") self._book_stack: Gtk.Stack = self._builder.get_object("book_stack") def _connect_ui_elements(self): self._filter_stack.connect("notify::visible-child", self._on_sort_stack_changed) self._book_box.set_sort_func(self._view_model.display_book_sort) self._book_box.set_filter_func(self._view_model.display_book_filter) # We need to connect to row-activated because it will be emitted when the user clicks on a row # which is already activated. This is important for the mobile view # row-selected is needed because when setting the row using select_row (e.g. when searching), the row-activated # signal doesn't emit. self._author_box.connect("row-activated", self._on_filter_row_activated) self._reader_box.connect("row-activated", self._on_filter_row_activated) self._author_box.connect("row-selected", self._on_filter_row_activated) self._reader_box.connect("row-selected", self._on_filter_row_activated) def _connect_view_model(self): self._view_model.bind_to("library_view_mode", self._on_library_view_mode_changed) self._view_model.bind_to("authors", self.populate_author) self._view_model.bind_to("readers", self.populate_reader) self._view_model.bind_to("books", self.populate_book_box) self._view_model.bind_to("books-filter", self._book_box.invalidate_filter) self._view_model.bind_to("books-filter", self._book_box.invalidate_sort) self._view_model.bind_to("selected_filter", self._select_filter_row) self._view_model.bind_to("current_book_in_playback", self._current_book_in_playback) self._view_model.bind_to("playing", self._playing) self._view_model.bind_to("book-progress", self._on_book_progress_changed) def _on_sort_stack_changed(self, widget, _): page = widget.props.visible_child_name view_mode = None if page == RECENT_PAGE: view_mode = LibraryViewMode.CURRENT elif page == AUTHOR_PAGE: view_mode = LibraryViewMode.AUTHOR elif page == READER_PAGE: view_mode = LibraryViewMode.READER self._view_model.library_view_mode = view_mode def populate_book_box(self): self._book_box.remove_all_children() for book in self._view_model.books: book_element = BookElement(book) book_element.connect("play-pause-clicked", self._play_book_clicked) book_element.connect("open-book-overview", self._open_book_overview_clicked) book_element.connect("book-removed", self._on_book_removed) self._book_box.append(book_element) def populate_author(self): self._author_box.populate(self._view_model.authors) def populate_reader(self): self._reader_box.populate(self._view_model.readers) def _on_library_view_mode_changed(self): visible_child_name = None active_filter_box: Gtk.ListBox = None view_mode = self._view_model.library_view_mode main_view_page = MAIN_BOOK_PAGE books_view_page = BOOKS_PAGE if len(self._view_model.books) < 1: main_view_page = WELCOME_PAGE visible_child_name = RECENT_PAGE elif view_mode == LibraryViewMode.CURRENT: visible_child_name = RECENT_PAGE if not self._view_model.is_any_book_in_progress: books_view_page = NO_RECENT_PAGE elif view_mode == LibraryViewMode.AUTHOR: visible_child_name = AUTHOR_PAGE active_filter_box = self._author_box elif view_mode == LibraryViewMode.READER: visible_child_name = READER_PAGE active_filter_box = self._reader_box # https://stackoverflow.com/questions/22178524/gtk-named-stack-childs/22182843#22182843 self._main_stack.props.visible_child_name = main_view_page self._filter_stack.set_visible_child_name(visible_child_name) self._book_stack.set_visible_child_name(books_view_page) self._navigation_view.pop_to_tag("main") if active_filter_box: self._apply_selected_filter(active_filter_box.get_selected_row()) self._invalidate_filters() def _invalidate_filters(self): self._book_box.invalidate_filter() self._book_box.invalidate_sort() def _apply_selected_filter(self, row): if not row: return self._view_model.selected_filter = row.data self._invalidate_filters() def _on_filter_row_activated(self, _, row): self._apply_selected_filter(row) return True def _select_filter_row(self): if self._view_model.library_view_mode == LibraryViewMode.AUTHOR: self._author_box.select_row_with_content(self._view_model.selected_filter) elif self._view_model.library_view_mode == LibraryViewMode.READER: self._reader_box.select_row_with_content(self._view_model.selected_filter) def _play_book_clicked(self, _, book): self._view_model.play_book(book) def _open_book_overview_clicked(self, _, book): self._view_model.open_book_detail(book) return True def _on_book_removed(self, _, book): if self._view_model.book_files_exist(book): DeleteBookView(self._on_book_removed_clicked, book).present() def _on_book_removed_clicked(self, _, response, book): if response != "delete": return delete_from_library = True delete_files = True # TODO: maybe an option to not delete the files if delete_files: self._view_model.delete_book_files(book) if delete_from_library: self._view_model.remove_book(book) def _current_book_in_playback(self): if self._connected_book_element: self._connected_book_element.set_playing(False) self._connected_book_element = None index = 0 while book_element := self._book_box.get_child_at_index(index): if book_element.book == self._view_model.current_book_in_playback: self._connected_book_element = book_element break index += 1 def _playing(self): if self._connected_book_element: self._connected_book_element.set_playing(self._view_model.playing) def _on_book_progress_changed(self): if not self._connected_book_element: return self._connected_book_element.update_progress() cozy-1.3.0/cozy/ui/list_box_row_with_data.py000066400000000000000000000014551457036466300212330ustar00rootroot00000000000000from gi.repository import Gtk, Pango class ListBoxRowWithData(Gtk.ListBoxRow): """ This class represents a listboxitem for an author/reader. """ LABEL_MARGIN = 8 def __init__(self, data, bold=False, **properties): super().__init__(**properties) self.data = data self.set_margin_bottom(3) self.add_css_class("filter-list-box-row") label = Gtk.Label.new(data) if bold: label.set_markup("" + data + "") label.set_xalign(0.0) label.set_margin_top(self.LABEL_MARGIN) label.set_margin_bottom(self.LABEL_MARGIN) label.set_margin_start(6) label.set_max_width_chars(30) label.set_ellipsize(Pango.EllipsizeMode.END) self.set_child(label) self.set_tooltip_text(data) cozy-1.3.0/cozy/ui/list_box_separator_row.py000066400000000000000000000005241457036466300212630ustar00rootroot00000000000000from gi.repository import Gtk class ListBoxSeparatorRow(Gtk.ListBoxRow): """ This class represents a separator in a listbox row. """ def __init__(self): super().__init__() separator = Gtk.Separator() self.set_child(separator) self.set_sensitive(False) self.props.selectable = Falsecozy-1.3.0/cozy/ui/main_view.py000066400000000000000000000271421457036466300164540ustar00rootroot00000000000000import logging import os from collections import defaultdict from threading import Thread from typing import Callable from gi.repository import Adw, Gdk, Gio, GLib, Gtk import cozy.control.filesystem_monitor as fs_monitor import cozy.ext.inject as inject import cozy.report.reporter as report from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.singleton import Singleton from cozy.control.db import books, close_db from cozy.media.files import Files from cozy.media.importer import Importer, ScanStatus from cozy.media.player import Player from cozy.model.settings import Settings as SettingsModel from cozy.view_model.settings_view_model import SettingsViewModel from cozy.view_model.storages_view_model import StoragesViewModel from cozy.open_view import OpenView from cozy.ui.library_view import LibraryView from cozy.ui.preferences_view import PreferencesView from cozy.ui.widgets.first_import_button import FirstImportButton log = logging.getLogger("ui") class CozyUI(EventSender, metaclass=Singleton): """ CozyUI is the main ui class. """ # Is currently an dialog open? is_initialized = False __inhibit_cookie = None fs_monitor = inject.attr(fs_monitor.FilesystemMonitor) application_settings = inject.attr(ApplicationSettings) _importer: Importer = inject.attr(Importer) _settings: SettingsModel = inject.attr(SettingsModel) _files: Files = inject.attr(Files) _player: Player = inject.attr(Player) _storages_view_model: StoragesViewModel = inject.attr(StoragesViewModel) def __init__(self, pkgdatadir, app, version): super().__init__() self.pkgdir = pkgdatadir self.app = app self.version = version self._library_view: LibraryView = None def activate(self, library_view: LibraryView): self.__init_window() self.__init_actions() self.__init_components() self._library_view = library_view self.auto_import() self.check_for_tracks() self.is_initialized = True def startup(self): self.__init_resources() def __init_resources(self): """ Initialize all resources like gresource and glade windows. """ self.appdata_resource = Gio.resource_load( os.path.join(self.pkgdir, 'com.github.geigi.cozy.appdata.gresource')) Gio.Resource._register(self.appdata_resource) self.window_builder = Gtk.Builder.new_from_resource( "/com/github/geigi/cozy/main_window.ui") self.window: Gtk.Window = self.window_builder.get_object("app_window") def __init_window(self): """ Add fields for all UI objects we need to access from code. Initialize everything we can't do from the UI files like events and other stuff. """ log.info("Initializing main window") self._restore_window_size() self.window.set_title("Cozy") self.window.set_application(self.app) self.window.connect("close-request", self.on_close) self.window.connect("notify::default-width", self._on_window_size_allocate) self.window.connect("notify::default-height", self._on_window_size_allocate) self._drop_target = Gtk.DropTarget() self._drop_target.set_gtypes([Gdk.FileList]) self._drop_target.set_actions(Gdk.DragAction.COPY) self._drop_target.connect("enter", self._on_drag_enter) self._drop_target.connect("leave", self._on_drag_leave) self._drop_target.connect("drop", self._on_drag_data_received) self.window.add_controller(self._drop_target) self.main_stack: Gtk.Stack = self.window_builder.get_object("main_stack") self.navigation_view: Adw.NavigationView = self.window_builder.get_object("navigation_view") self.drop_revealer: Gtk.Revealer = self.window_builder.get_object("drop_revealer") self.window.present() def __init_actions(self): """ Init all app actions. """ about_action = Gio.SimpleAction.new("about", None) about_action.connect("activate", self.about) self.app.add_action(about_action) self.app.set_accels_for_action("app.about", ["F1"]) self.create_action("about", self.about) self.create_action("quit", self.quit, ["q", "w"]) self.create_action("prefs", self.show_prefs, ["comma"]) self.scan_action = self.create_action("scan", self.scan) self.play_pause_action = self.create_action("play_pause", self.play_pause, ["space"]) self.hide_offline_action = Gio.SimpleAction.new_stateful( "hide_offline", None, GLib.Variant.new_boolean(self.application_settings.hide_offline) ) self.hide_offline_action.connect("change-state", self.__on_hide_offline) self.app.add_action(self.hide_offline_action) def create_action( self, name: str, callback: Callable[[Gio.SimpleAction, None], None], shortcuts: list[str] | None = None, ) -> Gio.SimpleAction: action = Gio.SimpleAction.new(name, None) action.connect("activate", callback) self.app.add_action(action) if shortcuts: self.app.set_accels_for_action(f"app.{name}", shortcuts) return action def __init_components(self): path = self._settings.default_location.path if self._settings.storage_locations else None self.import_button = FirstImportButton(self._set_audiobook_path, path) self.get_object("welcome_status_page").set_child(self.import_button) if not self._player.loaded_book: self.block_ui_buttons(True) self._importer.add_listener(self._on_importer_event) def get_object(self, name): return self.window_builder.get_object(name) def quit(self, action, parameter): """ Quit app. """ self.on_close(None) self.app.quit() def _get_contributors(self): authors_file = self.appdata_resource.lookup_data("/com/github/geigi/cozy/authors", Gio.ResourceLookupFlags.NONE) current_section = "" result = defaultdict(list) for line in authors_file.get_data().decode().splitlines(): if line.startswith("#"): current_section = line[1:].strip().lower() elif line.startswith("-"): result[current_section].append(line[1:].strip()) return result def about(self, *junk): """ Show about window. """ about = Adw.AboutWindow.new_from_appdata( "/com/github/geigi/cozy/com.github.geigi.cozy.appdata.xml", release_notes_version=self.version, ) contributors = self._get_contributors() about.set_developers(sorted(contributors["code"])) about.set_designers(sorted(contributors["design"])) about.set_artists(sorted(contributors["icon"])) about.set_license_type(Gtk.License.GPL_3_0) about.add_acknowledgement_section( _("Patreon Supporters"), ["Fred Warren", "Gabriel", "Hu Mann", "Josiah", "Oleksii Kriukov"] ) about.add_acknowledgement_section( _("m4b chapter support in mutagen"), ("mweinelt",), ) about.add_acknowledgement_section( _("Open Source Projects"), ("Lollypop music player https://gitlab.gnome.org/World/lollypop",), ) # Translators: Replace "translator-credits" with your names, one name per line about.set_translator_credits(_("translator-credits")) about.add_legal_section("python-inject", "© 2010 Ivan Korobkov", Gtk.License.APACHE_2_0) about.set_transient_for(self.window) about.present() def show_prefs(self, *_): """ Show preferences window. """ PreferencesView().present() def play_pause(self, *_): self._player.play_pause() def block_ui_buttons(self, block, scan=False): """ Makes the buttons to interact with the player insensetive. :param block: Boolean """ sensitive = not block try: self.play_pause_action.set_enabled(sensitive) if scan: self.scan_action.set_enabled(sensitive) self.hide_offline_action.set_enabled(sensitive) except GLib.GError: pass def switch_to_playing(self): """ Switch the UI state back to playing. This enables all UI functionality for the user. """ if self.navigation_view.props.visible_page != "book_overview" and self.main_stack.props.visible_child_name != "welcome": self.navigation_view.pop_to_tag("main") if self._player.loaded_book: self.block_ui_buttons(False, True) else: # we want to only block the player controls # TODO: rework. this is messy self.block_ui_buttons(False, True) self.block_ui_buttons(True, False) def check_for_tracks(self): """ Check if there are any imported files. If there aren't display a welcome screen. """ if books().count() < 1: self.block_ui_buttons(True) def scan(self, _, __): thread = Thread(target=self._importer.scan, name="ScanMediaThread") thread.start() def auto_import(self): if self.application_settings.autoscan: self.scan(None, None) def __on_hide_offline(self, action, value): """ Show/Hide offline books action handler. """ action.set_state(value) self.application_settings.hide_offline = value.get_boolean() def _on_drag_enter(self, *_): self.drop_revealer.set_reveal_child(True) self.main_stack.add_css_class("blurred") return True def _on_drag_leave(self, *_): self.drop_revealer.set_reveal_child(False) self.main_stack.remove_css_class("blurred") return True def _on_drag_data_received(self, widget, value, *_): thread = Thread(target=self._files.copy, args=[value.get_files()], name="DnDImportThread") thread.start() return True def _set_audiobook_path(self, path: str | None) -> None: if path is None: return self.import_button.disable() self._storages_view_model.add_first_storage_location(path) self.scan(None, None) self.fs_monitor.init_offline_mode() def on_close(self, widget, data=None): """ Close and dispose everything that needs to be when window is closed. """ log.info("Closing.") self.fs_monitor.close() self._player.destroy() close_db() report.close() log.info("Closing app.") self.app.quit() log.info("App closed.") def get_builder(self): return self.window_builder def _on_importer_event(self, event: str, message): if event == "scan" and message == ScanStatus.SUCCESS: self.check_for_tracks() def _restore_window_size(self): width = self.application_settings.window_width height = self.application_settings.window_height self.window.set_default_size(width, height) if self.application_settings.window_maximize: self.window.maximize() else: self.window.unmaximize() def _on_window_size_allocate(self, *_): width, height = self.window.get_default_size() self.application_settings.window_width = width self.application_settings.window_height = height self.application_settings.window_maximize = self.window.is_maximized() cozy-1.3.0/cozy/ui/media_controller.py000066400000000000000000000137641457036466300200250ustar00rootroot00000000000000import logging import gi from cozy.control.artwork_cache import ArtworkCache from cozy.db.book import Book from cozy.ext import inject from cozy.ui.widgets.playback_speed_popover import PlaybackSpeedPopover from cozy.ui.widgets.seek_bar import SeekBar from cozy.ui.widgets.sleep_timer import SleepTimer from cozy.view_model.playback_control_view_model import PlaybackControlViewModel from gi.repository import Adw, Gtk, Gdk log = logging.getLogger("MediaController") COVER_SIZE = 46 @Gtk.Template.from_resource('/com/github/geigi/cozy/media_controller.ui') class MediaController(Adw.BreakpointBin): __gtype_name__ = "MediaController" seek_bar_container: Gtk.Box = Gtk.Template.Child() play_button: Gtk.Button = Gtk.Template.Child() prev_button: Gtk.Button = Gtk.Template.Child() next_button: Gtk.Button = Gtk.Template.Child() volume_button: Gtk.ScaleButton = Gtk.Template.Child() cover_img: Gtk.Image = Gtk.Template.Child() title_label: Gtk.Label = Gtk.Template.Child() subtitle_label: Gtk.Label = Gtk.Template.Child() playback_speed_button: Gtk.MenuButton = Gtk.Template.Child() timer_button: Gtk.MenuButton = Gtk.Template.Child() timer_image: Gtk.Image = Gtk.Template.Child() def __init__(self, main_window_builder: Gtk.Builder): super().__init__() self.container_bar: Gtk.Revealer = main_window_builder.get_object("media_control_box") self.container_bar.set_child(self) self.seek_bar = SeekBar() self.seek_bar_container.append(self.seek_bar) self.sleep_timer: SleepTimer = SleepTimer(self.timer_image) self.playback_speed_button.set_popover(PlaybackSpeedPopover()) self.timer_button.set_popover(self.sleep_timer) self._playback_control_view_model: PlaybackControlViewModel = inject.instance(PlaybackControlViewModel) self._artwork_cache: ArtworkCache = inject.instance(ArtworkCache) self._connect_view_model() self._connect_widgets() self._on_book_changed() self._on_lock_ui_changed() self._on_length_changed() self._on_position_changed() self._on_volume_changed() def _connect_view_model(self): self._playback_control_view_model.bind_to("book", self._on_book_changed) self._playback_control_view_model.bind_to("playing", self._on_play_changed) self._playback_control_view_model.bind_to("length", self._on_length_changed) self._playback_control_view_model.bind_to("position", self._on_position_changed) self._playback_control_view_model.bind_to("lock_ui", self._on_lock_ui_changed) self._playback_control_view_model.bind_to("volume", self._on_volume_changed) def _connect_widgets(self): self.play_button.connect("clicked", self._play_clicked) self.volume_button.connect("value-changed", self._on_volume_button_changed) self.seek_bar.connect("position-changed", self._on_seek_bar_position_changed) self.prev_button.connect("clicked", self._rewind_clicked) self.next_button.connect("clicked", self._forward_clicked) self.seek_bar.connect("rewind", self._rewind_clicked) self.seek_bar.connect("forward", self._forward_clicked) cover_click_gesture = Gtk.GestureClick() cover_click_gesture.connect("pressed", self._cover_clicked) self.cover_img.add_controller(cover_click_gesture) self.cover_img.set_cursor(Gdk.Cursor.new_from_name("pointer")) def _set_cover_image(self, book: Book): paintable = self._artwork_cache.get_cover_paintable(book, self.get_scale_factor(), COVER_SIZE) if paintable: self.cover_img.set_from_paintable(paintable) else: self.cover_img.set_from_icon_name("book-open-variant-symbolic") self.cover_img.props.pixel_size = COVER_SIZE def _on_book_changed(self) -> None: book = self._playback_control_view_model.book self._set_book(book) self._show_media_information(bool(book)) def _show_media_information(self, visibility: bool) -> None: self.title_label.set_visible(visibility) self.subtitle_label.set_visible(visibility) self.cover_img.set_visible(visibility) self.seek_bar.visible = visibility def _set_book(self, book: Book) -> None: if book is not None: self._set_cover_image(book) self.title_label.set_text(book.name) self.title_label.set_tooltip_text(book.name) self.subtitle_label.set_text(book.current_chapter.name) self.subtitle_label.set_tooltip_text(book.current_chapter.name) def _on_play_changed(self): if self._playback_control_view_model.playing: self.play_button.set_icon_name("media-playback-pause-symbolic") else: self.play_button.set_icon_name("media-playback-start-symbolic") def _on_position_changed(self): position = self._playback_control_view_model.relative_position if position is not None: self.seek_bar.position = position def _on_length_changed(self): length = self._playback_control_view_model.length if length: self.seek_bar.length = length def _on_lock_ui_changed(self): sensitive = not self._playback_control_view_model.lock_ui self.container_bar.set_reveal_child(sensitive) def _on_volume_changed(self): self.volume_button.set_value(self._playback_control_view_model.volume) def _play_clicked(self, *_): self._playback_control_view_model.play_pause() def _rewind_clicked(self, *_): self._playback_control_view_model.rewind() def _forward_clicked(self, *_): self._playback_control_view_model.forward() def _cover_clicked(self, *_): self._playback_control_view_model.open_book_detail() def _on_volume_button_changed(self, _, volume): self._playback_control_view_model.volume = volume def _on_seek_bar_position_changed(self, _, position): self._playback_control_view_model.relative_position = position cozy-1.3.0/cozy/ui/preferences_view.py000066400000000000000000000064351457036466300200330ustar00rootroot00000000000000from typing import Any from gi.repository import Adw, Gio, Gtk from cozy.ext import inject from cozy.ui.widgets.error_reporting import ErrorReporting from cozy.ui.widgets.storages import StorageLocations from cozy.view_model.settings_view_model import SettingsViewModel @Gtk.Template.from_resource("/com/github/geigi/cozy/preferences.ui") class PreferencesView(Adw.PreferencesWindow): __gtype_name__ = "PreferencesWindow" _glib_settings: Gio.Settings = inject.attr(Gio.Settings) _view_model: SettingsViewModel = inject.attr(SettingsViewModel) storages_page: Adw.PreferencesPage = Gtk.Template.Child() user_feedback_preference_group: Adw.PreferencesGroup = Gtk.Template.Child() dark_mode_switch: Adw.SwitchRow = Gtk.Template.Child() swap_author_reader_switch: Adw.SwitchRow = Gtk.Template.Child() replay_switch: Adw.SwitchRow = Gtk.Template.Child() sleep_timer_fadeout_switch: Adw.SwitchRow = Gtk.Template.Child() artwork_prefer_external_switch: Adw.SwitchRow = Gtk.Template.Child() rewind_duration_adjustment: Gtk.Adjustment = Gtk.Template.Child() forward_duration_adjustment: Gtk.Adjustment = Gtk.Template.Child() fadeout_duration_adjustment: Gtk.Adjustment = Gtk.Template.Child() def __init__(self, **kwargs: Any) -> None: main_window = inject.instance("MainWindow") super().__init__(transient_for=main_window.window, **kwargs) error_reporting = ErrorReporting() error_reporting.show_header(False) self.user_feedback_preference_group.add(error_reporting) self.storage_locations_view = StorageLocations() self.storages_page.add(self.storage_locations_view) self._view_model.bind_to("lock_ui", self._on_lock_ui_changed) self._bind_settings() def _bind_settings(self) -> None: self._glib_settings.bind( "dark-mode", self.dark_mode_switch, "active", Gio.SettingsBindFlags.DEFAULT ) self._glib_settings.bind( "swap-author-reader", self.swap_author_reader_switch, "active", Gio.SettingsBindFlags.DEFAULT, ) self._glib_settings.bind( "replay", self.replay_switch, "active", Gio.SettingsBindFlags.DEFAULT ) self._glib_settings.bind( "rewind-duration", self.rewind_duration_adjustment, "value", Gio.SettingsBindFlags.DEFAULT, ) self._glib_settings.bind( "forward-duration", self.forward_duration_adjustment, "value", Gio.SettingsBindFlags.DEFAULT, ) self._glib_settings.bind( "sleep-timer-fadeout", self.sleep_timer_fadeout_switch, "enable-expansion", Gio.SettingsBindFlags.DEFAULT, ) self._glib_settings.bind( "sleep-timer-fadeout-duration", self.fadeout_duration_adjustment, "value", Gio.SettingsBindFlags.DEFAULT, ) self._glib_settings.bind( "prefer-external-cover", self.artwork_prefer_external_switch, "active", Gio.SettingsBindFlags.DEFAULT, ) def _on_lock_ui_changed(self) -> None: self.storage_locations_view.set_sensitive(not self._view_model.lock_ui) cozy-1.3.0/cozy/ui/search_view.py000066400000000000000000000102151457036466300167660ustar00rootroot00000000000000import threading from typing import Callable, Sequence from gi.repository import Adw, Gtk from cozy.ext import inject from cozy.model.book import Book from cozy.ui.headerbar import Headerbar from cozy.ui.widgets.book_row import BookRow from cozy.ui.widgets.search_results import ArtistResultRow from cozy.view_model.search_view_model import SearchViewModel @Gtk.Template.from_resource("/com/github/geigi/cozy/search_page.ui") class SearchView(Adw.Bin): __gtype_name__ = "SearchView" stack: Gtk.Stack = Gtk.Template.Child() search_scroller: Gtk.ScrolledWindow = Gtk.Template.Child() start_searching_page: Adw.StatusPage = Gtk.Template.Child() nothing_found_page: Adw.StatusPage = Gtk.Template.Child() book_result_box: Adw.PreferencesGroup = Gtk.Template.Child() author_result_box: Adw.PreferencesGroup = Gtk.Template.Child() reader_result_box: Adw.PreferencesGroup = Gtk.Template.Child() book_result_list: Gtk.ListBox = Gtk.Template.Child() author_result_list: Gtk.ListBox = Gtk.Template.Child() reader_result_list: Gtk.ListBox = Gtk.Template.Child() view_model = inject.attr(SearchViewModel) main_view = inject.attr("MainWindow") search_thread: threading.Thread def __init__(self, main_window_builder: Gtk.Builder, headerbar: Headerbar) -> None: super().__init__() self.library_stack: Gtk.Stack = main_window_builder.get_object("library_stack") self.library_stack.add_child(self) self.split_view: Gtk.Stack = main_window_builder.get_object("split_view") self.search_bar = headerbar.search_bar self.entry = headerbar.search_entry self.entry.connect("search-changed", self._on_search_changed) self.search_thread = threading.Thread(target=self.view_model.search) self.view_model.bind_to("close", self.close) self.main_view.create_action("search", self.open, ["f"]) def open(self, *_) -> None: self.library_stack.set_visible_child(self) self.search_bar.set_search_mode(True) self.main_view.play_pause_action.set_enabled(False) def close(self) -> None: self.library_stack.set_visible_child(self.split_view) self.search_bar.set_search_mode(False) self.main_view.play_pause_action.set_enabled(True) def on_state_changed(self, widget: Gtk.Widget, param) -> None: if widget.get_property(param.name): self.open() else: self.close() def _on_search_changed(self, _) -> None: search_query = self.entry.get_text() if not search_query: self.stack.set_visible_child(self.start_searching_page) return if self.search_thread.is_alive(): self.search_thread.join(timeout=0.1) self.search_thread = threading.Thread( target=self.view_model.search, args=(search_query, self._display_results) ) self.search_thread.start() def _display_results(self, books: list[Book], authors: list[str], readers: list[str]) -> None: if not any((books, authors, readers)): self.stack.set_visible_child(self.nothing_found_page) return self.stack.set_visible_child(self.search_scroller) self._populate_listbox( books, self.book_result_list, self.book_result_box, self.view_model.jump_to_book ) self._populate_listbox( authors, self.author_result_list, self.author_result_box, self.view_model.jump_to_author ) self._populate_listbox( readers, self.reader_result_list, self.reader_result_box, self.view_model.jump_to_reader ) def _populate_listbox( self, results: Sequence[str | Book], listbox: Gtk.ListBox, box: Adw.PreferencesGroup, callback: Callable[[str | Book], None], ) -> None: box.set_visible(False) listbox.remove_all() if not results: return if isinstance(results[0], Book): row_type = BookRow else: row_type = ArtistResultRow for result in results: listbox.append(row_type(result, callback)) box.set_visible(True) cozy-1.3.0/cozy/ui/toaster.py000066400000000000000000000006241457036466300161530ustar00rootroot00000000000000from gi.repository import Adw, Gtk from cozy.ext import inject class ToastNotifier: _builder: Gtk.Builder = inject.attr("MainWindowBuilder") def __init__(self) -> None: super().__init__() self.overlay: Adw.ToastOverlay = self._builder.get_object("toast_overlay") def show(self, message: str) -> None: self.overlay.add_toast(Adw.Toast(title=message, timeout=2)) cozy-1.3.0/cozy/ui/widgets/000077500000000000000000000000001457036466300155645ustar00rootroot00000000000000cozy-1.3.0/cozy/ui/widgets/__init__.py000066400000000000000000000000001457036466300176630ustar00rootroot00000000000000cozy-1.3.0/cozy/ui/widgets/album_element.py000066400000000000000000000074141457036466300207550ustar00rootroot00000000000000import logging import math import cairo from cozy.control.artwork_cache import ArtworkCache from cozy.model.book import Book from cozy.ext import inject from gi.repository import Gtk, GObject, Gdk ALBUM_ART_SIZE = 200 PLAY_BUTTON_ICON_SIZE = Gtk.IconSize.NORMAL STROKE_WIDTH = 3 log = logging.getLogger("album_element") @Gtk.Template.from_resource('/com/github/geigi/cozy/album_element.ui') class AlbumElement(Gtk.Box): __gtype_name__ = "AlbumElement" artwork_cache: ArtworkCache = inject.attr(ArtworkCache) album_art_image: Gtk.Image = Gtk.Template.Child() play_button: Gtk.Button = Gtk.Template.Child() progress_drawing_area: Gtk.DrawingArea = Gtk.Template.Child() album_art_drawing_area: Gtk.DrawingArea = Gtk.Template.Child() album_art_overlay_revealer: Gtk.Revealer = Gtk.Template.Child() play_button_revealer: Gtk.Revealer = Gtk.Template.Child() def __init__(self, book: Book): super().__init__() self._book: Book = book paintable = self.artwork_cache.get_cover_paintable(book, 1, ALBUM_ART_SIZE) if paintable: self.album_art_image.set_from_paintable(paintable) self.album_art_image.set_size_request(ALBUM_ART_SIZE, ALBUM_ART_SIZE) else: self.album_art_image.set_from_icon_name("book-open-variant-symbolic") self.album_art_image.props.pixel_size = ALBUM_ART_SIZE self.play_button.connect("clicked", self._on_play_button_press) # TODO: Just use CSS #self.progress_drawing_area.connect("realize", lambda w: w.get_window().set_pass_through(True)) self.progress_drawing_area.set_draw_func(self._draw_progress) #self.album_art_drawing_area.set_draw_func(self._draw_album_hover) def set_playing(self, playing: bool): if playing: self.play_button.set_icon_name("media-playback-pause-symbolic") else: self.play_button.set_icon_name("media-playback-start-symbolic") def set_hover(self, hover: bool): self.album_art_overlay_revealer.set_reveal_child(hover) self.play_button_revealer.set_reveal_child(hover) def _on_play_button_press(self, _): self.emit("play-pause-clicked", self._book) def _draw_album_hover(self, area: Gtk.DrawingArea, context: cairo.Context, *_): context.rectangle(0, 0, area.get_allocated_width(), area.get_allocated_height()) context.set_source_rgba(1, 1, 1, 0.15) context.fill() def _draw_progress(self, area: Gtk.DrawingArea, context: cairo.Context, *_): width = area.get_allocated_width() height = area.get_allocated_height() button_size = self.play_button.get_allocated_width() self.radius = (button_size - STROKE_WIDTH) / 2.0 book_progress = self._book.progress / self._book.duration progress_circle_end = book_progress * math.pi * 2.0 context.arc(width / 2.0, height / 2.0, self.radius, math.pi * -0.5, progress_circle_end - (math.pi * 0.5)) if book_progress == 1.0: context.set_source_rgb(0.2, 0.82, 0.478) else: context.set_source_rgb(1.0, 1.0, 1.0) context.set_line_width(STROKE_WIDTH) context.stroke() def draw_background(self, area: Gtk.DrawingArea, context: cairo.Context): width = area.get_allocated_width() height = area.get_allocated_height() context.arc(width / 2.0, height / 2.0, self.radius, 0, math.pi * 2.0) context.set_source_rgba(0, 0, 0, 1.0) context.set_line_width(2) context.stroke() def update_progress(self): self.progress_drawing_area.queue_draw() GObject.type_register(AlbumElement) GObject.signal_new('play-pause-clicked', AlbumElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) cozy-1.3.0/cozy/ui/widgets/book_element.py000066400000000000000000000125151457036466300206050ustar00rootroot00000000000000from gi.repository import Gtk, GObject, Gdk, Gio from cozy.model.book import Book from cozy.ui.widgets.album_element import AlbumElement @Gtk.Template.from_resource('/com/github/geigi/cozy/book_element.ui') class BookElement(Gtk.FlowBoxChild): __gtype_name__ = "BookElement" name_label: Gtk.Label = Gtk.Template.Child() author_label: Gtk.Label = Gtk.Template.Child() container_box: Gtk.Box = Gtk.Template.Child() def __init__(self, book: Book): super().__init__() self.book = book self.pressed = False self.name_label.set_text(book.name) self.name_label.set_tooltip_text(book.name) self.author_label.set_text(book.author) self.author_label.set_tooltip_text(book.author) self.art = AlbumElement(self.book) self.art.connect("play-pause-clicked", self._on_album_art_press_event) self.container_box.prepend(self.art) self.set_cursor(Gdk.Cursor.new_from_name("pointer")) self._add_event_controllers() def _add_event_controllers(self): primary_button_gesture = Gtk.GestureClick(button=Gdk.BUTTON_PRIMARY) # primary_button_gesture.connect("pressed", self._select_item) primary_button_gesture.connect("released", self._open_book_overview) self.container_box.add_controller(primary_button_gesture) secondary_button_gesture = Gtk.GestureClick(button=Gdk.BUTTON_SECONDARY) secondary_button_gesture.connect("released", self._show_context_menu) self.container_box.add_controller(secondary_button_gesture) # FIXME: When clicking on an album's play button in the recents view, # it jumps to the first position, and GtkGestureLongPress thinks it's # a long press gesture, although it's just an unfinished long press long_press_gesture = Gtk.GestureLongPress() long_press_gesture.connect("pressed", self._show_context_menu) self.container_box.add_controller(long_press_gesture) key_event_controller = Gtk.EventControllerKey() key_event_controller.connect("key-pressed", self._on_key_press_event) self.container_box.add_controller(key_event_controller) motion_event_controller = Gtk.EventControllerMotion() motion_event_controller.connect("enter", self._on_cover_enter_notify) motion_event_controller.connect("leave", self._on_cover_leave_notify) self.container_box.add_controller(motion_event_controller) def set_playing(self, is_playing): self.art.set_playing(is_playing) def update_progress(self): self.art.update_progress() def _create_context_menu(self): menu_model = Gio.Menu() self.install_action("book_element.mark_as_read", None, self._mark_as_read) menu_model.append(_("Mark as read"), "book_element.mark_as_read") self.install_action("book_element.jump_to_folder", None, self._jump_to_folder) menu_model.append(_("Open in file browser"), "book_element.jump_to_folder") self.install_action("book_element.remove_book", None, self._remove_book) menu_model.append(_("Remove from library"), "book_element.remove_book") menu = Gtk.PopoverMenu(menu_model=menu_model, has_arrow=False) menu.set_parent(self.art) return menu def _remove_book(self, *_): self.emit("book-removed", self.book) def _mark_as_read(self, *_): self.book.position = -1 def _jump_to_folder(self, *_): """ Opens the folder containing this books files in the default file explorer. """ track = self.book.chapters[0] file_launcher = Gtk.FileLauncher(file=Gio.File.new_for_path(track.file)) dummy_callback = lambda d, r: d.open_containing_folder_finish(r) file_launcher.open_containing_folder(None, None, dummy_callback) def _show_context_menu(self, gesture: Gtk.Gesture, *_): gesture.set_state(Gtk.EventSequenceState.CLAIMED) self._create_context_menu().popup() def _select_item(self, gesture: Gtk.Gesture, *_): if super().get_sensitive(): gesture.set_state(Gtk.EventSequenceState.CLAIMED) self.pressed = True self.container_box.add_css_class("selected") def _open_book_overview(self, gesture, *_): gesture.set_state(Gtk.EventSequenceState.CLAIMED) self.pressed = False self.container_box.remove_css_class("selected") if super().get_sensitive(): self.emit("open-book-overview", self.book) def _on_key_press_event(self, keyval, *_): if keyval == Gdk.KEY_Return and super().get_sensitive(): self.emit("open-book-overview", self.book) def _on_cover_enter_notify(self, *_): self.art.set_hover(True) def _on_cover_leave_notify(self, *_): self.art.set_hover(False) def _on_album_art_press_event(self, *_): self.emit("play-pause-clicked", self.book) GObject.type_register(BookElement) GObject.signal_new('play-pause-clicked', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) GObject.signal_new('open-book-overview', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) GObject.signal_new('book-removed', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) cozy-1.3.0/cozy/ui/widgets/book_row.py000066400000000000000000000025041457036466300177600ustar00rootroot00000000000000from typing import Callable from gi.repository import Adw, Gtk from cozy.control.artwork_cache import ArtworkCache from cozy.ext import inject from cozy.model.book import Book BOOK_ICON_SIZE = 52 class BookRow(Adw.ActionRow): _artwork_cache: ArtworkCache = inject.attr(ArtworkCache) def __init__( self, book: Book, on_click: Callable[[Book], None] | None = None ) -> None: super().__init__( title=book.name, subtitle=book.author, selectable=False, use_markup=False ) if on_click is not None: self.connect("activated", lambda *_: on_click(book)) self.set_activatable(True) self.set_tooltip_text(_("Play this book")) paintable = self._artwork_cache.get_cover_paintable( book, self.get_scale_factor(), BOOK_ICON_SIZE ) if paintable: album_art = Gtk.Picture.new_for_paintable(paintable) album_art.add_css_class("round-6") album_art.set_overflow(True) else: album_art = Gtk.Image.new_from_icon_name("book-open-variant-symbolic") album_art.set_pixel_size(BOOK_ICON_SIZE) album_art.set_size_request(BOOK_ICON_SIZE, BOOK_ICON_SIZE) album_art.set_margin_top(6) album_art.set_margin_bottom(6) self.add_prefix(album_art) cozy-1.3.0/cozy/ui/widgets/error_reporting.py000066400000000000000000000055611457036466300213670ustar00rootroot00000000000000from gettext import gettext as _ import gi from cozy.application_settings import ApplicationSettings from cozy.ext import inject from gi.repository import Gtk LEVELS = [ _("Disabled"), _("Basic error reporting"), _("Detailed error reporting"), _("Detailed error reporting with import errors") ] LEVEL_DESCRIPTION = [ _("No error or crash reporting."), _("The following information will be sent in case of an error or crash:") ] LEVEL_DETAILS = { 0: [], 1: [_("Which type of error occurred"), _("Line of code where an error occurred"), _("Cozy's version"), ], 2: [_("Linux distribution"), _("Desktop environment")], 3: [_("Media type of files that Cozy couldn't import")] } @Gtk.Template.from_resource('/com/github/geigi/cozy/error_reporting.ui') class ErrorReporting(Gtk.Box): __gtype_name__ = 'ErrorReporting' level_label: Gtk.Label = Gtk.Template.Child() description_label: Gtk.Label = Gtk.Template.Child() details_label: Gtk.Label = Gtk.Template.Child() header_box: Gtk.Box = Gtk.Template.Child() verbose_adjustment: Gtk.Adjustment = Gtk.Template.Child() verbose_scale: Gtk.Scale = Gtk.Template.Child() app_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self, **kwargs): super().__init__(**kwargs) self.__init_scale() self._load_report_level() self.__connect() self.app_settings.add_listener(self._on_app_setting_changed) def show_header(self, show: bool): self.header_box.set_visible(show) def _load_report_level(self): level = self.app_settings.report_level self.verbose_adjustment.set_value(level + 1) self._update_ui_texts(level) def __init_scale(self): for i in range(1, 5): self.verbose_scale.add_mark(i, Gtk.PositionType.RIGHT, None) self.verbose_scale.set_round_digits(0) def __connect(self): self.verbose_adjustment.connect("value-changed", self._adjustment_changed) def _adjustment_changed(self, adjustment: Gtk.Adjustment): level = int(adjustment.get_value()) - 1 self.app_settings.report_level = level self._update_ui_texts(level) def _update_ui_texts(self, level: int): self.level_label.set_text(LEVELS[level]) self._update_description(level) self._update_details(level) def _update_description(self, value): detail_index = min(value, 1) self.description_label.set_text(LEVEL_DESCRIPTION[detail_index]) def _update_details(self, value): details = "" for i in range(value + 1): for line in LEVEL_DETAILS[i]: details += "• {}\n".format(line) self.details_label.set_text(details) def _on_app_setting_changed(self, event, _): if event == "report-level": self._load_report_level() cozy-1.3.0/cozy/ui/widgets/filter_list_box.py000066400000000000000000000020141457036466300213230ustar00rootroot00000000000000from typing import List from gi.repository import Gtk from cozy.ui.list_box_row_with_data import ListBoxRowWithData from cozy.ui.list_box_separator_row import ListBoxSeparatorRow class FilterListBox(Gtk.ListBox): __gtype_name__ = 'FilterListBox' def __init__(self, **properties): super().__init__(**properties) def populate(self, elements: List[str]): self.remove_all_children() all_row = ListBoxRowWithData(_("All"), True) all_row.set_tooltip_text(_("Display all books")) self.append(all_row) self.select_row(all_row) for element in elements: row = ListBoxRowWithData(element, False) self.append(row) def select_row_with_content(self, row_content: str): child = self.get_first_child() while child: next = child.get_next_sibling() if isinstance(child, ListBoxRowWithData) and child.data == row_content: self.select_row(child) break child = next cozy-1.3.0/cozy/ui/widgets/first_import_button.py000066400000000000000000000014161457036466300222540ustar00rootroot00000000000000from gi.repository import Adw, Gtk, GObject from .storages import ask_storage_location from typing import Callable @Gtk.Template.from_resource('/com/github/geigi/cozy/first_import_button.ui') class FirstImportButton(Gtk.Button): __gtype_name__ = "FirstImportButton" stack: Gtk.Stack = Gtk.Template.Child() label: Adw.ButtonContent = Gtk.Template.Child() spinner: Gtk.Spinner = Gtk.Template.Child() def __init__(self, callback: Callable[[str], None], initial_folder: str) -> None: super().__init__() self.connect("clicked", lambda *_: ask_storage_location(callback, initial_folder)) def disable(self) -> None: self.set_sensitive(False) self.spinner.set_spinning(True) self.stack.set_visible_child(self.spinner) cozy-1.3.0/cozy/ui/widgets/list_box_extensions.py000066400000000000000000000006261457036466300222440ustar00rootroot00000000000000from gi.repository import Gtk def remove_all_children(self): """ Removes all widgets from a gtk widget. """ self.set_visible(False) child = self.get_first_child() while child: next = child.get_next_sibling() self.remove(child) child = next self.set_visible(True) def extend_gtk_container(): Gtk.Widget.remove_all_children = remove_all_children cozy-1.3.0/cozy/ui/widgets/playback_speed_popover.py000066400000000000000000000024731457036466300226640ustar00rootroot00000000000000from cozy.ext import inject from cozy.view_model.playback_speed_view_model import PlaybackSpeedViewModel from gi.repository import Gtk @Gtk.Template.from_resource('/com/github/geigi/cozy/playback_speed_popover.ui') class PlaybackSpeedPopover(Gtk.Popover): __gtype_name__ = "PlaybackSpeedPopover" _view_model: PlaybackSpeedViewModel = inject.attr(PlaybackSpeedViewModel) playback_speed_scale: Gtk.Scale = Gtk.Template.Child() playback_speed_label: Gtk.Label = Gtk.Template.Child() def __init__(self, **kwargs): super().__init__(**kwargs) self.playback_speed_scale.add_mark(1.0, Gtk.PositionType.RIGHT, None) self.playback_speed_scale.set_increments(0.02, 0.05) self.playback_speed_scale.connect("value-changed", self._on_playback_speed_scale_changed) self._view_model.bind_to("playback_speed", self._on_playback_speed_changed) self._on_playback_speed_changed() def _on_playback_speed_scale_changed(self, _): speed = round(self.playback_speed_scale.get_value(), 2) self._view_model.playback_speed = speed self.playback_speed_label.set_markup("{speed:3.1f} x".format(speed=speed)) def _on_playback_speed_changed(self): self.playback_speed_scale.set_value(self._view_model.playback_speed) cozy-1.3.0/cozy/ui/widgets/progress_popover.py000066400000000000000000000010201457036466300215450ustar00rootroot00000000000000from gi.repository import Gtk @Gtk.Template.from_resource('/com/github/geigi/cozy/progress_popover.ui') class ProgressPopover(Gtk.Popover): __gtype_name__ = 'ProgressPopover' progress_label: Gtk.Label = Gtk.Template.Child() progress_bar: Gtk.ProgressBar = Gtk.Template.Child() def __init__(self): super().__init__() def set_message(self, message: str): self.progress_label.set_text(message) def set_progress(self, progress: float): self.progress_bar.set_fraction(progress) cozy-1.3.0/cozy/ui/widgets/search_results.py000066400000000000000000000012261457036466300211650ustar00rootroot00000000000000from typing import Callable from gi.repository import Adw, Gtk class ArtistResultRow(Adw.ActionRow): def __init__(self, name: str, on_click: Callable[[str], None]) -> None: super().__init__( title=name, selectable=False, activatable=True, use_markup=False, tooltip_text=_("Jump to {artist_name}").format(artist_name=name), ) self.connect("activated", lambda *_: on_click(name)) icon = Gtk.Image.new_from_icon_name("person-symbolic") icon.set_pixel_size(24) icon.set_margin_top(6) icon.set_margin_bottom(6) self.add_prefix(icon) cozy-1.3.0/cozy/ui/widgets/seek_bar.py000066400000000000000000000072371457036466300177220ustar00rootroot00000000000000from gi.repository import Gdk, GObject, Gtk from cozy.control.string_representation import seconds_to_str @Gtk.Template.from_resource('/com/github/geigi/cozy/seek_bar.ui') class SeekBar(Gtk.Box): __gtype_name__ = "SeekBar" progress_scale: Gtk.Scale = Gtk.Template.Child() current_label: Gtk.Label = Gtk.Template.Child() remaining_label: Gtk.Label = Gtk.Template.Child() remaining_event_box: Gtk.Box = Gtk.Template.Child() length: float def __init__(self, **kwargs): super().__init__(**kwargs) self.length: float = 0.0 self._progress_scale_pressed = False self.progress_scale.connect("value-changed", self._on_progress_scale_changed) # HACK: Using a GtkGestureClick here is not possible, as GtkRange's internal # gesture controller claims the button press event, and thus the released signal doesn't get emitted. # Therefore we get its internal GtkGestureClick, and add our handlers to that. # Hacky workaround from: https://gitlab.gnome.org/GNOME/gtk/-/issues/4939 # Ideally GtkRange would forward these signals, so we wouldn't need this hack # TODO: Add these signals to Gtk and make a MR? for controller in self.progress_scale.observe_controllers(): if isinstance(controller, Gtk.GestureClick): click_gesture = controller break click_gesture.set_button(0) # Enable all mouse buttons click_gesture.connect("pressed", self._on_progress_scale_press) click_gesture.connect("released", self._on_progress_scale_release) keyboard_controller = Gtk.EventControllerKey() keyboard_controller.connect("key-pressed", self._on_progress_key_pressed) self.progress_scale.add_controller(keyboard_controller) @property def position(self) -> float: return self.progress_scale.get_value() @position.setter def position(self, new_value: float): if not self._progress_scale_pressed: self.progress_scale.set_value(new_value) @property def sensitive(self) -> bool: return self.progress_scale.get_sensitive() @sensitive.setter def sensitive(self, new_value: bool): self.progress_scale.set_sensitive(new_value) @property def visible(self) -> bool: return self.progress_scale.get_visible() @visible.setter def visible(self, value: bool): self.current_label.set_visible(value) self.progress_scale.set_visible(value) self.remaining_event_box.set_visible(value) def _on_progress_scale_changed(self, _): total = self.length position = int(total * self.progress_scale.get_value() / 100) remaining_secs = int(total - position) self.current_label.set_text(seconds_to_str(position, total)) self.remaining_label.set_text(seconds_to_str(remaining_secs, total)) def _on_progress_scale_release(self, *_): self._progress_scale_pressed = False value = self.progress_scale.get_value() self.emit("position-changed", value) def _on_progress_key_pressed(self, _, event, *__): if event in {Gdk.KEY_Up, Gdk.KEY_Left}: self.emit("rewind") elif event in {Gdk.KEY_Down, Gdk.KEY_Right}: self.emit("forward") def _on_progress_scale_press(self, *_): self._progress_scale_pressed = True GObject.signal_new('position-changed', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)) GObject.signal_new('rewind', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) GObject.signal_new('forward', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) cozy-1.3.0/cozy/ui/widgets/sleep_timer.py000066400000000000000000000074531457036466300204570ustar00rootroot00000000000000from cozy.ext import inject from cozy.view_model.sleep_timer_view_model import SleepTimerViewModel, SystemPowerControl from gi.repository import Gtk @Gtk.Template.from_resource('/com/github/geigi/cozy/timer_popover.ui') class SleepTimer(Gtk.Popover): __gtype_name__ = "SleepTimer" _view_model = inject.attr(SleepTimerViewModel) timer_scale: Gtk.Scale = Gtk.Template.Child() timer_label: Gtk.Label = Gtk.Template.Child() timer_grid: Gtk.Grid = Gtk.Template.Child() min_label: Gtk.Label = Gtk.Template.Child() chapter_switch: Gtk.Switch = Gtk.Template.Child() power_control_switch: Gtk.Switch = Gtk.Template.Child() power_control_options: Gtk.Box = Gtk.Template.Child() system_shutdown_radiob: Gtk.CheckButton = Gtk.Template.Child() system_suspend_radiob: Gtk.CheckButton = Gtk.Template.Child() def __init__(self, timer_image: Gtk.Image): super().__init__() self._timer_image: Gtk.Image = timer_image self._init_timer_scale() self._connect_widgets() self._connect_view_model() self._on_timer_scale_changed(self.timer_scale) def _connect_widgets(self): self.timer_scale.connect("value-changed", self._on_timer_scale_changed) self.chapter_switch.connect("state-set", self._on_chapter_switch_changed) self.power_control_switch.connect("state-set", self._on_power_options_switch_changed) self.system_suspend_radiob.connect("toggled", self._on_system_action_radio_button_changed) self.system_shutdown_radiob.connect("toggled", self._on_system_action_radio_button_changed) def _connect_view_model(self): self._view_model.bind_to("stop_after_chapter", self._on_stop_after_chapter_changed) self._view_model.bind_to("remaining_seconds", self._on_remaining_seconds_changed) self._view_model.bind_to("timer_enabled", self._on_timer_enabled_changed) def _init_timer_scale(self): for i in range(0, 121, 30): self.timer_scale.add_mark(i, Gtk.PositionType.RIGHT, None) def _on_timer_scale_changed(self, scale: Gtk.Scale): value = scale.get_value() if value > 0: self.timer_label.set_visible(True) self.min_label.set_text(_("min")) text = str(int(value)) self.timer_label.set_text(text) self._view_model.remaining_seconds = value * 60 else: self.min_label.set_text(_("Off")) self.timer_label.set_visible(False) self._view_model.remaining_seconds = 0 def _on_chapter_switch_changed(self, _, state): self.timer_grid.set_sensitive(not state) self._view_model.stop_after_chapter = state def _on_remaining_seconds_changed(self): if self._view_model.remaining_seconds < 1: value = 0 else: value = int((self._view_model.remaining_seconds / 60)) + 1 self.timer_scale.set_value(value) def _on_power_options_switch_changed(self, _, state): self.power_control_options.set_sensitive(state) if not state: self._view_model.system_power_control = SystemPowerControl.OFF else: self._on_system_action_radio_button_changed(None) def _on_system_action_radio_button_changed(self, _): if self.system_suspend_radiob.get_active(): self._view_model.system_power_control = SystemPowerControl.SUSPEND else: self._view_model.system_power_control = SystemPowerControl.SHUTDOWN def _on_stop_after_chapter_changed(self): self.chapter_switch.set_active(self._view_model.stop_after_chapter) def _on_timer_enabled_changed(self): if self._view_model.timer_enabled: icon = "bed-symbolic" else: icon = "no-bed-symbolic" self._timer_image.set_from_icon_name(icon) cozy-1.3.0/cozy/ui/widgets/storages.py000066400000000000000000000144701457036466300177730ustar00rootroot00000000000000from typing import Callable from gi.repository import Adw, Gio, GLib, GObject, Gtk from cozy.ext import inject from cozy.model.storage import Storage from cozy.view_model.storages_view_model import StoragesViewModel def ask_storage_location(callback: Callable[[str | None], None], initial_folder: str | None = None): location_chooser = Gtk.FileDialog(title=_("Set Audiobooks Directory")) if initial_folder: gfile = Gio.File.new_for_path(initial_folder) location_chooser.set_initial_folder(gfile) def finish_callback(dialog, result): try: file = dialog.select_folder_finish(result) except GLib.GError: pass else: callback(None if file is None else file.get_path()) location_chooser.select_folder(inject.instance("MainWindow").window, None, finish_callback) @Gtk.Template.from_resource("/com/github/geigi/cozy/storage_row.ui") class StorageRow(Adw.ActionRow): __gtype_name__ = "StorageRow" icon: Gtk.Image = Gtk.Template.Child() default_icon: Gtk.Image = Gtk.Template.Child() menu_button: Gtk.MenuButton = Gtk.Template.Child() def __init__(self, model: Storage, menu_model: Gio.Menu) -> None: self._model = model super().__init__(title=model.path) self.connect("activated", self.ask_for_new_location) self.menu_button.set_menu_model(menu_model) self.menu_button.connect("notify::active", self._on_menu_opened) self._set_default_icon() self._set_drive_icon() @property def model(self) -> Storage: return self._model def ask_for_new_location(self, *_) -> None: ask_storage_location(self._on_folder_changed, initial_folder=self._model.path) def _on_folder_changed(self, new_path: str | None) -> None: if new_path is not None: self.emit("location-changed", new_path) def _on_menu_opened(self, *_) -> None: self.emit("menu-opened") def _set_drive_icon(self) -> None: if self._model.external: self.icon.set_from_icon_name("network-server-symbolic") self.icon.set_tooltip_text(_("External drive")) else: self.icon.set_from_icon_name("folder-open-symbolic") self.icon.set_tooltip_text(_("Internal drive")) def _set_default_icon(self) -> None: self.default_icon.set_visible(self._model.default) GObject.signal_new( "location-changed", StorageRow, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,), ) GObject.signal_new("menu-opened", StorageRow, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) @Gtk.Template.from_resource("/com/github/geigi/cozy/storage_locations.ui") class StorageLocations(Adw.PreferencesGroup): __gtype_name__ = "StorageLocations" _view_model: StoragesViewModel = inject.attr(StoragesViewModel) storage_locations_list: Gtk.ListBox = Gtk.Template.Child() storage_menu: Gio.Menu = Gtk.Template.Child() def __init__(self) -> None: super().__init__() self._view_model.bind_to("storage_locations", self._reload_storage_list) self._view_model.bind_to("storage_attributes", self._reload_storage_list) self._create_actions() self.new_storage_button = self._create_new_storage_button() self._reload_storage_list() def _create_actions(self) -> None: self.action_group = Gio.SimpleActionGroup.new() self.insert_action_group("storage", self.action_group) self.set_external_action = Gio.SimpleAction.new_stateful( "mark-external", None, GLib.Variant.new_boolean(False) ) self._set_external_signal_handler = self.set_external_action.connect( "notify::state", self._mark_storage_location_external ) self.action_group.add_action(self.set_external_action) self.remove_action = Gio.SimpleAction.new("remove", None) self.remove_action.connect("activate", self._remove_storage_location) self.action_group.add_action(self.remove_action) self.make_default_action = Gio.SimpleAction.new("make-default", None) self.make_default_action.connect("activate", self._set_default_storage_location) self.action_group.add_action(self.make_default_action) def _create_new_storage_button(self) -> Adw.ActionRow: icon = Gtk.Image(icon_name="list-add-symbolic", margin_top=18, margin_bottom=18) row = Adw.ActionRow(selectable=False, activatable=True) row.connect("activated", self._on_new_storage_clicked) row.set_child(icon) return row def _reload_storage_list(self) -> None: self.storage_locations_list.remove_all() for storage in self._view_model.storages: row = StorageRow(storage, menu_model=self.storage_menu) row.connect("location-changed", self._on_storage_location_changed) row.connect("menu-opened", self._on_storage_menu_opened) self.storage_locations_list.append(row) self.storage_locations_list.append(self.new_storage_button) def _remove_storage_location(self, *_) -> None: self._view_model.remove(self._view_model.selected_storage) def _set_default_storage_location(self, *_) -> None: self._view_model.set_default(self._view_model.selected_storage) def _mark_storage_location_external( self, action: Gio.SimpleAction, value: GObject.ParamSpec ) -> None: value = action.get_property(value.name) self._view_model.set_external(self._view_model.selected_storage, value) def _on_new_storage_clicked(self, *_) -> None: ask_storage_location(self._view_model.add_storage_location) def _on_storage_location_changed(self, widget: StorageRow, new_location: str) -> None: self._view_model.change_storage_location(widget.model, new_location) def _on_storage_menu_opened(self, widget: StorageRow) -> None: with self.set_external_action.handler_block(self._set_external_signal_handler): self.set_external_action.props.state = GLib.Variant.new_boolean(widget.model.external) self.remove_action.props.enabled = ( not widget.model.default and len(self._view_model.storages) > 1 ) self.make_default_action.props.enabled = widget.model is not self._view_model.default self._view_model.selected_storage = widget.model cozy-1.3.0/cozy/version.py000066400000000000000000000000311457036466300155320ustar00rootroot00000000000000__version__ = "@VERSION@"cozy-1.3.0/cozy/view.py000066400000000000000000000003421457036466300150240ustar00rootroot00000000000000from enum import Enum, auto class View(Enum): EMPTY_STATE = auto() PREPARING_LIBRARY = auto() LIBRARY = auto() LIBRARY_FILTER = auto() LIBRARY_BOOKS = auto() BOOK_DETAIL = auto() NO_MEDIA = auto()cozy-1.3.0/cozy/view_model/000077500000000000000000000000001457036466300156335ustar00rootroot00000000000000cozy-1.3.0/cozy/view_model/__init__.py000066400000000000000000000000001457036466300177320ustar00rootroot00000000000000cozy-1.3.0/cozy/view_model/app_view_model.py000066400000000000000000000010531457036466300211760ustar00rootroot00000000000000from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.view import View class AppViewModel(Observable, EventSender): def __init__(self): super().__init__() super(Observable, self).__init__() self._view = View.EMPTY_STATE @property def view(self) -> View: return self._view @view.setter def view(self, new_value: View): self._view = new_value self._notify("view") self.emit_event_main_thread("view", self._view) cozy-1.3.0/cozy/view_model/book_detail_view_model.py000066400000000000000000000151511457036466300226760ustar00rootroot00000000000000from cozy import tools from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.control.filesystem_monitor import FilesystemMonitor from cozy.control.offline_cache import OfflineCache from cozy.ext import inject from cozy.media.player import Player from cozy.model.book import Book from cozy.model.chapter import Chapter from cozy.model.library import Library from cozy.model.settings import Settings from cozy.open_view import OpenView class BookDetailViewModel(Observable, EventSender): _player: Player = inject.attr(Player) _fs_monitor: FilesystemMonitor = inject.attr("FilesystemMonitor") _offline_cache: OfflineCache = inject.attr(OfflineCache) _settings: Settings = inject.attr(Settings) _library = Library = inject.attr(Library) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self): super().__init__() super(Observable, self).__init__() self._play = False self._current_chapter = None self._book: Book | None = None self._lock_ui: bool = False self._player.add_listener(self._on_player_event) self._fs_monitor.add_listener(self._on_fs_monitor_event) self._offline_cache.add_listener(self._on_offline_cache_event) self._app_settings.add_listener(self._on_app_setting_changed) @property def playing(self) -> bool: if not self._player.loaded_book or self._player.loaded_book != self._book: return False return self._player.playing @property def current_chapter(self) -> Chapter | None: if not self.book: return None return self.book.current_chapter @property def book(self) -> Book | None: return self._book @book.setter def book(self, value: Book): if self._book == value: return if self._book: self._book.remove_bind("current_chapter", self._on_book_current_chapter_changed) self._book.remove_bind("last_played", self._on_book_last_played_changed) self._book.remove_bind("duration", self._on_book_duration_changed) self._book.remove_bind("progress", self._on_book_progress_changed) self._book.remove_bind("playback_speed", self._on_playback_speed_changed) self._book = value self._current_chapter = None self._book.bind_to("current_chapter", self._on_book_current_chapter_changed) self._book.bind_to("last_played", self._on_book_last_played_changed) self._book.bind_to("duration", self._on_book_duration_changed) self._book.bind_to("progress", self._on_book_progress_changed) self._book.bind_to("playback_speed", self._on_playback_speed_changed) self._notify("book") @property def last_played_text(self) -> str | None: if not self._book: return None return tools.past_date_to_human_readable(self._book.last_played) @property def total_text(self) -> str | None: if not self._book: return None return tools.seconds_to_human_readable(self._book.duration / self._book.playback_speed) @property def remaining_text(self) -> str | None: if not self._book: return None remaining = self._book.duration - self._book.progress return tools.seconds_to_human_readable(remaining / self._book.playback_speed) @property def progress_percent(self) -> float | None: if not self._book: return None elif self._book.duration < 1: return 1.0 return self._book.progress / self._book.duration @property def disk_count(self) -> int: if not self._book: return 0 return len({chapter.disk for chapter in self._book.chapters}) @property def is_book_available(self) -> bool: if self._book.offline and self._book.downloaded: return True return self._fs_monitor.get_book_online(self._book) @property def is_book_external(self) -> bool: first_chapter_path = self._book.chapters[0].file for storage in self._settings.external_storage_locations: if storage.path in first_chapter_path: return True return False @property def lock_ui(self) -> bool: return self._lock_ui @lock_ui.setter def lock_ui(self, new_value: bool): self._lock_ui = new_value self._notify("lock_ui") def download_book(self, download: bool): self._book.offline = download if download: self._offline_cache.add(self._book) else: self._offline_cache.remove(self._book) def open_library(self): self.emit_event(OpenView.LIBRARY) def play_book(self): self._player.play_pause_book(self.book) def play_chapter(self, chapter: Chapter): if self._book.current_chapter != chapter: chapter.position = chapter.start_position self._player.play_pause_chapter(self._book, chapter) def open_book_detail_view(self): self._notify("open") def _on_player_event(self, event, message): if not self.book: return if event in {"play", "pause"}: self._notify("playing") elif event in {"position", "book-finished"}: self._notify("progress_percent") self._notify("remaining_text") def _on_fs_monitor_event(self, event, _): if not self._book: return if event in {"storage-online", "storage-offline"}: self._notify("is_book_available") def _on_book_current_chapter_changed(self): self._notify("current_chapter") def _on_book_last_played_changed(self): self._notify("last_played_text") def _on_book_progress_changed(self): self._notify("remaining_text") self._notify("progress_percent") def _on_book_duration_changed(self): self._notify("progress_percent") self._notify("remaining_text") self._notify("total_text") def _on_playback_speed_changed(self): self._notify("progress_percent") self._notify("remaining_text") self._notify("total_text") def _on_offline_cache_event(self, event, message): if not (message and self._book) or self._book.id != message.id: return if event in {"book-offline-removed", "book-offline"}: self._notify("downloaded") def _on_app_setting_changed(self, event, _): if event == "swap-author-reader": self._notify("book") cozy-1.3.0/cozy/view_model/headerbar_view_model.py000066400000000000000000000073731457036466300223460ustar00rootroot00000000000000from enum import Enum, auto from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.control.offline_cache import OfflineCache from cozy.ext import inject from cozy.media.files import Files from cozy.media.importer import Importer, ScanStatus from cozy.model.library import Library from cozy.open_view import OpenView from cozy.view import View class HeaderBarState(Enum): PLAYING = auto() WORKING = auto() class HeaderbarViewModel(Observable, EventSender): _importer: Importer = inject.attr(Importer) _files: Files = inject.attr(Files) _library: Library = inject.attr(Library) _offline_cache: OfflineCache = inject.attr(OfflineCache) def __init__(self): super().__init__() super(Observable, self).__init__() self._state: HeaderBarState = HeaderBarState.PLAYING self._work_progress: float = 0.0 self._work_message: str = "" self._view: View = View.EMPTY_STATE self._importer.add_listener(self._on_importer_event) self._files.add_listener(self._on_files_event) self._library.add_listener(self._on_library_event) self._offline_cache.add_listener(self._on_offline_cache_event) @property def lock_ui(self) -> bool: return self._view in {View.NO_MEDIA, View.EMPTY_STATE, View.PREPARING_LIBRARY} @property def state(self) -> HeaderBarState: return self._state @property def work_progress(self) -> float: return min(self._work_progress, 1.0) @property def work_message(self) -> str: return self._work_message def set_view(self, value: View): self._view = value self._notify("lock_ui") def _start_working(self, message: str): self._work_progress = 0.0 self._state = HeaderBarState.WORKING self._work_message = message self._notify("work_message") self._notify("work_progress") self._notify("state") self.emit_event_main_thread("working", True) def _stop_working(self): self._state = HeaderBarState.PLAYING self._notify("state") self.emit_event_main_thread("working", False) def _on_importer_event(self, event: str, message): if event == "scan-progress" and isinstance(message, float): self._work_progress = message self._notify("work_progress") elif event == "scan" and message == ScanStatus.STARTED: self._start_working(_("Refreshing audio book collection")) elif event == "scan" and message == ScanStatus.SUCCESS: self._stop_working() def _on_files_event(self, event: str, message): if event == "copy-progress" and isinstance(message, float): self._work_progress = message self._notify("work_progress") elif event == "start-copy": self._start_working(_("Copying new files…")) def _on_library_event(self, event: str, message): if event == "rebase-progress" and isinstance(message, float): self._work_progress = message self._notify("work_progress") elif event == "rebase-started": self._start_working(_("Changing audio book location…")) elif event == "rebase-finished": self._stop_working() def _on_offline_cache_event(self, event: str, message): if event == "progress" and isinstance(message, float): self._work_progress = message self._notify("work_progress") elif event == "start": self._start_working(_("Copying new files…")) elif event == "message": self._work_message = message self._notify("work_message") elif event == "finished": self._stop_working() cozy-1.3.0/cozy/view_model/library_view_model.py000066400000000000000000000201131457036466300220600ustar00rootroot00000000000000import logging import os from enum import Enum, auto from typing import Optional import cozy.ext.inject as inject from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.control.filesystem_monitor import FilesystemMonitor from cozy.extensions.set import split_strings_to_set from cozy.media.importer import Importer, ScanStatus from cozy.media.player import Player from cozy.model.book import Book from cozy.model.library import Library from cozy.model.storage import Storage from cozy.open_view import OpenView from cozy.report import reporter from cozy.ui.widgets.book_element import BookElement from cozy.ui.import_failed_dialog import ImportFailedDialog from cozy.view_model.storages_view_model import StoragesViewModel log = logging.getLogger("library_view_model") class LibraryViewMode(Enum): CURRENT = auto() AUTHOR = auto() READER = auto() class LibraryViewModel(Observable, EventSender): _application_settings: ApplicationSettings = inject.attr(ApplicationSettings) _fs_monitor: FilesystemMonitor = inject.attr("FilesystemMonitor") _model = inject.attr(Library) _importer: Importer = inject.attr(Importer) _player: Player = inject.attr(Player) _storages: StoragesViewModel = inject.attr(StoragesViewModel) def __init__(self): super().__init__() super(Observable, self).__init__() self._library_view_mode: LibraryViewMode = LibraryViewMode.CURRENT self._selected_filter: str = _("All") self._connect() def _connect(self): self._fs_monitor.add_listener(self._on_fs_monitor_event) self._application_settings.add_listener(self._on_application_setting_changed) self._importer.add_listener(self._on_importer_event) self._player.add_listener(self._on_player_event) self._model.add_listener(self._on_model_event) self._storages.add_listener(self._on_storages_event) @property def books(self): return self._model.books @property def library_view_mode(self): return self._library_view_mode @library_view_mode.setter def library_view_mode(self, value): self._library_view_mode = value self._notify("library_view_mode") self.emit_event(OpenView.LIBRARY, None) @property def selected_filter(self): return self._selected_filter @selected_filter.setter def selected_filter(self, value): self._selected_filter = value self._notify("selected_filter") @property def is_any_book_in_progress(self) -> bool: for book in self.books: if book.position > 0: return True return False @property def authors(self): is_book_online = self._fs_monitor.get_book_online show_offline_books = not self._application_settings.hide_offline authors = { book.author for book in self._model.books if is_book_online(book) or show_offline_books or book.downloaded } return sorted(split_strings_to_set(authors)) @property def readers(self): is_book_online = self._fs_monitor.get_book_online show_offline_books = not self._application_settings.hide_offline readers = { book.reader for book in self._model.books if is_book_online(book) or show_offline_books or book.downloaded } return sorted(split_strings_to_set(readers)) @property def current_book_in_playback(self) -> Optional[Book]: return self._player.loaded_book @property def playing(self) -> bool: return self._player.playing def remove_book(self, book: Book): book.remove() self._model.invalidate() self._notify("authors") self._notify("readers") self._notify("books") self._notify("books-filter") def display_book_filter(self, book_element: BookElement): book = book_element.book hide_offline_books = self._application_settings.hide_offline book_is_online = self._fs_monitor.get_book_online(book) if self.selected_filter == _("All"): return True elif hide_offline_books and not book_is_online and not book.downloaded: return False elif self.library_view_mode == LibraryViewMode.CURRENT: return book.last_played > 0 elif self.library_view_mode == LibraryViewMode.AUTHOR: return self.selected_filter in book.author elif self.library_view_mode == LibraryViewMode.READER: return self.selected_filter in book.reader def display_book_sort(self, book_element1, book_element2): if self._library_view_mode == LibraryViewMode.CURRENT: return book_element1.book.last_played < book_element2.book.last_played else: return book_element1.book.name.lower() > book_element2.book.name.lower() def open_library(self): self._notify("library_view_mode") def book_files_exist(self, book: Book) -> bool: for chapter in book.chapters: if os.path.isfile(chapter.file): return True return False def _on_fs_monitor_event(self, event, _): if event == "storage-online": self._notify("authors") self._notify("readers") self._notify("books-filter") elif event == "storage-offline": self._notify("authors") self._notify("readers") self._notify("books-filter") def _on_application_setting_changed(self, event, _): if event == "hide-offline": self._notify("authors") self._notify("readers") self._notify("books-filter") elif event == "swap-author-reader": self._notify("authors") self._notify("readers") self._notify("books") self._notify("books-filter") elif event == "prefer-external-cover": self._notify("books") def _on_importer_event(self, event, message): if event == "scan" and message == ScanStatus.SUCCESS: self._notify("authors") self._notify("readers") self._notify("books") self._notify("books-filter") self._notify("library_view_mode") elif event == "import-failed": ImportFailedDialog(message).show() def _on_player_event(self, event, message): if event == "play" and message: self._notify("current_book_in_playback") self._notify("playing") self._notify("books-filter") elif event == "pause": self._notify("playing") elif event == "chapter-changed": self._notify("current_book_in_playback") self._notify("playing") elif event == "stop": self._notify("playing") self._notify("current_book_in_playback") elif event in {"position", "book-finished"}: self._notify("book-progress") def _on_storages_event(self, event: str, message): if event == "storage-removed": for property in ( "authors", "readers", "books", "books-filter", "current_book_in_playback", "playing", ): self._notify(property) def _on_model_event(self, event: str, message): if event == "rebase-finished": self.emit_event("work-done") def open_book_detail(self, book: Book): self.emit_event(OpenView.BOOK, book) def delete_book_files(self, book: Book): for chapter in book.chapters: try: os.remove(chapter.file) except Exception as e: log.error("Failed to delete file: %s", chapter.file) log.debug(e) reporter.warning("library_view_model", "Failed to delete a file.") else: log.info("Deleted file: %s", chapter.file) def play_book(self, book: Book): self._player.play_pause_book(book) cozy-1.3.0/cozy/view_model/playback_control_view_model.py000066400000000000000000000071621457036466300237530ustar00rootroot00000000000000from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.ext import inject from cozy.media.player import Player from cozy.model.book import Book from cozy.open_view import OpenView NS_TO_SEC = 10 ** 9 class PlaybackControlViewModel(Observable, EventSender): _player: Player = inject.attr(Player) def __init__(self): super().__init__() super(Observable, self).__init__() self._book: Book | None = None self._player.add_listener(self._on_player_event) if self._player.loaded_book: self.book = self._player.loaded_book @property def book(self) -> Book | None: return self._book @book.setter def book(self, value: Book | None): self._book = value self._notify("lock_ui") @property def playing(self) -> bool: if not self._player.loaded_book: return False return self._player.playing @property def position(self) -> float | None: if not self._book: return None position = self._book.current_chapter.position - self._book.current_chapter.start_position return position / NS_TO_SEC / self._book.playback_speed @position.setter def position(self, new_value: int): if not self._book: return self._player.position = new_value * self._book.playback_speed @property def length(self) -> float | None: if not self._player.loaded_book or not self._book: return None return self._player.loaded_book.current_chapter.length / self._book.playback_speed @property def relative_position(self) -> float | None: if not self._player.loaded_book or not self._book: return None position = self._book.current_chapter.position - self._book.current_chapter.start_position length = self._player.loaded_book.current_chapter.length return position / NS_TO_SEC / length * 100 @relative_position.setter def relative_position(self, new_value: float) -> None: if not self._book: return length = self._player.loaded_book.current_chapter.length self._player.position = new_value / 100 * length @property def lock_ui(self) -> bool: return not self._book @property def volume(self) -> float: return self._player.volume @volume.setter def volume(self, new_value: float): self._player.volume = new_value def play_pause(self): self._player.play_pause() def rewind(self): self._player.rewind() def forward(self): self._player.forward() def open_book_detail(self): if self.book: self.emit_event(OpenView.BOOK, self.book) def _on_player_event(self, event, message): if event in {"play", "pause"}: if self.book: self._notify("playing") elif event == "position": if self.book: self._notify("position") self._notify("progress_percent") self._notify("remaining_text") elif event == "chapter-changed": if message: self.book = message self._notify("book") self._notify("position") self._notify("length") self._notify("volume") elif event == "stop": self.book = None self._notify("book") self._notify("position") self._notify("length") def _on_playback_speed_changed(self): self._notify("position") self._notify("length") cozy-1.3.0/cozy/view_model/playback_speed_view_model.py000066400000000000000000000020071457036466300233640ustar00rootroot00000000000000from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.db.book import Book from cozy.ext import inject from cozy.media.player import Player class PlaybackSpeedViewModel(Observable, EventSender): _player: Player = inject.attr(Player) def __init__(self): super().__init__() super(Observable, self).__init__() self._book: Book = self._player.loaded_book self._player.add_listener(self._on_player_event) @property def playback_speed(self) -> float: if self._book: return self._book.playback_speed return 1.0 @playback_speed.setter def playback_speed(self, new_value: float): if self._book: self._book.playback_speed = new_value self._player.playback_speed = new_value def _on_player_event(self, event: str, message): if event == "chapter-changed" and message: self._book = message self._notify("playback_speed") cozy-1.3.0/cozy/view_model/search_view_model.py000066400000000000000000000051001457036466300216600ustar00rootroot00000000000000from typing import Callable from gi.repository import GLib import cozy.ext.inject as inject from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.control.filesystem_monitor import FilesystemMonitor from cozy.extensions.set import split_strings_to_set from cozy.model.book import Book from cozy.model.library import Library from cozy.open_view import OpenView class SearchViewModel(Observable, EventSender): _fs_monitor: FilesystemMonitor = inject.attr("FilesystemMonitor") _model: Library = inject.attr(Library) _application_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self): super().__init__() super(Observable, self).__init__() def _get_available_books(self) -> list[Book]: is_book_online = self._fs_monitor.get_book_online if self._application_settings.hide_offline: return [book for book in self._model.books if is_book_online(book)] else: return self._model.books def search( self, search_query: str, callback: Callable[[list[Book], list[str], list[str]], None] ) -> None: search_query = search_query.lower() available_books = self._get_available_books() books = { book for book in available_books if search_query in book.name.lower() or search_query in book.author.lower() or search_query in book.reader.lower() } available_book_authors = split_strings_to_set({book.author for book in available_books}) authors = {author for author in available_book_authors if search_query in author.lower()} available_book_readers = split_strings_to_set({book.reader for book in available_books}) readers = {reader for reader in available_book_readers if search_query in reader.lower()} GLib.MainContext.default().invoke_full( GLib.PRIORITY_DEFAULT, callback, sorted(books, key=lambda book: book.name.lower()), sorted(authors), sorted(readers), ) def close(self) -> None: self._notify("close") def jump_to_book(self, book: Book) -> None: self.emit_event(OpenView.BOOK, book) self.close() def jump_to_author(self, author: str) -> None: self.emit_event(OpenView.AUTHOR, author) self.close() def jump_to_reader(self, reader: str) -> None: self.emit_event(OpenView.READER, reader) self.close() cozy-1.3.0/cozy/view_model/settings_view_model.py000066400000000000000000000027671457036466300222730ustar00rootroot00000000000000import logging from gi.repository import Adw, Gtk from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.ext import inject from cozy.media.importer import Importer from cozy.model.settings import Settings log = logging.getLogger("settings_view_model") class SettingsViewModel(Observable, EventSender): _importer: Importer = inject.attr(Importer) _model: Settings = inject.attr(Settings) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) def __init__(self): super().__init__() super(Observable, self).__init__() self._lock_ui: bool = False self.style_manager = Adw.StyleManager.get_default() self._set_dark_mode() self._app_settings.add_listener(self._on_app_setting_changed) if self._model.first_start: self._importer.scan() @property def lock_ui(self) -> bool: return self._lock_ui @lock_ui.setter def lock_ui(self, new_value: bool): self._lock_ui = new_value self._notify("lock_ui") def _set_dark_mode(self): if self._app_settings.dark_mode: self.style_manager.set_color_scheme(Adw.ColorScheme.PREFER_DARK) else: self.style_manager.set_color_scheme(Adw.ColorScheme.PREFER_LIGHT) def _on_app_setting_changed(self, event: str, data): if event == "dark-mode": self._set_dark_mode() cozy-1.3.0/cozy/view_model/sleep_timer_view_model.py000066400000000000000000000110441457036466300227270ustar00rootroot00000000000000import logging import os from enum import Enum, auto from typing import Optional from cozy import tools from cozy.application_settings import ApplicationSettings from cozy.architecture.observable import Observable from cozy.ext import inject from cozy.media.player import Player from cozy.tools import IntervalTimer log = logging.getLogger("sleep_timer_view_model") class SystemPowerControl(Enum): OFF = auto() SUSPEND = auto() SHUTDOWN = auto() class SleepTimerViewModel(Observable): _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) _player: Player = inject.attr(Player) def __init__(self): super().__init__() self._remaining_seconds: int = 0 self._system_power_control: SystemPowerControl = SystemPowerControl.OFF self._sleep_timer: Optional[IntervalTimer] = None self._wait_for_fadeout_end: bool = False self._player.add_listener(self._on_player_changed) @property def timer_enabled(self) -> bool: return self.remaining_seconds > 0 or self.stop_after_chapter @property def remaining_seconds(self) -> int: return self._remaining_seconds @remaining_seconds.setter def remaining_seconds(self, new_value: int): self._remaining_seconds = new_value if new_value > 0: self._start_timer() else: self._stop_timer() self._notify("timer_enabled") @property def system_power_control(self) -> SystemPowerControl: return self._system_power_control @system_power_control.setter def system_power_control(self, new_value: SystemPowerControl): self._system_power_control = new_value @property def stop_after_chapter(self) -> bool: return not self._player.play_next_chapter @stop_after_chapter.setter def stop_after_chapter(self, new_value: bool): self._player.play_next_chapter = not new_value self._stop_timer() self.remaining_seconds = 0 self._notify("remaining_seconds") self._notify("timer_enabled") def destroy(self): self._stop_timer() def _start_timer(self): if self._sleep_timer or self.remaining_seconds < 1 or not self._player.playing: return log.info("Start Timer") self._sleep_timer = tools.IntervalTimer(1, self._on_timer_tick) self._sleep_timer.start() def _stop_timer(self): if not self._sleep_timer: return log.info("Stop Timer") self._sleep_timer.stop() self._sleep_timer = None def _on_timer_tick(self): self.remaining_seconds = self.remaining_seconds - 1 self._notify_main_thread("remaining_seconds") fadeout = self._get_fadeout() if self.remaining_seconds - fadeout < 1: self._stop_playback() self._stop_timer() self._notify("timer_enabled") if not self._wait_for_fadeout_end: self._handle_system_power_event() else: self.remaining_seconds = 0 self._notify_main_thread("remaining_seconds") def _get_fadeout(self) -> int: if self._app_settings.sleep_timer_fadeout: return self._app_settings.sleep_timer_fadeout_duration return 0 def _stop_playback(self): fadeout = self._get_fadeout() self._wait_for_fadeout_end = fadeout > 0 self._player.pause(fadeout=fadeout > 0) def _handle_system_power_event(self): platform = tools.system_platform() command = "" if self.system_power_control == SystemPowerControl.SHUTDOWN: log.info("system will attempt to shutdown now!") if platform is tools.Platform.Linux: command = "systemctl poweroff" else: command = "shutdown -h now" elif self.system_power_control == SystemPowerControl.SUSPEND: log.info("system will attempt to suspend now!") if platform is tools.Platform.Linux: command = "systemctl suspend" if command: os.system(command) def _on_player_changed(self, event, _): if event == "chapter-changed": self.stop_after_chapter = False self._notify("stop_after_chapter") elif event == "play": self._start_timer() elif event in {"pause", "stop"}: self._stop_timer() elif event == "fadeout-finished" and self._wait_for_fadeout_end: self._wait_for_fadeout_end = False self._handle_system_power_event() cozy-1.3.0/cozy/view_model/storages_view_model.py000066400000000000000000000100511457036466300222430ustar00rootroot00000000000000import logging from threading import Thread from peewee import SqliteDatabase from cozy.application_settings import ApplicationSettings from cozy.architecture.event_sender import EventSender from cozy.architecture.observable import Observable from cozy.control.filesystem_monitor import FilesystemMonitor from cozy.ext import inject from cozy.media.importer import Importer from cozy.model.library import Library from cozy.model.settings import Settings from cozy.model.storage import Storage log = logging.getLogger("storages_view_model") class StoragesViewModel(Observable, EventSender): _library: Library = inject.attr(Library) _importer: Importer = inject.attr(Importer) _model: Settings = inject.attr(Settings) _app_settings: ApplicationSettings = inject.attr(ApplicationSettings) _db = inject.attr(SqliteDatabase) _fs_monitor = inject.attr(FilesystemMonitor) def __init__(self) -> None: super().__init__() super(Observable, self).__init__() self._selected_storage = None def _scan_new_storage(self, model: Storage) -> None: self.emit_event("storage-added", model) log.info("New audiobook location added. Starting import scan.") Thread(target=self._importer.scan, name="ImportThread").start() def _rebase_storage_location(self, model: Storage, old_path: str) -> None: self.emit_event("storage-changed", model) log.info("Audiobook location changed, rebasing the location in Cozy.") Thread( target=self._library.rebase_path, args=(old_path, model.path), name="RebaseStorageLocationThread", ).start() def add_storage_location(self, path: str | None) -> None: if path is None: return model = Storage.new(self._db, path) model.external = self._fs_monitor.is_external(path) self._model.invalidate() self._notify("storage_locations") self._scan_new_storage(model) def add_first_storage_location(self, path: str) -> None: storage = self.storages[0] storage.path = path storage.external = self._fs_monitor.is_external(path) assert storage.default self._model.invalidate() self._notify("storage_locations") def change_storage_location(self, model: Storage, new_path: str) -> None: old_path = model.path model.path = new_path model.external = self._fs_monitor.is_external(new_path) self._rebase_storage_location(model, old_path) self._notify("storage_attributes") @property def storages(self) -> list[Storage]: return self._model.storage_locations @property def default(self) -> Storage | None: for item in self.storages: if item.default: return item @property def selected_storage(self) -> Storage | None: return self._selected_storage @selected_storage.setter def selected_storage(self, value) -> None: self._selected_storage = value def remove(self, model: Storage) -> None: if model.default: return model.delete() self._model.invalidate() storage_path = str(model.path) for book in self._library.books: chapters_to_remove = [ c for c in book.chapters if c.file.startswith(storage_path) ] for chapter in chapters_to_remove: chapter.delete() self.emit_event("storage-removed", model) self._notify("storage_locations") def set_default(self, model: Storage) -> None: if model.default: return for storage in self.storages: storage.default = False model.default = True self._notify("storage_attributes") def set_external(self, model: Storage, external: bool) -> None: model.external = external if external: self.emit_event("external-storage-added", model) else: self.emit_event("external-storage-removed", model) self._notify("storage_attributes") cozy-1.3.0/data/000077500000000000000000000000001457036466300134265ustar00rootroot00000000000000cozy-1.3.0/data/com.github.geigi.cozy.appdata.xml000066400000000000000000000275571457036466300217060ustar00rootroot00000000000000 com.github.geigi.cozy Cozy CC0 GPL-3.0+ com.github.geigi.cozy.desktop com.github.geigi.cozy Julian Geywitz Julian Geywitz cozy@geigi.de Listen to audio books

Do you like audio books? Then lets get cozy!

Cozy is a audio book player. Here are some of the features:

  • Import all your audio books into Cozy to browse them comfortably
  • Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav audio books
  • Remembers your playback position
  • Sleep timer
  • Playback speed control for each book individually
  • Search your library
  • Multiple storage location support
  • Offline Mode! This allows you to keep an audio book on your internal storage if you store your audio books on an external or network drive. Perfect to listen to on the go!
  • Drag and Drop to import new audio books
  • Sort your audio books by author, reader and name
https://cozy.sh https://github.com/geigi/cozy/issues https://matrix.to/#/#cozy:gnome.org https://www.patreon.com/geigi https://github.com/geigi/cozy/ https://www.transifex.com/geigi/cozy/ https://raw.githubusercontent.com/geigi/cozy/img/img/screenshot1.png https://raw.githubusercontent.com/geigi/cozy/img/img/screenshot2.png https://raw.githubusercontent.com/geigi/cozy/img/img/screenshot3.png

After almost two years, a new version of Cozy is finally here! This release brings an updated user interface along with numerous bug fixes and improved performance.

The user interface has been ported to GTK4 and Libadwaita. Thus, Cozy benefits from the new style sheet, automatic dark mode, and utilizes the latest and greatest UI elements throughout the application. Many thanks to Benedek Dévényi and grahamvh!

Other changes include:

  • Improved mobile support
  • Smaller visual refinements to match the state of the art of GNOME apps
  • Dozens of bug fixes and performance improvements
  • Significant cleanup and improvements to the codebase
  • As always, updated translations thanks to all translators!
  • Support for GTK style manager (thanks A6GibKm)
  • Use natural sorting for chapter titles
  • As always, updated translations thanks to all the translators!

This release features a redesigned preference window. All settings can now be searched. Good news for mobile users too: the redesign should work a lot better on mobile devices now.

  • Redesigned preference window
  • Preferences can now be searched
  • Fix: position slider did not update the time correctly after an import scan
  • Fix: after an import scan the library did not display the currently playing book correctly
  • Multiple small bug fixes
  • As always, updated translations thanks to all of the translators!

A small bugfix release which makes Cozy more reliable.

  • Fresh playback speed and sleep timer icons (thanks jimmac)
  • Refreshing the library now uses a more descriptive text (thanks jubalh)
  • Multiple small bug fixes
  • As always, updated translations thanks to all of the translators!

A small bugfix release which makes Cozy more reliable.

  • Display an error banner if an error occurs while importing new files
  • The audiobook directory selector in the empty state has been replaced by a button to allow a narrow window even with long directory names
  • Fix: multiple small UI issues
  • Fix: the welcome screen now works properly on a mobile device
  • Fix: don't display the mobile library switcher when no files are imported
  • Fix: in the book detail view the pause icon for a chapter remained even when the next chapter already started playing
  • As always, updated translations thanks to all of the translators!

A small bugfix release which makes Cozy more reliable.

  • Display an error banner if an error occurs while importing new files
  • The audiobook directory selector in the empty state has been replaced by a button to allow a narrow window even with long directory names
  • Fix: multiple small UI issues
  • Fix: the welcome screen now works properly on a mobile device
  • Fix: don't display the mobile library switcher when no files are imported
  • Fix: in the book detail view the pause icon for a chapter remained even when the next chapter already started playing
  • As always, updated translations thanks to all of the translators!

This release features a redesigned library with responsiveness in mind.

  • Redesigned library
  • Redesigned start screen
  • Redesigned book detail screen
  • Responsive design for the main window
  • Introducing a welcome screen for new installations
  • Fix: a rare bug where Cozy's volume was muted at first start
  • Fix: long book names or author names will be truncated properly
  • As always, updated translations thanks to all of the translators!

Performance improvements for the book detail view and some bugfixes.

  • Chapters in the book detail view will now be loaded lazily (thanks chris-kobrzak!)
  • Books with a single chapter don't display a chapter number anymore (thanks chris-kobrzak!)
  • Fix: Locals in What's new in Cozy screen (thanks alyssais!)
  • Fix: Catch an error that could occur when a book stops
  • Small performance improvements
  • As always, updated translations thanks to all of the translators!

A small bugfix release which makes Cozy more reliable.

  • When an issue occurs during playback the error message is displayed to the user
  • Fix: Importing media without tags now properly decodes the file name as chapter name (thanks chris-kobrzak!)
  • Fix: Ensure that always a default storage location is present
  • Fix: During import an error could occur which stopped the import
  • Fix: During the database migration an error could occur
  • As always, updated translations thanks to all of the translators!

A small bugfix release which makes Cozy more reliable.

  • When copying files to the audiobook library goes wrong, the user is now informed with the error
  • Fix: Possible error while displaying offline cache copy progress
  • Fix: When changing the audiobook location or selecting a file in the file not found dialog an unexpected error could occur
  • Fix: Removing a storage dir in settings did not work
  • Fix: Removing a book from the library did sometimes not work
  • As always, updated translations thanks to all of the translators!

This release features chapter support for m4b files.

  • A long awaited feature has finally arrived: Chapter support for m4b files.
  • Books with inconsistent spelling are now grouped into a single book (thanks chris-kobrzak!).
  • Improved reliability of restoring the previous playback position.
  • Fix: clicking on a currently playing chapter did not pause the chapter as expected.
  • As always, updated translations thanks to all of the translators!

This release features chapter support for m4b files.

  • A long awaited feature has finally arrived: Chapter support for m4b files.
  • Books with inconsistent spelling are now grouped into a single book (thanks chris-kobrzak!).
  • Improved reliability of restoring the previous playback position.
  • Fix: clicking on a currently playing chapter did not pause the chapter as expected.
  • As always, updated translations thanks to all of the translators!
com.github.geigi.cozy pointing keyboard touch 360 #ffa348 #ffa348 2 pk_live_XJocNlICBfLqHpdZXN0LxlyV00xrhZTbDe
cozy-1.3.0/data/com.github.geigi.cozy.desktop000066400000000000000000000006441457036466300211320ustar00rootroot00000000000000[Desktop Entry] Name=Cozy GenericName=Audio Book Player Comment=Play and organize your audio book collection Icon=com.github.geigi.cozy Exec=com.github.geigi.cozy %U Terminal=false Type=Application Categories=GNOME;GTK;AudioVideo;Player;Audio; StartupNotify=true MimeType=x-content/audio-player; # Translators: Do NOT translate or transliterate this text (these are enum types)! X-Purism-FormFactor=Workstation;Mobile; cozy-1.3.0/data/com.github.geigi.cozy.gschema.xml000066400000000000000000000076721457036466300216770ustar00rootroot00000000000000 false Follow symlinks false Suspend system on timer false Replay 30 seconds on playback start false Auto scan the audio book directory 30 Last used timer duration false Use crc32 instead of last modified time stamp false Use the position slider for the whole book instead for the current chapter. true Display the time according to the playback speed. false Enable Dark Mode. false Swap author and reader tag assignment. false Enable fading out when using the sleep timer. 15 Duration of the sleep timer fadeout. 1.0 Volume. false Prefer external cover images over embedded. false Hide currently unavailable books in the library. 2 Level of error report details. "None" The version of cozy that did launch last. 15 Duration to rewind. 30 Duration to forward. 1100 Width of the main window 700 Height of the main window false Maximize state of the main window cozy-1.3.0/data/gresource.xml000066400000000000000000000003771457036466300161550ustar00rootroot00000000000000 com.github.geigi.cozy.appdata.xml ../AUTHORS.md cozy-1.3.0/data/icons/000077500000000000000000000000001457036466300145415ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/000077500000000000000000000000001457036466300162005ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/scalable/000077500000000000000000000000001457036466300177465ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/scalable/actions/000077500000000000000000000000001457036466300214065ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/scalable/actions/bed-symbolic.svg000066400000000000000000000037301457036466300245030ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/book-alert-symbolic.svg000066400000000000000000000006741457036466300260140ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/scalable/actions/book-open-variant-symbolic.svg000066400000000000000000000023501457036466300273010ustar00rootroot00000000000000 image/svg+xml cozy-1.3.0/data/icons/hicolor/scalable/actions/check-plain-symbolic.svg000066400000000000000000000045251457036466300261320ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/download-symbolic.svg000066400000000000000000000011661457036466300255610ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/downloaded-symbolic.svg000066400000000000000000000043001457036466300260630ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/harddisk-symbolic.svg000066400000000000000000000047551457036466300255520ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/library-symbolic.svg000066400000000000000000000053011457036466300254110ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/loupe-large-symbolic.svg000066400000000000000000000044301457036466300261630ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/microphone2-symbolic.svg000066400000000000000000000042631457036466300262000ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/no-bed-symbolic.svg000066400000000000000000000042771457036466300251240ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/papyrus-vertical-symbolic.svg000066400000000000000000000061301457036466300272600ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/person-symbolic.svg000066400000000000000000000037741457036466300252670ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/playback-speed-symbolic.svg000066400000000000000000000051061457036466300266340ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/recent-symbolic.svg000066400000000000000000000021661457036466300252330ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/actions/settings-symbolic.svg000066400000000000000000000067651457036466300256240ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/apps/000077500000000000000000000000001457036466300207115ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/scalable/apps/com.github.geigi.cozy.Devel.svg000066400000000000000000002315021457036466300266000ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/scalable/apps/com.github.geigi.cozy.svg000066400000000000000000001172461457036466300255520ustar00rootroot00000000000000 cozy-1.3.0/data/icons/hicolor/symbolic/000077500000000000000000000000001457036466300200215ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001457036466300207645ustar00rootroot00000000000000cozy-1.3.0/data/icons/hicolor/symbolic/apps/com.github.geigi.cozy-symbolic.svg000066400000000000000000000071101457036466300274300ustar00rootroot00000000000000 cozy-1.3.0/data/icons/meson.build000066400000000000000000000001651457036466300167050ustar00rootroot00000000000000icon_themes = ['hicolor'] foreach theme : icon_themes install_subdir(theme, install_dir: 'share/icons/') endforeachcozy-1.3.0/data/meson.build000066400000000000000000000030221457036466300155650ustar00rootroot00000000000000subdir('ui') subdir('icons') gnome.compile_resources( meson.project_name() + '.appdata', 'gresource.xml', gresource_bundle: true, install_dir: DATA_DIR, install: true, ) install_data( meson.project_name() + '.gschema.xml', install_dir: join_paths(get_option('datadir'), 'glib-2.0', 'schemas') ) compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()] ) endif desktop_file = i18n.merge_file( input: meson.project_name() + '.desktop', output: meson.project_name() + '.desktop', po_dir: join_paths(meson.current_source_dir(), 'po', 'extra'), type: 'desktop', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file] ) endif appstream_file = i18n.merge_file( input: meson.project_name() + '.appdata.xml', output: meson.project_name() + '.appdata.xml', po_dir: join_paths(meson.current_source_dir(), 'po', 'extra'), install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') ) appstreamcli = find_program('appstreamcli', required: false) if appstreamcli.found() test('Validate appstream file', appstreamcli, args: ['validate', '--no-net', '--explain', appstream_file], workdir: meson.current_build_dir() ) endif cozy-1.3.0/data/ui/000077500000000000000000000000001457036466300140435ustar00rootroot00000000000000cozy-1.3.0/data/ui/album_element.ui000066400000000000000000000062671457036466300172260ustar00rootroot00000000000000 cozy-1.3.0/data/ui/book_detail.ui000066400000000000000000000563411457036466300166670ustar00rootroot00000000000000 cozy-1.3.0/data/ui/book_element.ui000066400000000000000000000042111457036466300170430ustar00rootroot00000000000000 cozy-1.3.0/data/ui/chapter_element.ui000066400000000000000000000053101457036466300175400ustar00rootroot00000000000000 cozy-1.3.0/data/ui/error_reporting.ui000066400000000000000000000212521457036466300176260ustar00rootroot00000000000000 1 5 3 1 1 1 cozy-1.3.0/data/ui/first_import_button.ui000066400000000000000000000015201457036466300205140ustar00rootroot00000000000000 cozy-1.3.0/data/ui/gresource.xml000066400000000000000000000023221457036466300165620ustar00rootroot00000000000000 style.css album_element.ui book_detail.ui book_element.ui chapter_element.ui error_reporting.ui first_import_button.ui headerbar.ui main_window.ui media_controller.ui playback_speed_popover.ui preferences.ui progress_popover.ui search_page.ui seek_bar.ui storage_locations.ui storage_row.ui timer_popover.ui cozy-1.3.0/data/ui/headerbar.ui000066400000000000000000000101471457036466300163220ustar00rootroot00000000000000
app.scan _Scan Library
app.hide_offline _Hide unavailable books
app.prefs _Preferences app.about _About Cozy
app.quit _Quit
cozy-1.3.0/data/ui/main_window.ui000066400000000000000000000457371457036466300167350ustar00rootroot00000000000000 main_window Cozy com.github.geigi.cozy 360 294 max-width: 550sp true crossfade false false library-symbolic Drop Audio Books Here to Add Them to Your Library main raised Library main crossfade false true true recent Recent recent-symbolic Empty author Author person-symbolic true never true List of authors reader Reader microphone2-symbolic true never true List of readers true false false true books true true never true natural minimum 18 18 18 18 true start true 18 18 1 10 none List of books no_recent library-symbolic No Recent Books Yet Explore your library by switching to the Author or Reader view Book title book_overview vertical false true import false com.github.geigi.cozy Importing Stay tuned while Cozy is preparing your library… welcome false com.github.geigi.cozy Let's get cozy Select a Folder, or Drag Audiobooks Here to Add Them to Your Library cozy-1.3.0/data/ui/media_controller.ui000066400000000000000000000253641457036466300177360ustar00rootroot00000000000000 cozy-1.3.0/data/ui/meson.build000066400000000000000000000002611457036466300162040ustar00rootroot00000000000000message('Compiling resources') gnome.compile_resources( meson.project_name() + '.ui', 'gresource.xml', gresource_bundle: true, install_dir: DATA_DIR, install: true ) cozy-1.3.0/data/ui/playback_speed_popover.ui000066400000000000000000000030201457036466300211150ustar00rootroot00000000000000 0.5 3.5 1 0.05 0.1 cozy-1.3.0/data/ui/preferences.ui000066400000000000000000000134011457036466300167020ustar00rootroot00000000000000 120 15 5 10 5 120 5 10 5 120 15 5 10 cozy-1.3.0/data/ui/progress_popover.ui000066400000000000000000000024261457036466300200240ustar00rootroot00000000000000 cozy-1.3.0/data/ui/search_page.ui000066400000000000000000000064751457036466300166570ustar00rootroot00000000000000 cozy-1.3.0/data/ui/seek_bar.ui000066400000000000000000000050151457036466300161560ustar00rootroot00000000000000 100 1 15 cozy-1.3.0/data/ui/storage_locations.ui000066400000000000000000000020741457036466300201240ustar00rootroot00000000000000
External drive storage.mark-external
Set as default storage.make-default Remove storage.remove
cozy-1.3.0/data/ui/storage_row.ui000066400000000000000000000020671457036466300167420ustar00rootroot00000000000000 cozy-1.3.0/data/ui/style.css000066400000000000000000000027101457036466300157150ustar00rootroot00000000000000.box_hover { color: @theme_selected_fg_color; background: @theme_selected_bg_color; } .no_frame { border-style: none; } .unavailable_box { background-color: @red_4; border-radius: 25px; padding: 3px; padding-right: 10px; color: white; } .book_card { padding: 1rem; } .selected { color: @theme_selected_fg_color; background-color: @theme_selected_bg_color; } .book_detail_art { border-radius: 12px; } .chapter_element { border-radius: 0.5rem; } .book_play_button { background: rgba(50, 50, 50, 1.0); border: none; color: white; box-shadow: none; transition: none; -gtk-icon-shadow: none; } .book_play_button:hover, .book_play_button:active, .play_button:hover, .play_button:active { border: none; box-shadow: none; -gtk-icon-shadow: none; } .filter-list-box-row { border-radius: 0.5rem; } .play_button { background-color: @theme_fg_color; color: @theme_bg_color; } .player_bar { background: shade(@theme_bg_color, 0.95) 0%; } .bold { font-weight: 900; } .semi-bold { font-weight: 600; } .transparent_bg { background: transparent; } .failed-import-card { /* 6px vertical padding is not ideal, because the text scrolls into an invisible barrier, but it's nicer when no scrolling is happening */ padding: 6px 12px; } .drag-overlay-status-page { background-color: alpha(@accent_bg_color, 0.65); color: @accent_fg_color; } .blurred { filter: blur(6px); } .round-6 { border-radius: 6px; } cozy-1.3.0/data/ui/timer_popover.ui000066400000000000000000000147161457036466300173050ustar00rootroot00000000000000 0 10 120 1 5 cozy-1.3.0/main.py000077500000000000000000000103211457036466300140130ustar00rootroot00000000000000#!@PYTHON@ # main.py # # Copyright (C) 2017 geigi # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import argparse import code import gettext import locale import logging import os import signal import sys import traceback import gi gi.require_version('Gtk', '4.0') gi.require_version('Gdk', '4.0') gi.require_version('Adw', '1') gi.require_version('Gst', '1.0') gi.require_version('GstPbutils', '1.0') from gi.repository import Gio, GLib pkgdatadir = '@DATA_DIR@' localedir = '@LOCALE_DIR@' # We need to call `locale.*textdomain` to get the strings in UI files translated locale.bindtextdomain('com.github.geigi.cozy', localedir) locale.textdomain('com.github.geigi.cozy') # But also `gettext.*textdomain`, to make `_("foo")` in Python work as well gettext.bindtextdomain('com.github.geigi.cozy', localedir) gettext.textdomain('com.github.geigi.cozy') gettext.install('com.github.geigi.cozy', localedir) # gresource must be registered before importing any Gtk.Template annotated classes resource = Gio.Resource.load(os.path.join(pkgdatadir, 'com.github.geigi.cozy.ui.gresource')) resource._register() old_except_hook = None log = logging.getLogger("main") data_dir = os.path.join(GLib.get_user_data_dir(), "cozy") if not os.path.exists(data_dir): os.makedirs(data_dir) LOG_FORMAT = "%(asctime)s [%(threadName)-12.12s] [%(name)-10.10s] [%(levelname)-5.5s] %(message)s" LOG_DATE_FORMAT = "%H:%M:%S" # setup log files log1 = os.path.join(data_dir, "cozy_1.log") log0 = os.path.join(data_dir, "cozy.log") if os.path.exists(log1): os.remove(log1) if os.path.exists(os.path.join(data_dir, "cozy.log")): os.rename(log0, log1) def __on_command_line(): """ Handle command line """ parser = argparse.ArgumentParser() parser.add_argument("-d", "--debug", action="store_true", dest="debug") args = parser.parse_args(sys.argv[1:]) if args.debug: logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE_FORMAT, handlers=[ logging.FileHandler(log0), logging.StreamHandler(sys.stdout) ]) else: logging.basicConfig(level=logging.INFO, format=LOG_FORMAT, datefmt=LOG_DATE_FORMAT, handlers=[ logging.FileHandler(log0), logging.StreamHandler(sys.stdout) ]) def extend_classes(): extend_gtk_container() def main(): __on_command_line() print(sys.argv) extend_classes() listen() application = Application(pkgdatadir) try: # Handle the debug option seperatly without the Glib stuff if "-d" in sys.argv: sys.argv.remove("-d") ret = application.run(sys.argv) except SystemExit as e: ret = e.code sys.exit(ret) def debug(sig, frame): """Interrupt running process, and provide a python prompt for interactive debugging.""" d = {'_frame': frame} # Allow access to frame object. d.update(frame.f_globals) # Unless shadowed by global d.update(frame.f_locals) i = code.InteractiveConsole(d) message = "Signal received : entering python shell.\nTraceback:\n" message += ''.join(traceback.format_stack(frame)) i.interact(message) def listen(): signal.signal(signal.SIGUSR1, debug) # Register handler if __name__ == '__main__': import multiprocessing as mp mp.set_start_method('spawn') # All cozy imports are happening here because multiprocessing needs to be setup first # Some modules import multiprocessing which would lead to an exception # when setting the start method from cozy.application import Application from cozy.ui.widgets.list_box_extensions import extend_gtk_container main() cozy-1.3.0/meson.build000066400000000000000000000054631457036466300146670ustar00rootroot00000000000000project('com.github.geigi.cozy', version: '1.3.0', meson_version: '>= 0.59.0') python = import('python') i18n = import('i18n') gnome = import('gnome') message('Looking for dependencies') python_bin = python.find_installation('python3') if not python_bin.found() error('No valid python3 binary found') else message('Found python3 binary') endif dependency('glib-2.0') dependency('libadwaita-1', version: '>= 1.4.0') # from https://github.com/AsavarTzeth/pulseeffects/blob/master/meson.build # Support Debian non-standard python paths # Fallback to Meson python module if command fails message('Getting python install path') py3_purelib = '' r = run_command( python_bin.full_path(), '-c', 'from distutils.sysconfig import get_python_lib; print(get_python_lib(prefix=""))', check: false, ) if r.returncode() != 0 py3_purelib = python_bin.get_path('purelib') if not py3_purelib.endswith('site-packages') error('Cannot find python install path') endif python_dir = py3_purelib else python_dir = r.stdout().strip() endif # Python 3 required modules python3_required_modules = ['distro', 'peewee', 'mutagen', 'gi'] foreach p : python3_required_modules # Source: https://docs.python.org/3/library/importlib.html#checking-if-a-module-can-be-imported script = 'import importlib.util; import sys; exit(1) if importlib.util.find_spec(\''+ p +'\') is None else exit(0)' if run_command(python_bin, '-c', script, check: false).returncode() != 0 error('Required Python3 module \'' + p + '\' not found') endif endforeach LIBEXEC_DIR = join_paths(get_option('prefix'), 'libexec') DATA_DIR = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) conf = configuration_data() conf.set('PACKAGE_URL', 'https://github.com/geigi/cozy') conf.set('DATA_DIR', DATA_DIR) conf.set('LOCALE_DIR', join_paths(get_option('prefix'), get_option('datadir'), 'locale')) conf.set('PYTHON_DIR', python_dir) conf.set('PYTHON_EXEC_DIR', join_paths(get_option('prefix'), python_bin.get_path('stdlib'))) conf.set('libexecdir', LIBEXEC_DIR) conf.set('VERSION', meson.project_version()) conf.set('PYTHON', python_bin.full_path()) conf.set('INSTALLED', 'true') subdir('data') subdir('po') message('Compile gnome schemas') message('Preparing init file') configure_file( input: 'main.py', output: 'com.github.geigi.cozy', configuration: conf, install_dir: 'bin' ) install_subdir( 'cozy', install_dir: python_dir ) configure_file( input: 'cozy/version.py', output: 'version.py', configuration: conf, install_dir: python_dir + '/cozy' ) configure_file( input: 'cozy/report/report_to_loki.py', output: 'report_to_loki.py', configuration: conf, install_dir: python_dir + '/cozy/report' ) gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) cozy-1.3.0/po/000077500000000000000000000000001457036466300131335ustar00rootroot00000000000000cozy-1.3.0/po/LINGUAS000066400000000000000000000001421457036466300141550ustar00rootroot00000000000000be_BY bg cs da de el eo es fa_IR fi fr gl he hi hr hu it ms_MY nl no oc pl pt pt_BR ru sv tr uk zhcozy-1.3.0/po/POTFILES000066400000000000000000000021741457036466300143070ustar00rootroot00000000000000cozy/application.py cozy/control/mpris.py cozy/control/offline_cache.py cozy/media/files.py cozy/media/importer.py cozy/model/track.py cozy/tools.py cozy/ui/book_detail_view.py cozy/ui/chapter_element.py cozy/ui/db_migration_failed_view.py cozy/ui/delete_book_view.py cozy/ui/disk_element.py cozy/ui/file_not_found_dialog.py cozy/ui/import_failed_dialog.py cozy/ui/preferences_view.py cozy/ui/main_view.py cozy/ui/widgets/book_element.py cozy/ui/widgets/book_row.py cozy/ui/widgets/error_reporting.py cozy/ui/widgets/filter_list_box.py cozy/ui/widgets/search_results.py cozy/ui/widgets/sleep_timer.py cozy/ui/widgets/storages.py cozy/view_model/headerbar_view_model.py cozy/view_model/library_view_model.py data/ui/album_element.ui data/ui/book_detail.ui data/ui/book_element.ui data/ui/chapter_element.ui data/ui/error_reporting.ui data/ui/first_import_button.ui data/ui/headerbar.ui data/ui/main_window.ui data/ui/media_controller.ui data/ui/playback_speed_popover.ui data/ui/preferences.ui data/ui/progress_popover.ui data/ui/search_page.ui data/ui/seek_bar.ui data/ui/storage_locations.ui data/ui/storage_row.ui data/ui/timer_popover.ui main.pycozy-1.3.0/po/be_BY.po000066400000000000000000000556331457036466300144670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Yahor Haurylenka , 2023 # Yahor Haurylenka, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Yahor Haurylenka, 2024\n" "Language-Team: Belarusian (Belarus) (https://app.transifex.com/geigi/teams/78138/be_BY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be_BY\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "Аўдыякнігі" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Капіяванне" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "" "Не ўдалося скапіяваць: каталог з аўдыякнігамі даступны толькі для чытання" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "Не ўдалося скапіяваць: дыск запоўнены" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "Не ўдалося скапіяваць: бракуе правоў" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Памылка пры імпартаванні новых файлаў" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} гадзіна" msgstr[1] "{hours} гадзін" msgstr[2] "{hours} гадзін" msgstr[3] "{hours} гадзін" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{hours} хвіліна" msgstr[1] "{hours} хвілін" msgstr[2] "{hours} хвілін" msgstr[3] "{hours} хвілін" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} секунда" msgstr[1] "{seconds} секунд" msgstr[2] "{seconds} секунд" msgstr[3] "{seconds} секунд" #: cozy/tools.py:102 msgid "finished" msgstr "скончана" #: cozy/tools.py:126 msgid "never" msgstr "ніколі" #: cozy/tools.py:128 msgid "today" msgstr "сёння" #: cozy/tools.py:130 msgid "yesterday" msgstr "учора" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s дзён таму" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} тыдзень таму" msgstr[1] "{weeks} тыдняў таму" msgstr[2] "{weeks} тыдняў таму" msgstr[3] "{weeks} тыдняў таму" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} месяц таму" msgstr[1] "{months} месяцаў таму" msgstr[2] "{months} месяцаў таму" msgstr[3] "{months} месяцаў таму" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} год таму" msgstr[1] "{years} гадоў таму" msgstr[2] "{years} гадоў таму" msgstr[3] "{years} гадоў таму" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "Спампавана" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "Спампаваць" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Падчас абнаўлення базы даных адбылася памылка, і Cozy не зможа запусціцца. " "Рэзервовая копія базы даных была створана перад абнаўленнем і цяпер " "адноўлена. Пакуль гэтая праблема не будзе вырашана, выкарыстоўвайце версію " "Cozy 0.9.5. Вы можаце дапамагчы вырашыць гэту праблему, паведаміўшы аб " "праблеме на GitHub." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "Не ўдалося абнавіць базу даных" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "Закрыць Cozy" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "Атрымаць дапамогу на GitHub" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "Выдаліць аўдыякнігу?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Аўдыякніга будзе выдалена з вашага дыска і з бібліятэкі Cozy." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "Скасаваць" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "Выдаліць аўдыякнігу" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "Дыск" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "Файл не знойдзены" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Гэты файл не знойдзены. Вы хочаце знайсці яго ўручную?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "Размяшчэнне" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "Знайсці адсутны файл" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "{ext} файлы" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "Аўдыя файлы" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "Гэта можа быць па некалькіх прычынах:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "Аўдыяфармат не падтрымліваецца" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "Шлях або імя файла змяшчае сімвалы, адрозныя ад UTF-8" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "Файл(ы) не з'яўляюцца сапраўднымі аўдыяфайламі" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "Файл(ы) пашкоджаны" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "Не ўдалося імпартаваць некаторыя файлы" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "Так" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "Падтрымцы Patreon" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "Падтрымка раздзела m4b у mutagen" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "Праекты з адкрытым зыходным кодам" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "Yahor Haurylenka 2024" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "Пазначыць як прачытанае" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "Адкрыць у файлавым менеджары" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "Выдаліць з бібліятэкі" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "Слухаць гэтую кнігу" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "Адключана" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "Справаздача аб асноўных памылках" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "Падрабязная справаздача аб памылках" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "Падрабязная справаздача аб памылках уключая памылкі імпарту" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "Не рабіць справаздачы аб памылках і збоях." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "У выпадку памылкі або збою будзе адпраўлена наступная інфармацыя:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "Памылка якога тыпу адбылася" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "Радок кода, дзе адбылася памылка" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "Версія Cozy" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "Дыстрыбутыў Linux" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "Асяроддзе працоўнага стала" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "Тып медыяфайлаў, якія Cozy не змог імпартаваць" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Усе" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Паказаць усе кнігі" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "Перайсці да {artist_name}" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "мін" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "выкл." #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "Задаць каталог аўдыякніг" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "Знешні дыск" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "Унутраны дыск" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "Абнаўленне калекцыі аўдыякніг" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "Капіяванне новых файлаў…" #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "Змена размяшчэння аўдыякнігі…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "Іграць" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Засталося" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "Усяго" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Апошні раз прайгравалася" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "Апублікавана" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "Немагчыма знайсці некаторыя або ўсе файлы гэтай кнігі." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "недаступна" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "Загрузка раздзелаў, калі ласка, пачакайце..." #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "Адкрыць агляд кнігі" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "Слухаць гэтую частку" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "Водгукі карыстальнікаў" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Вы можаце дапамагчы палепшыць Cozy, дасылаючы інфармацыю ў выпадку памылак і" " збояў." #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Прадастаўленне гэтай інфармацыі неабавязкова і цалкам ананімна. Мы ніколі не" " будзем збіраць асабістыя даныя, файлы, якія вы імпартуеце, або любую " "інфармацыю, якая можа вас ідэнтыфікаваць." #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy з'яўляецца праграмай з адкрытым зыходным кодам, а водгукі " "карыстальнікаў можна знайсці тут:" #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "Зыходны " "код на GitHub" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "Выберыце папку" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "Пераключыць бакавую панэль фільтра" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "Параметры" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "Адкрыць акно параметраў" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "Пошук у вашай бібліятэцы" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "Адкрыць акно пошуку" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "Адлюстраванне прагрэсу задачы ў фонавым рэжыме" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "Пачніце ўводзіць..." #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "_Сканаваць бібліятэку" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "_Схаваць недаступныя кнігі" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "_Параметры" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "_Аб праграме" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "_Выйсці" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "Перацягніце сюды аўдыякнігі, каб дадаць іх у сваю бібліятэку" #: data/ui/main_window.ui:48 msgid "Library" msgstr "Бібліятэка" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "Апошнія" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "Аўтар" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Спіс аўтараў" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "Дыктар" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Спіс дыктараў" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "Спіс кніг" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "Нядаўніх кніг пакуль няма" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "" "Пачніце вывучаць сваю бібліятэку, пераключыўшыся на прагляд \"Аўтар\" або " "\"Дыктар\"" #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "Цяпер прайграваецца" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "Назва кнігі, якая зараз прайграваецца" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "Назва бягучай часткі" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "Пераматаць" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "Зваротнае прайграванне" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "Пачаць прайграванне" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "Запуск ці прыпыненне прайгравання" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "Наперад" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "Прайграванне наперад" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "Рэгулятар гучнасці" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "Хуткасць прайгравання" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "Таймер сну" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "Адкрыць акно таймера сну" #: data/ui/preferences.ui:27 msgid "General" msgstr "Агульныя" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Знешні выгляд" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "Цёмны рэжым" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "Цэтлікі" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "Памяняйце месцамі аўтара і дыктара" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "Уключыце, калі аўтар і дыктар адлюстроўваюцца няправільна" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "Прайграванне" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "Паўтор" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Пераматаць бягучую кнігу на 30 секунд назад пры запуску Cozy" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "Працягласць перамоткі" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "Працягласць перамоткі" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Згасанне" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "Працягласць згасання" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "Сховішча" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Твор" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "Аддаваць перавагу знешнім выявам перад убудаванай вокладкай" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Заўсёды выкарыстоўваць відарысы (cover.jpg, *.png, …), калі яны ёсць" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "Зваротная сувязь" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "Пошук у вашай бібліятэцы" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "Нічога не знойдзена" #: data/ui/search_page.ui:33 msgid "Book" msgstr "Кніга" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "Пройдзены час" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "Мінулы час бягучай часткі" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "Перайсці на пазіцыю ў бягучым раздзеле" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "Пазіцыя бягучай часткі ў секундах" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "Застаўшыйся час" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "Засталося часу бягучай часткі" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "Размяшчэнні сховішча" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "Перадвызначаць" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "Выдаліць" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Працягласць таймера" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Задаць працягласць таймера сну ў хвілінах" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Спыніць пасля бягучага раздзела" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "Уключыць кантроль сілкавання сістэмы" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Тып дзеяння па заканчэнні таймера.\n" "\"shutdown\" паспрабуе выключыць вашу сістэму (таксама вядомае як выключэнне)\n" "\"suspend\" паспрабуе прыпыніць вашу сістэму (таксама вядомы як сон)." #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "Выканаць дзеянне па кіраванні сілкаваннем" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "спячы рэжым" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "выключэнне" cozy-1.3.0/po/bg.po000066400000000000000000000516001457036466300140650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Vladimir Stoilov , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Vladimir Stoilov , 2021\n" "Language-Team: Bulgarian (https://www.transifex.com/geigi/teams/78138/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Копиране" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "мин" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "изключен" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:102 msgid "finished" msgstr "завършен" #: cozy/tools.py:126 msgid "never" msgstr "никога" #: cozy/tools.py:128 msgid "today" msgstr "днес" #: cozy/tools.py:130 msgid "yesterday" msgstr "вчера" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "преди %s дни" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "" msgstr[1] "" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Аудио книги" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Пусни тази книга" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Свалена" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Свали" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Отвори описание на книга" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Маркирай като прочетена" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Отвори в браузъра на файлове" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Премахни от библиотеката" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "Диск" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Всички файлове" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "Обратна връзка" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Пусни тази част" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Деактивиран" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Основно изпращане на грешки" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Детайлно изпращане на грешки" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "Детайлно изпращане на грешки с добавени грешки" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Не изпращай информация за грешки." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "Следната информация ще бъде изпратена в случай на грешка или провал:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Какъв тип грешка е настъпил" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Ред на кода в който се появи грешка" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Версия на Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Линукс дистрибуция" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Работна среда" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Тип медиен файл, който Cozy не може да импортира" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Всички" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Покажи всички книги" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Отиди на автор" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Отиди на четец" #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Ипортирай аудио книги" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "Копирай нови файлове..." #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "Промени локацията на аудио книги..." #: cozy/model/track.py:38 msgid "Chapter" msgstr "Глави" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Не може да се копира: Директорията на аудио книгите е само за четене" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Не може да се копира: Дискът е пълен" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Не може да се копира: Нямате права" #: data/ui/about.ui:16 msgid "GitHub" msgstr "" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Останали" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Всички" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Последно пускани" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Побликувани" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "Някои или всички файлове от книгата не могат да се намерят." #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "неналичен" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "Обратна връзка от потребителя" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Можете да помогнете да подобрим Cozy като допринасяте информация при " "възникване на проблеми." #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Допринасяне на тази информация е по желание и напълно анонимно. Никога няма " "да събираме лична инфорамция, файлове които сте импортирали или каквато и да" " е информация която може да ви идентифицира." #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "" #: data/ui/settings.ui:604 msgid "Tags" msgstr "" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "" #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "" #: data/ui/settings.ui:1715 msgid "Database" msgstr "" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/com.github.geigi.cozy.pot000066400000000000000000000340071457036466300177700ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:102 msgid "finished" msgstr "" #: cozy/tools.py:126 msgid "never" msgstr "" #: cozy/tools.py:128 msgid "today" msgstr "" #: cozy/tools.py:130 msgid "yesterday" msgstr "" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "" msgstr[1] "" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able " "to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "" #. Translators: Replace "translator-credits" with your names, one name per line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "" #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "" #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "" #: data/ui/album_element.ui:47 msgid "Play" msgstr "" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "" #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #. Translators: Don't touch the markup. Translate the text "Sourcecode on GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode " "on GitHub" msgstr "" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "" #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "" #: data/ui/main_window.ui:48 msgid "Library" msgstr "" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "" #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "" #: data/ui/preferences.ui:27 msgid "General" msgstr "" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "" #: data/ui/search_page.ui:33 msgid "Book" msgstr "" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "" cozy-1.3.0/po/cs.po000066400000000000000000000646041457036466300141120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Pavel Zahradnik , 2021 # Pavel Patz, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Pavel Patz, 2022\n" "Language-Team: Czech (https://www.transifex.com/geigi/teams/78138/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audioknihy" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Kopírování" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Nelze kopírovat: Adresář s audioknihami je určen pouze pro čtení" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Nelze kopírovat: Disk je plný" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Nelze kopírovat: Oprávnění odepřeno" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Chyba během importování nových souborů" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Kapitola" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} hodina" msgstr[1] "{hours} hodiny" msgstr[2] "{hours} hodin" msgstr[3] "{hours} hodin" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuta" msgstr[1] "{minutes} minuty" msgstr[2] "{minutes} minut" msgstr[3] "{minutes} minut" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekunda" msgstr[1] "{seconds} sekundy" msgstr[2] "{seconds} sekund" msgstr[3] "{seconds} sekund" #: cozy/tools.py:102 msgid "finished" msgstr "dokončeno" #: cozy/tools.py:126 msgid "never" msgstr "nikdy" #: cozy/tools.py:128 msgid "today" msgstr "dnes" #: cozy/tools.py:130 msgid "yesterday" msgstr "včera" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "před %s dny" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "před {weeks} týdnem" msgstr[1] "před {weeks} týdny" msgstr[2] "před {weeks} týdny" msgstr[3] "před {weeks} týdny" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "před {months} měsícem" msgstr[1] "před {months} měsíci" msgstr[2] "před {months} měsíci" msgstr[3] "před {months} měsíci" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "před {years} rokem" msgstr[1] "před {years} roky" msgstr[2] "před {years} roky" msgstr[3] "před {years} roky" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Stažené" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Stáhnout" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Přehrát tuto část" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disk" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Všechny soubory" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Nastavení adresáře audioknih" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} je odpojen." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Označit jako poslechnuté" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Otevřít v prohlížeči souborů" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Odstranit z knihovny" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Zakázáno" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Základní hlášení chyb" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Podrobné hlášení chyb" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Podrobné hlášení chyb, včetně chyb importu " #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Žádné hlášení chyb nebo selhání." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "V případě chyby nebo selhání budou odeslány následující informace:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Jaký typ chyby se vyskytl" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Řádek kódu, kde došlo k chybě" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Verze aplikace Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribuce Linuxu" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Pracovní prostředí" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Typ souborů médií, které se aplikaci Cozy nepodařilo importovat" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Vše" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Zobrazit všechny knihy" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Přejít na autora" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Přejít na čtenáře" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Přehrát tuto knihu" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Vypnuto" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Externí disk" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Interní disk" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Aktualizace sbírky audioknih" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Kopírování nových souborů…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Změna umístění audioknih…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Přehrát" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Zbývá" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Celkem" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Naposledy hrané" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Zveřejněno" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Některé nebo všechny soubory této knihy nelze nalézt." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "nedostupné" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Načítání kapitol, prosím vyčkejte..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Přehled otevřených knih" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Zavřít aplikaci Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Získat pomoc na GitHubu" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Při aktualizaci databáze došlo k chybě." #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Během aktualizace databáze došlo k chybě a aplikaci Cozy nelze spustit.\n" "Před aktualizací byla vytvořena záloha databáze, která byla nyní obnovena.\n" "Dokud nebude tento problém vyřešen, používejte prosím verzi 0.9.5 aplikace Cozy.\n" "Tento problém můžete pomoci vyřešit jeho nahlášením na GitHubu." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Zrušit" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Smazat audioknihu" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Opravdu chcete smazat vybranou audioknihu?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Audiokniha bude odstraněna z vašeho disku a z knihovny aplikace Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Zpětná vazba od uživatelů" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Můžete přispět ke zlepšení aplikace Cozy tím, že poskytnete informace v " "případě chyb a selhání. " #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Poskytnutí těchto informací není povinné a je zcela anonymní. Nikdy nebudeme" " shromažďovat osobní údaje, soubory, které importujete, ani žádné informace," " které by vás mohly identifikovat." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy je opensource a zdrojový kód se zpětnou vazbou od uživatelů si můžete " "prohlédnout zde:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Vyhledat" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Soubor nenalezen" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Tento soubor se nepodařilo najít. Chcete jej vyhledat ručně?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Zobrazit průběh úlohy na pozadí" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Prohledat knihovnu" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Tlačítko nabídky Hledání" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Otevřít vyskakovací okno hledání" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Možnosti" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Tlačítko nabídky Možnosti" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Otevřít vyskakovací okno pro možnosti" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Budiž" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Některé soubory nebylo možné importovat" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "To může mít více příčin:\n" "- Zvukový formát není podporován\n" "- Cesta nebo název souboru obsahuje znaky jiné než utf-8.\n" "- Soubor(y) nejsou platné zvukové soubory.\n" "- Soubor(y) jsou poškozené" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Nedávné" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Seznam autorů" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Seznam čtenářů" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Čtenář" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Seznam knih" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Začněte prozkoumávat svoji knihovnu přepnutím na zobrazení podle autora nebo" " čtenáře." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Zůstaňte naladěni, zatímco Cozy připravuje vaši knihovnu..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Import audioknih" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy automaticky importuje vaše audioknihy do jednoho adresáře - vaší " "knihovny." #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Přetahování" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Přetáhněte audioknihy do Cozy a budou automaticky importovány " #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "Nahrát audioknihy z adresáře, síťového disku nebo externího disku" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Vybrat" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Posun zpět" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Tlačítko pro posun zpět" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Přehrávání zpět" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Spustit přehrávání" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Tlačítko přehrávání/zastavení" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Spustit nebo zastavit přehrávání" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Posun vpřed" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Tlačítko pro posun vpřed" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Přehrávání vpřed" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Momentálně hraje" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Název knihy" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Název právě přehrávané knihy" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Název části" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Název právě přehrávané části" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Uplynulý čas" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Uplynulý čas" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Uplynulý čas aktuální části" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Přejít na pozici v aktuální kapitole" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Posuvník polohy" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Poloha aktuální části v sekundách" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Zbývající čas" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Zbývající čas" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Zbývající čas aktuální části" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Ovládání hlasitosti" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Rychlost přehrávání" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Časovač spánku" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Tlačítko nabídky Časovač" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Otevřít vyskakovací okno časovače" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Otevřít knihu" #: data/ui/preferences.ui:55 msgid "General" msgstr "Obecné" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Vzhled" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Štítky" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Zapněte, pokud jsou autor a čtenář zobrazeni obráceně" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Přehrávání" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Po startu Cozy se vrátit v současné knize o 30 sekund nazpět" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Četba na dobrou noc" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Úložiště" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Obrázek" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "" "Vždy použít soubory obrázků (cover.jpg, *.png...), pokud jsou dostupné" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Místa uložení" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Přidat umístění" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Odstranit umístění" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Přepnout toto místo uložení na interní/externí." #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "Nastavit jako výchozí místo uložení pro nové audioknihy" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Nastavit jako výchozí" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Zpětná vazba" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Uživatelská zpětná vazba" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Hledat" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Vyhledávací pole" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Vyhledávání v audioknihovně" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Kterou knihu hledáte?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Kniha" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Část" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Nic nenalezeno :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Délka časovače" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Posuvník délky časovače" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Nastavení délky časovače v minutách" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Zastavit za aktuální kapitolou" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Povolit řízení napájení systému" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Typ akce po ukončení časovače.\n" "\"vypnout\" se pokusí vypnout (ukončit) systém.\n" "\"uspat\" se pokusí uspat systém (do paměti)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Akce napájení systému\n" "kterou provést" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "uspat" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "vypnout" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "Prohledat _knihovnu" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Skrýt nedostupné knihy" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Předvolby" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Nápověda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "O _aplikaci Cozy" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Ukončit" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Vítejte!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Přidejte své audioknihy a pojďte se uvelebit." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Co je nového?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Pokračovat" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Co je nového v aplikaci Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "Zcela přepracovaný a mnohem spolehlivější import médií." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Stalo se vám, že zvukové soubory nebylo možné importovat? Přetáhněte tyto " "soubory do aplikace Cozy nebo pomocí nabídky aplikace v záhlaví znovu " "prohledejte adresáře audioknih!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "V současné době jsou podporovány tyto soubory médií: mp3, m4a, flac, ogg, " "opus a wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Těšte se na další novinky v pozdější aktualizaci." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Důležitá změna ve spravování knihovny" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Dříve byl každý soubor, který byl importován do knihovny, ale už jej nebylo " "možné nalézt, během prohledávání z knihovny odstraněn." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Nyní se audioknihy z vaší knihovny už automaticky neodstraňují. Tím se " "zabrání náhodné ztrátě rozposlouchaných audioknih, když je soubor dočasně " "nedostupný." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Chcete-li audioknihu z knihovny odebrat, klikněte na ni pravým tlačítkem " "myši a vyberte možnost odebrat z knihovny." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Základní podpora m4b audioknih." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Mnozí z vás na to čekali: Podpora pro audioknihy ve formátu m4b! Tato verze " "obsahuje základní podporu souborů m4b, zatím bez podpory kapitol." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Přetáhněte soubory m4b do aplikace Cozy nebo použijte nabídku aplikace v " "záhlaví a znovu prohledejte adresáře audioknih." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "Podpora kapitol bude následovat v pozdější aktualizaci. Zůstaňte naladěni!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Podpora kapitol pro m4b audioknihy." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Tato verze aplikace Cozy přináší podporu pro kapitoly v audioknihách m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Pokud již máte importované soubory m4b, musíte spustit prohledávání knihovny" " z nabídky aplikace." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Poté budou kapitoly detekovány." cozy-1.3.0/po/da.po000066400000000000000000000500101457036466300140530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Julian Geywitz , 2020\n" "Language-Team: Danish (https://www.transifex.com/geigi/teams/78138/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Kopierer" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:102 msgid "finished" msgstr "afsluttet" #: cozy/tools.py:126 msgid "never" msgstr "aldrig" #: cozy/tools.py:128 msgid "today" msgstr "i dag" #: cozy/tools.py:130 msgid "yesterday" msgstr "i går" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "" msgstr[1] "" #: cozy/application.py:101 msgid "Audiobooks" msgstr "" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Afspil denne bog" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Downloadet" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Download" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Åbn bogoversigt" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Marker som læst" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Fjern fra bibliotek" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "Disc" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Alle filer" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Afspil denne del" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "alle" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Vis alle bøger" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Gå til forfatter" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Gå til oplæser" #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Importerer Lydbøger" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "" #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "" #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Tilbage" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Sidst afspillet" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "" #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Annullér" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Lokaliser" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Fil ikke fundet" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Denne fil kunne ikke findes. Vil du lokalisere den selv? " #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Nogle filer kunne ikke importeres" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Forfatterliste" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Forfatter" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Oplæserliste" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Oplæser" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Bogliste" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Impoter dine Lydbøger" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importerer automatisk dine lydbøger ned i en mappe - dit bibliotek" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Importer automatisk nye lydbøger ved opstart" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "Træk & Slip" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Træk dine lydbøger ind i Cozy og de vil automatisk blive importeret" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Dine lydbøgers lagerplacering" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Vælg lydbogsmappe" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Søg" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Søgefelt" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Søg i dit lydbogsbibliotek" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Hvilken bog leder du efter?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Bog" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Del" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Fandt ingenting :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Generelt" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Mørk tilstand" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "Titelbjælke" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "Vis hele bogen istedet for det nuværende kapitel" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "Udseende" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "Afspil 30 sekunder igen" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "" #: data/ui/settings.ui:604 msgid "Tags" msgstr "" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "Adfærd" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "Billeder" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "Foretræk eksterne billeder fremfor indlejret omslagsbillede" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "Lydbøgernes placering" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "Lagerplaceringer" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "Tilføj lagerplacering" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "Fjern lagerplacering" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "Angiv denne lagerplacering som værende intern eller ekstern" #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "Benyt som standard lagerplacering for nye lydbøger" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "Sti" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "Følg genveje (symlinks)" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "Lagring" #: data/ui/settings.ui:1715 msgid "Database" msgstr "Database" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "Avanceret" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Stop når dette kapitel slutter" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Præferencer" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Hjælp" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Om" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Afslut" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tilbageværende tid" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tid tilbage" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Den aktuelle dels resterende tid" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "Tilbagespolings-knap" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "Start afspilning" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "Afspil/Pause-knap" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "Start eller sæt afspilningen på pause" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "Afspiller nu" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "Bogtitel" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "Delens navn" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "Arbejder…" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "Lydstyrke" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "Afspilningshastighed" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Søg i dit bibliotek" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "Indstillinger" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "Indstillinger-menuknap" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/de.po000066400000000000000000000455361457036466300141000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # ckaotik ., 2021 # Julian Geywitz , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Julian Geywitz , 2024\n" "Language-Team: German (https://app.transifex.com/geigi/teams/78138/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "Hörbücher" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Kopiere" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "Fehler beim Kopieren: Hörbuch-Ordner ist nicht schreibbar" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "Fehler beim Kopieren: Kein freier Speicher" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "Fehler beim Kopieren: Zugriff verweigert" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Fehler beim Importieren von neuen Dateien" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} Stunde" msgstr[1] "{hours} Stunden" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} Minute" msgstr[1] "{minutes} Minuten" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} Sekunde" msgstr[1] "{seconds} Sekunden" #: cozy/tools.py:102 msgid "finished" msgstr "fertig" #: cozy/tools.py:126 msgid "never" msgstr "nie" #: cozy/tools.py:128 msgid "today" msgstr "heute" #: cozy/tools.py:130 msgid "yesterday" msgstr "gestern" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "vor %s Tagen" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "vor {weeks} Woche" msgstr[1] "vor {weeks} Wochen" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "vor {months} Monat" msgstr[1] "vor {months} Monaten" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "vor {years} Jahr" msgstr[1] "vor {years} Jahren" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "Heruntergeladen" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "Herunterladen" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Während des Updates der Datenbank ist ein Fehler aufgetreten und Cozy kann nicht starten.\n" "Vor dem Update wurde ein Backup der Datenbank erstellt, welches gerade wieder eingespielt wurde.\n" "Bis dieser Fehler behoben wurde nutze bitte die Version 0.9.5 von Cozy.\n" "Du kannst bei der Fehlerbehebung helfen indem du diesen Fehler auf GitHub beschreibst." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "Das Datenbank Update ist fehlgeschlagen" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "Cozy schließen" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "Hilfe auf GitHub bekommen" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "Hörbuch löschen?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" "Das Hörbuch wird von deiner Festplatte und aus der Cozy-Bibliothek gelöscht." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "Abbrechen" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "Hörbuch entfernen" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "Disc" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "Datei nicht gefunden" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Diese Datei wurde nicht gefunden. Möchtest Du sie selbst auswählen?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "Auswählen" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "Fehlende Datei suchen" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "{ext} Dateien" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "Audiodateien" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "Dies kann mehrere Gründe haben:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "Das Audioformat wird nicht unterstützt" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "Der Pfad oder Dateiname enthält nicht UTF-8 Zeichen" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "Die Datei(en) sind keine gültigen Audiodateien" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "Die Datei(en) sind beschädigt" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "Es konnten nicht alle Dateien importiert werden" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "Ok" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "Patreon Unterstützer" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "m4b Kapitelunterstützung in mutagen" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "Open Source Projekte" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "translator-credits" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "Markiere: Abgeschlossen" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "Öffne in Dateibrowser" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "Aus Bibliothek entfernen" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "Höre dieses Buch" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "Deaktiviert" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "Einfache Fehlerberichte" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "Detaillierte Fehlerberichte" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "Detaillierte Fehlerberichte und Import-Fehler" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "Keine Fehler- oder Absturzberichte." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Die folgenden Informationen werden bei einem Fehler oder Absturz übertragen:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "Welche Art von Fehler aufgetreten ist" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "Die Quellcode-Zeile an der der Fehler aufgetreten ist" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "Cozy's Version" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "Linux Distribution" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "Desktopumgebung" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "Dateityp von Dateien, die Cozy nicht importieren konnte" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Alle" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Zeige alle Bücher" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "Springe zu {artist_name}" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "Aus" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "Wähle den Speicherort der Hörbücher" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "Externer Datenträger" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "Interner Datenträger" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "Hörbuchbibliothek wird aktualisiert" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "Kopiere neue Dateien…" #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "Wechsle zu neuem Hörbuch-Ordner…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "Play" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Verbleibend" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "Gesamt" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Zuletzt gehört" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "Veröffentlicht" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "" "Manche oder alle Dateien die zu diesem Buch gehören können nicht gefunden " "werden." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "nicht verfügbar" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "Lade Kapitel, bitte warten..." #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "Öffne die Buchübersicht" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "Höre dieses Kapitel" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "Nutzerfeedback" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Du kannst dabei helfen Cozy zu verbessern, indem du die " "Fehlerberichterstattung im Falle eines Programmfehlers oder Absturzes " "anschaltest." #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Die Fehlerberichterstattung ist optional und komplett anonym. Es werden " "niemals persönliche Daten, Hörbuch-Dateien oder Informationen, welche dich " "identifizieren könnten, übertragen." #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy ist opensource und der Fehlerbericht-Quellcode kann hier eingesehen " "werden:" #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "Sourcecode" " auf GitHub" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "Ordner auswählen" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "Filterseitenleiste öffnen/schließen" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "Optionen" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "Öffne das Optionen Popover" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "Durchsuche deine Bibliothek" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "Öffne das Suchen Popover" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "Zeige Hintergrundarbeit" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "Suchen..." #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "_Scan Library" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "_Verstecke nicht verfügbare Titel" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "_Einstellungen" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "_Über Cozy" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "_Beenden" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "Ziehen Sie Hörbücher hier hin, um sie Ihrer Bibliothek hinzuzufügen." #: data/ui/main_window.ui:48 msgid "Library" msgstr "Bibliothek" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "Zuletzt" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Liste der Autoren" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "Leser" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Liste der Leser" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "Liste aller Bücher" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "Noch keine Bücher angehört" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "" "Erkunde Deine Bibliothek, indem du zur Autor- oder Leseransicht wechselst." #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "Wird gerade wiedergegeben" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "Titel des aktuellen Buches" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "Name des aktuell abgespielten Kapitels" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "Zurück springen" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "Zurück springen" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "Starte die Wiedergabe" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "Starte oder pausiere die Wiedergabe" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "Vor springen" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "Vor springen" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "Lautstärke" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "Geschwindigkeit" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "Schlaf Timer" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "Öffne das Schlafen Timer Popover" #: data/ui/preferences.ui:27 msgid "General" msgstr "Allgemein" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Erscheinung" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "Dark Mode" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "Tags" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "Tausche Autor und Leser" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "Setze diese Einstellung wenn Autor und Leser bei dir vertauscht sind" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "Wiedergabe" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "Wiederholung" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Spule beim Start von Cozy 30 Sekunden im aktuellen Buch zurück" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "Zurück springen Dauer" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "Vor springen Dauer" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Fadeout" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "Ausblenden Dauer" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "Speicher" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Artwork" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "Bevorzuge externes Cover über eingebettetes Cover" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Nutze Cover Bilder (cover.jpg, *.png, …) immer wenn verfügbar" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "Feedback" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "Durchsuche deine Bibliothek" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "Keine Ergebnisse gefunden" #: data/ui/search_page.ui:33 msgid "Book" msgstr "Buch" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "Vergangene Zeit" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "Vergangene Zeit des aktuellen Kapitels" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "Springe zu einer Position im aktuellen Kapitel" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "Position des aktuell abgespielten Kapitels in Sekunden" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "Verbleibende Zeit" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "Verbleibende Zeit des aktuellen Kapitels" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "Hörbuch Ordner" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "Setze als Standard" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "Entfernen" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Timer Dauer" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Setze die Timer Dauer in Minuten" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Stoppe nach aktuellen Kapitel" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "Systemsteuerung einschalten" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Wird ausgeführt sobald der Timer ausgelaufen ist.\n" "Herunterfahren: Schaltet das System aus\n" "Schlafen: Wechselt in den Energiespar Modus" #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "Systemaktion die ausgeführt werden soll" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "Energiesparen" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "Herunterfahren" cozy-1.3.0/po/el.po000066400000000000000000000614371457036466300141060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Georgios Cojonis , 2020 # Dhmhtrhs Kapatakias , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Dhmhtrhs Kapatakias , 2021\n" "Language-Team: Greek (https://www.transifex.com/geigi/teams/78138/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Γίνεται αντιγραφή" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Απενεργοποιημένο" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:102 msgid "finished" msgstr "ολοκληρώθηκε" #: cozy/tools.py:126 msgid "never" msgstr "ποτέ" #: cozy/tools.py:128 msgid "today" msgstr "σήμερα" #: cozy/tools.py:130 msgid "yesterday" msgstr "χθές" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "πριν από %s μέρες" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "" msgstr[1] "" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Ηχητικά βιβλία " #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Αναπαραγωγή βιβλίου " #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Κατεβασμένο" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Κατέβασμα" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Άνοιγμα επισκόπησης βιβλίου " #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Μαρκάρισμα ως διαβασμένο" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Άνοιγμα αρχείου στον περιηγητή" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Αφαίρεση από τη βιβλιοθήκη" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Όλα τα αρχεία" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Αναπαραγωγή αυτού του μέρους" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Όλα" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Προβολή όλων των βιβλίων" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Μετάβαση στο δημιουργό" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Μετάβαση στον αναγνώστη" #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Εισάγονται ηχητικά βιβλία" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "" #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "Γίνεται αλλαγή της τοποθεσίας του audiobook..." #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Απομένουν" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Σύνολο" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Πιο πρόσφατη αναπαραγωγή" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Εκδόθηκε " #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "" #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Ακύρωση" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Εύρεση" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Το αρχείο δε βρέθηκε " #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Αυτό το αρχείο δε βρέθηκε. Θέλετε να το εντοπίσετε ο ίδιος;" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Εντάξει" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Κάποια αρχεία δε φορτώθηκαν" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Μπορεί να υπάρχουν πολλαπλοί λόγοι για Αυτό:\n" "- O τύπος ηχητικού αρχείου μπορεί να μην υποστηρίζεται \n" "- Το μονοπάτι ή το όνομα του αρχείου μπορεί να περιέχει χαρακτήρες που να μην περιλαμβάνονται στην utf-8 κωδικοποίησή.\n" "- Το αρχείο/τα αρχεία μπορεί να μην είναι έγκυρα ηχητικά αρχεία\n" "- Το αρχείο/τα αρχεία μπορεί να έχουν υποστεί βλάβη " #: data/ui/main_window.ui:125 msgid "Recent" msgstr "Πρόσφατα" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Λίστα δημιουργών" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Δημιουργός" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Λίστα αναγνωστών" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Αναγνώστης" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Λίστα βιβλίων" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Εισάγετε τα ηχητικά σας βιβλία " #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "Το Cozy αυτομάτως εισάγει τα ηχητικά σας βιβλία στη βιβλιοθήκη σας " #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Αυτόματη εισαγωγή νέων ηχητικών βιβλίων με την έναρξη" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "Μοχλός αυτόματης σάρωσης" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Σύρτε τα βιβλία σας μέσα στο cozy και θα εισαχθούν αυτόματα" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Τοποθεσία των ηχητικών βιβλίων σας " #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Επιλογή τοποθεσίας με ηχητικά βιβλία " #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" "Φορτώστε ηχητικά βιβλία από κάποιο αρχείο, από το διαδίκτυο ή από εξωτερικό " "δίσκο " #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "" "Θα έχετε τη δυνατότητά να προσθέσετε και άλλες θέσεις αποθήκευσής αργότερα " "από τις ρυθμίσεις" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Εύρεση " #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Κουτί εύρεσης " #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Ψάξτε στη βιβλιοθήκη των ηχητικών σας βιβλίων " #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Για ποιο βιβλίο ψάχνετε;" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Βιβλίο" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Δε βρέθηκε αποτέλεσμα :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Γενικά" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Σκοτεινή λειτουργία" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "Εμφάνιση" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "Αυτόματη σάρωση πολυμέσων" #: data/ui/settings.ui:604 msgid "Tags" msgstr "Ετικέτες" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "Εναλλαγή δημιουργού και αναγνώστη" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" "Ενεργοποιήστε αυτό αν ο δημιουργός και ο αναγνώστης εμφανίζονται με λάθος " "τρόπο" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "εναλλαγή ανάθεσης δημιουργού και αναγνώστη" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "Χρονοδιακόπτης ύπνου" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "Σταδιακό ξεθώριασμα ήχου" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "Διάρκεια σταδιακού ξεθωριάσματος ήχου" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "Συμπεριφορά" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "Χρήση εικόνων (cover.jpg, *.png …) όταν είναι διαθέσιμες" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "Τοποθεσία βιβλίων ήχου" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "Τοποθεσίες αποθήκευσης" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "Προσθήκη τοποθεσίας" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "Αφαίρεση τοποθεσίας" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "Αλλαγή αυτής της τοποθεσίας αποθήκευσης σε εσωτερική/εξωτερική" #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "Ορισμός ως προεπιλεγμένη τοποθεσία αποθήκευσης για νέα βιβλία" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "Αποθηκευτικός χώρος" #: data/ui/settings.ui:1715 msgid "Database" msgstr "Βάση Δεδομένων" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "Εξαναγκασμένη ανανέωση βάσης δεδομένων" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "" "Αυτή η ενέργεια θα ανανεώσει τα μεταδεδομένα όλων των εισαγμένων βιβλίων" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "Εξαναγκασμένη ανανέωση" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "Για προχωρημένους" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Διάρκεια χρονοδιακόπτη" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Slider διάρκειας χρονοδιακόπτη" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Επιλογή διάρκειας χρονοδιακόπτη ύπνου σε λεπτά" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Διακοπή μετά από τρέχον κεφάλαιο" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Ενεργοποίηση ελέγχου ενέργειας συστήματος" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Είδος ενέργειας όταν ο χρονοδιακόπτης τελειώσει.\n" "η \"απενεργοποίηση\" θα προσπαθήσει να κλείσει το σύστημά σας\n" "η \"αναστολή\" θα προσπαθήσει να αναστείλει το σύστημά σας." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Είδος ενέργειας συστήματος\n" "που θα συμβεί" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "αναστολή" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "απενεργοποίηση" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Παρελθών χρόνος" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Παρελθών χρόνος" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Παρελθών χρόνος τρέχοντος μέρους" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Μετάβαση σε θέση στο τρέχον κεφάλαιο" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Ρυθμιστής θέσεως " #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Θέση τρέχοντος μέρους σε δευτερόλεπτα" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Εναπομένων χρόνος" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Εναπομένων χρόνος" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Εναπομένων χρόνος τρέχοντος μέρους" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "Κουμπί επαναφοράς" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "Έναρξη αναπαραγωγής " #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "Κουμπί Έναρξης/Παύσης " #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "Έναρξη ή παύση της αναπαραγωγής " #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "Προειδοποίησες " #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "Τρέχων αναπαραγωγή " #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "Τίτλος βιβλίου" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "Τίτλος αναπαραγόμενου βιβλίου" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "Όνομα μέρους" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "Τίτλος του τρέχοντος μέρους" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "Σε επεξεργασία…" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "Υπό επεξεργασία…" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "Ρυθμιστής εντάσεως " #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "Ταχύτητα αναπαραγωγής" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "Κουμπί μενού χρονοδιακόπτη" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Αναζήτηση στη βιβλιοθήκη σας" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "Κουμπί μενού αναζήτησης" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "Επιλογές" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "Κουμπί μενού επιλογών" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/eo.po000066400000000000000000000622571457036466300141120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Alex Mauer , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-08-09 20:31+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Alex Mauer , 2022\n" "Language-Team: Esperanto (https://www.transifex.com/geigi/teams/78138/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:106 msgid "Audiobooks" msgstr "Sonlibroj" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Kopiante" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Ne povas kopii: Sonlibra dosierujo estas nurlega." #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Ne povas kopii: Disko estas plena" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Ne povas kopii: Mankas permeso" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Eraro dum importo de novaj dosieroj" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Ĉapitro" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} horo" msgstr[1] "{hours} horoj" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuto" msgstr[1] "{minutes} minutoj" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekundo" msgstr[1] "{seconds} sekundoj" #: cozy/tools.py:102 msgid "finished" msgstr "finita" #: cozy/tools.py:126 msgid "never" msgstr "neniam" #: cozy/tools.py:128 msgid "today" msgstr "hodiaŭ" #: cozy/tools.py:130 msgid "yesterday" msgstr "hieraŭ" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "1 %s tagoj antaŭ" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} semajno antaŭ" msgstr[1] "{weeks} semajnoj antaŭ" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} monato antaŭ" msgstr[1] "{months} monatoj antaŭ" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} jaro antaŭ" msgstr[1] "{years} jaroj antaŭ" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Elŝutita" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Elŝuti" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Ludigu ĉi tiun parton" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disko" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Ĉiuj dosieroj" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Agordu Dosierujon por Sonlibroj" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} estas nekonektita" #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marku kiel legita" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Malfermu en dosieresplorilo" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Forigu el biblioteko" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Malŝaltita" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Baza raportaĵo de eraroj" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "detala raportaĵo de eraroj" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Detala raportaĵo de eraro kun importaĵo eraroj" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Nenio raportaĝo de eraroj kaj paneoj" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "La sekva informo estas sendota por la okazo de eraro aŭ paneo:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Kiun tipon de eraro okazis" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Vico de kodo kie eraro okazis" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versio de Kozi" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linuksa distribuo" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Labortabla ĉirkaŭaĵo" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Mediuma tipo de dosieron ke Cozy no povis importi" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Ĉiuj" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Montru ĉiujn librojn" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Saltu al verkisto" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Saltu al rakontisto" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Ludigu ĉi tuin libron" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "malŝalta" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:380 msgid "External drive" msgstr "ekstera disko" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Interna disko" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Aktualigante sonlibraron" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Kopiante novajn dosierojn" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Ŝanĝante sonlibran lokon…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Ludigu" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restanta" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Tuto" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Laste ludado" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Eldonita" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Kelkaj aŭ ĉiuj dosierojn de ĉi tiu libro ne troveblas" #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "malhavebla" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Ŝarĝante ĉapitrojn, bonvolu atendi…" #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Malfermu libran resumo" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Fermu Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Ricevi helpon sur GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Eraro okazis atkualigante la datenaro" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Dum akulaligo de datenaro, eraro okazis kaj Cozy ne povos starti.\n" "Sekurkopio de la dataro estis kreita antaŭ la aktualigo kaj nun estas refarita.\n" "Ĝis ĉi tiu problemo estas ĝustita, bonvolu uzi versio 0.9.5 de Cozy.\n" "Vi povas helpi ĝustigi ĉi tiun problemon per reparti problemon sur GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Nuligu" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Forigi Sonlibron" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Ĉu vi certas ke vi volas forigi la elektitan sonlibron?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "La sonlibro estos forigita el via disko kaj el la biblioteko de Cozy" #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:458 msgid "User feedback" msgstr "Uzanta rimarko" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Vi povas helpi plibonigi Cozy per kontribui informo okaze de eraroj kaj " "paneoj" #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Kontribui ĉi tiun informo estas laŭvola kaj tute senrekona. Ni neniam " "kolektos personan dataon, doseriojn ke vi importas, nek ia informo ke povus " "identigi vin." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy estas malfermitakoda kaj la uzanta rimarko estas ekzamenebla ĉi tie" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Trovu" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Dosiero ne trovita" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Ĉi tiun doserio ne estas trovigebla. Ĉu vi volas loki ĝin permane?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Montri progreson de fontasko" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Serĉi vian bibliotekon" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Serĉi menuan butonon" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Malfermu ŝprucserĉilon" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opcioj" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Opcioj menuo butonon" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Malfermu agordoj ŝprucfenestron" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Okej" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Kelkaj dosieroj no estas importebla" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Ĉi tiu povas havi plurajn kaŭzoj:\n" "- La aŭdio formo ne estas subtenita.\n" "- La vojprefikso aŭ dosiernomo enhavas ne-utf8 signojn\n" "- La dosiero(j) estas eksvalidaj aŭdiaj doserioj\n" "- La dosiero(j) estas koruptaj" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Freŝa" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Listo de verkistoj" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Verkisto" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Listo de rakontistoj" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Rakontisto" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Listo de libroj" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Komenci esplori vian bibliotekon per elekti la Verkisto aŭ Rakontisto vidon" #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Bonvolu atendi dum Cozy pretigas vian bibliotekon" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importi viajn Sonlibrojn" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy aŭtomate importas viajn sonlibrojn en unu doseriujo - via biblioteko" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Ŝovmeti" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Ŝovi vian sonlibrojn en Cozy, kaj ili automate importiĝas" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "Ŝarĝi sonlibrojn el dosierujo, retdisko, aŭ ekstera disko" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Elektu" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Rekurigu" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Rekuriga klavo" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Rekurigu reproduktado" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Ekreproduktu" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Ludiga/Paŭziga Klavo" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Eku aŭ paŭzu la reproduktado" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Antaŭen" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Antaŭen klavo" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Antaŭa Reproduktado" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Aktuale ludanta" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Libra-titolo" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Titolo de aktuale ludanta libro" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Partnomo" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Titolo de la aktuale ludanta parto" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Pasinta tempo" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tempo pasinta" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Pasinta tempo de aktuala parto" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Saltu al loko en aktuala ĉapitro" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Loko ŝovilo" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Loko de la aktuala parto en sekundoj" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Restanta tempo" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tempo restanta" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Restanta tempo de aktuala parto" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "laŭtoregilo" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Rapideco de reproduktado" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Dormtempigilo" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Tempigila menuo klavo" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Malfermu dormtempigilan ŝprucfenestron" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Malfermu libron" #: data/ui/preferences.ui:55 msgid "General" msgstr "Ĝenerala" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Aspekto" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Etikedoj" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktivigi se verkisto kaj rakontisto estas malĝuste montrita" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Reproduktado" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Rekurigu 30 sekundojn de la aktuala libro dum startado de Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Dormtempigilo" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Memoro" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Artaĵo" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Ĉiam uzi bildoj (cover.jpg, *.png, …) kam disponebla" #: data/ui/preferences.ui:247 data/ui/preferences.ui:253 msgid "Storage locations" msgstr "Memora lokoj" #: data/ui/preferences.ui:312 msgid "Add location" msgstr "Aldoni loko" #: data/ui/preferences.ui:338 msgid "Remove location" msgstr "Forigi lokon" #: data/ui/preferences.ui:376 msgid "Toggle this storage location to be internal/external." msgstr "Baskuli ĉi tiun memora loko laŭ interna/ekstera" #: data/ui/preferences.ui:405 msgid "Set as default storage location for new audiobooks" msgstr "Agordi kiel defaŭlta loko por novaj sonlibroj" #: data/ui/preferences.ui:409 msgid "Set as default" msgstr "Agordi kiel defaŭlto" #: data/ui/preferences.ui:453 msgid "Feedback" msgstr "Remarkoj" #: data/ui/preferences.ui:463 msgid "User Feedback" msgstr "Uzanta remarkoj" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Serĉi" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Serĉa tajpulo" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Serĉi vian sonlibran bibliotekon" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Kiun libron ve serĉas?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Libro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Parto" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Neniu trovita :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Daŭro de tempigilo" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Tempigila daŭro ŝovilo" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Agordu dormtempigilo daŭro laŭ minutoj" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Haltu post kiam aktuala ĉapitro" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Ŝalti sistema elektroregilo" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tip de ago kiam la tempigilo finas.\n" "“Malŝalti” provos malŝalti vian sistemon\n" "“Halteti” provos halteti vian sistemon." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Sistema elektra ago\n" "fari" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "halteti" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "malŝalti" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Skani Bibliotekon" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Kaŝi malhaveblajn librojn" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Agordoj" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Helpo" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Pri" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "Ĉesi" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Bonvenu!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Aldonu viajn sonlibrojn kaj ni komfortiĝu." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Kio estas nova?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Daŭri" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Kio estas nova en Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "Tute reskribita kaj multe pli fidinda importilo por medioj" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Ĉi vi spertis sondosierojn kiu ne estis importeblaj? Ŝovmetu tiujn " "dosierojn sur Cozy aŭ uzu la aplikaĵa menuo en la titola breto por reskani " "viajn sonlibrajn dosierujojn!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Subtenita aŭdvidea dosieroj aktuale estas mp3, m4a, flac, ogg, opus and wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Pli venonta en malantaŭa ĝisdatigo." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Grava ŝanĝo en biblioteka agordado" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Antaŭe ĉiu doserio kiu estis importita en via biblioteko sed ne plu " "trovigeblis estus forigita el biblioteka dum skanon." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Nun, sonlibroj ne plu estas forigita el via biblioteka aŭtomate. Ĉi tiu " "malhelpas sentintencan perdadon de la progreson de sonlibro kiam dosiero no " "troviĝeblas dummomente." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Por forigi sonlibron el la biblioteko, simple klaki dekstre ĝin kaj elekti " "la “Forigi el biblioteko” opcio." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Baza subteno por m4b sonlibroj" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Multe da vi atendas ĝin: Subteno por m4b sonlibroj! Ĉi tiu versio prezentas " "baza subteno por m4b dosieroj sen ĉapitra subteno." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Ŝovmetu viajn m4b dosierojn en Cozy aŭ uzu la aplikaĵan menuon en la titola " "breto por reskani viajn sonlibrajn dosierujojn." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "Ĉapitra subteno sekvas en malantaŭa ĝisdatigo. Restu atenta!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Ĉapitra subteno por m4b sonlibroj" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Ĉi tiu versio de Cozy prezentas ĉapitran subtenon por m4b sonlibroj!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Se vi jam havas m4b dosierojn importitajn, vi devas starti skanon de via " "biblioteko el la aplikaĵo menuo." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "La ĉapitroj tiam estos eltrovita." cozy-1.3.0/po/es.po000066400000000000000000000646211457036466300141130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2019 # elgosz , 2020 # Adolfo Jayme-Barrientos, 2020 # Jose Luis Tirado , 2021 # Óscar Fernández Díaz , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Óscar Fernández Díaz , 2022\n" "Language-Team: Spanish (https://www.transifex.com/geigi/teams/78138/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audiolibros" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Copiando" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "No se pudo copiar: El directorio de audiolibros es de sólo lectura" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "No se pudo copiar: El disco está lleno" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "No se pudo copiar: Permiso denegado" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Error al importar nuevos archivos" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Capítulo" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} hora" msgstr[1] "{hours} horas" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuto" msgstr[1] "{minutes} minutos" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} segundo" msgstr[1] "{seconds} segundos" #: cozy/tools.py:102 msgid "finished" msgstr "terminado" #: cozy/tools.py:126 msgid "never" msgstr "nunca" #: cozy/tools.py:128 msgid "today" msgstr "hoy" #: cozy/tools.py:130 msgid "yesterday" msgstr "ayer" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "Hace %s días" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "Hace {weeks} semana" msgstr[1] "Hace {weeks} semanas" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "Hace {months} mes" msgstr[1] "Hace {months} meses" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "Hace {years} año" msgstr[1] "Hace {years} años" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Descargado" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Descargar" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Reproducir esta sección" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disco" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Todos los archivos" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Establecer carpeta de audiolibros" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} no está disponible." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marcar como leído" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Abrir en explorador de archivos" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Eliminar de la biblioteca" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Desactivado" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Informe de errores básico" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Informe de errores detallado" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Informe de errores detallado con errores de importación" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Ningún informe de errores o cierres inesperados." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "La siguiente información será enviada en caso de fallo o error:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Que tipo de error se produjo" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Línea de código donde se origino el error" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versión de Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribución de Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Ambiente de escritorio" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tipos de archivos de medios que Cozy no pudo importar" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Todos" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Mostrar todos los libros" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Ir al autor" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Ir al lector" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Reproducir este libro" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Apagado" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Disco externo" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Disco interno" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Refrescando la colección de audiolibros" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Copiando nuevos archivos…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Cambiando ubicación del audiolibro..." #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Reproducir" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restante" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Última reproducción" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Publicado" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "No se pueden encontrar algunos o todos los archivos de este libro." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "no disponible" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Cargando capítulos, por favor espere..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Abrir la sinopsis del libro" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Cerrar Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Recibir ayuda en GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Se ha producido un error al actualizar la base de datos" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Durante una actualización de la base de datos se ha producido un error y Cozy no podrá iniciarse.\n" "Se creó una copia de seguridad de la base de datos antes de la actualización y se ha restaurado ahora.\n" "Hasta que se resuelva este problema, por favor utilice la versión 0.9.5 de Cozy.\n" "Puede ayudar a resolver este problema reportando un problema en GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Cancelar" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Eliminar audiolibro" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "¿Estás seguro de que quieres eliminar el audiolibro seleccionado?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "El audiolibro será eliminado de tu disco y de la biblioteca de Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Comentarios de usuario" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Puedes ayudar a mejorar Cozy aportando información en caso de fallos y " "errores." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Otorgar esta información es opcional y completamente anónima. Nunca " "recolectaremos información personal, archivos que importaste o ninguna otra " "información que pudiera identificarte." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy es código libre, el código y los comentarios de pueden leer aquí:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Localizar" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Archivo no encontrado" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "El archivo no se ha encontrado. ¿Quiere localizarlo manualmente?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Mostrar el progreso de la tarea en segundo plano" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Buscar en la biblioteca" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Botón de menú de búsqueda" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Abrir el cuadro de búsqueda" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opciones" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Botón de menú de opciones" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Abrir el cuadro de opciones" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Aceptar" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Algunos archivos no pudieron importarse" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Puede deberse a varios motivos:\n" "• No se admite el formato de audio\n" "• La ruta o el nombre de archivo contiene caracteres no UTF-8\n" "• Los archivos de audio no son válidos\n" "• Los archivos están dañados" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Reciente" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lista de autores" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista de lectores" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lector" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lista de libros" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Empiece a explorar su biblioteca cambiando a la vista de Autor o de Lector." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Está atento mientras Cozy prepara tu biblioteca…" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importe sus audiolibros" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importa automáticamente sus audiolibros a un directorio: su biblioteca." #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Arrastrar y soltar" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Arrastre sus audiolibros a Cozy y se importarán automáticamente." #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Cargar audiolibros desde un directorio, una unidad de red o un disco externo" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Seleccionar" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Retroceder" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Retroceder" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Retroceder la reproducción" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Reproducir" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Botón de reproducción/pausa" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Iniciar o pausar la reproducción" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Avanzar" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Botón de avance" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Botón de retroceso" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Ahora en reproducción" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Título del libro" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Título del libro que se está reproduciendo" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nombre de la sección" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Título de la sección que se está reproduciendo" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Tiempo transcurrido" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tiempo transcurrido" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Tiempo transcurrido de la sección actual" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Saltar a la posición en el capítulo actual" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Deslizador de posición" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posición de la sección actual en segundos" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tiempo restante" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tiempo restante" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Tiempo restante de la sección actual" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Control de volumen" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Velocidad de reproducción" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Temporizador de apagado" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Botón de temporizador de apagado" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Abrir el cuadro del temporizador" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Abrir libro" #: data/ui/preferences.ui:55 msgid "General" msgstr "General" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Apariencia" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Etiquetas" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Activar si el autor y el lector se muestran de forma incorrecta" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Reproducción" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Rebobinar 30 segundos del libro actual al iniciar Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Temporizador para dormir" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Almacenamiento" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Material gráfico" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Use siempre imágenes (cover.jpg, *.png, …) cuando estén disponibles" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Ubicaciones de almacenamiento" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Añadir ubicación" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Eliminar ubicación" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Alternar esta ubicación de almacenamiento entre interna y externa." #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "" "Establecer como ubicación de almacenamiento predeterminada para nuevos " "audiolibros" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Establecer como predeterminado" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Comentarios" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Comentarios de usuario" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Buscar" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Cuadro de búsqueda" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Buscar en su biblioteca de audiolibros" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "¿Qué libro está buscando?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Libro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Sección" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "No se ha encontrado nada :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Duración del temporizador" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Deslizador del tiempo del temporizador" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Ajustar el temporizador de apagado en minutos" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Parar tras el capítulo actual" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Activar control de encendido del sistema" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tipo de acción que se efectuará al terminar el temporizador.\n" "«apagar» intentará apagar el sistema.\n" "«suspender» intentará suspender el sistema (también se conoce como «dormir»)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "Acción ha realizar" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "suspender" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "apagar" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "Anali_zar biblioteca" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Ocultar libros no disponibles" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferencias" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "Ay_uda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Acerca de" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Salir" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "¡Bienvenido/a!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Añada sus audiolibros y pongámonos cómodos." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "¿Novedades?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Continuación" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Novedades en Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Un importador de archivos completamente re-escrito y mucho más confiable." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "¿Te encontraste con algún archivo que no pudiste importar? ¡Puedes arrastrar" " y soltar esos archivos en Cozy o usar el menú de la aplicación en la barra " "de título para re-escanear tus directorios de audiolibros!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Los archivos soportados actualmente son mp3, m4a, flac, ogg, opus y wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Más cosas en una actualización futura" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Un cambio importante en la gestión de las bibliotecas" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Anteriormente, todos los archivos que se importaban en la biblioteca, pero " "que ya no se podían encontrar, se eliminaban de la biblioteca durante una " "exploración." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Ahora los audiolibros ya no se eliminan automáticamente de tu biblioteca. " "Esto evita perder accidentalmente el progreso de un audiolibro cuando un " "archivo no puede ser encontrado temporalmente." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Para eliminar un audiolibro de la biblioteca basta con hacer clic con el " "botón derecho del ratón sobre él y elegir la opción de eliminar de la " "biblioteca." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Soporte básico para libros de audio m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Muchos lo han estado esperando: ¡Soporte para los audio libros de m4b! Esta " "versión tiene soporte básico para archivos m4b sin soporte de capítulos." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Arrastra y suelta tus archivos m4b en Cozy o usa el menú de la aplicación en" " la barra de título para volver a explorar tus directorios de audiolibros." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "El soporte para los capítulos se presentará en una actualización posterior. " "¡Estén atentos!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Compatibilidad con capítulos de audiolibros m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "¡Esta versión de Cozy incluye soporte de capítulos para audiolibros m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Si ya tiene archivos m4b importados, tendrá que iniciar un análisis de su " "biblioteca desde el menú de la aplicación." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Entonces se detectarán los capítulos." cozy-1.3.0/po/extra/000077500000000000000000000000001457036466300142565ustar00rootroot00000000000000cozy-1.3.0/po/extra/LINGUAS000066400000000000000000000001161457036466300153010ustar00rootroot00000000000000be_BY cs de es fa_IR fi fr gl he hi hr hu it ms_MY nl pl pt pt_BR ru sv te tr cozy-1.3.0/po/extra/POTFILES000066400000000000000000000001111457036466300154170ustar00rootroot00000000000000data/com.github.geigi.cozy.desktop data/com.github.geigi.cozy.appdata.xmlcozy-1.3.0/po/extra/be_BY.po000066400000000000000000000100621457036466300155750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Yahor Haurylenka , 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Yahor Haurylenka , 2023\n" "Language-Team: Belarusian (Belarus) (https://app.transifex.com/geigi/teams/78138/be_BY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be_BY\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Прайгравальнік аўдыякніг" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Прайграйце і ўпарадкуйце сваю калекцыю аўдыякніг" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Слухайце аўдыякнігі" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Вы любіце аўдыякнігі? Тады давайце зробім утульна!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy - прайгравальнік аўдыякніг. Вось некаторыя з функцый:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Імпартуйце ўсе свае аўдыякнігі ў Cozy, каб зручна іх праглядаць" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Слухайце свае аўдыякнігі без DRM у фармаце mp3, m4b, m4a (aac, ALAC, ...), " "flac, ogg і wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Запамінае вашу пазіцыю прайгравання" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Таймер сну" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Рэгуляванне хуткасці прайгравання для кожнай кнігі асобна" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Пошук у вашай бібліятэцы" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Падтрымка некалькіх размяшчэнняў сховішчаў" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Аўтаномны рэжым! Гэта дазваляе захоўваць аўдыякнігі ва ўнутраным сховішчы, " "калі вы захоўваеце свае аўдыякнігі на знешнім або сеткавым дыску. Ідэальна " "для праслухоўвання ў дарозе!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Каб імпартаваць новыя аўдыякнігі, проста перацягніце іх" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Сартуйце свае аўдыёкнігі па аўтару, дыктару і назве" cozy-1.3.0/po/extra/cs.po000066400000000000000000000065351457036466300152340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Pavel Zahradnik , 2021 # Pavel Patz, 2022 # Radim Šnajdr, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Radim Šnajdr, 2024\n" "Language-Team: Czech (https://app.transifex.com/geigi/teams/78138/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Přehrávač audioknih" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Přehrávání a uspořádání sbírky audioknih" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Poslouchejte audioknihy" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Máte rádi audioknihy? Tak si je užijte s Cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy je přehrávač audioknih. Mezi jeho vlastnosti patří:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Import všech vašich audioknih pro jejich snadné procházení" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Poslech mp3, m4b, m4a (aac, ALAC, ...), flac, ogg a wav audioknih bez DRM" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Zapamatování pozice přehrávání" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Časovač spánku" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Individuální rychlost přehrávání pro každou knihu" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Prohledávání vaší knihovny" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Podpora více úložných míst" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Režim offline! Ten vám umožní ponechat audioknihu v interním úložišti, pokud" " máte audioknihy uložené na externím nebo síťovém disku. Ideální pro poslech" " na cestách!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Import nových audioknih přetažením" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Třídění audioknih podle autora, čtenáře a názvu" cozy-1.3.0/po/extra/de.po000066400000000000000000000065651457036466300152220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2021 # Mark-Daniel Lüthje , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Mark-Daniel Lüthje , 2021\n" "Language-Team: German (https://app.transifex.com/geigi/teams/78138/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Hörbuch Player" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Höre und organisiere deine Hörbuchsammlung" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Hören Sie Hörbücher" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Du magst Hörbücher? Dann bist du mit Cozy richtig!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy ist ein Hörbuchspieler. Hier sind einige der Merkmale:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importieren Sie alle ihre Hörbücher nach Cozy um sie leicht zu durchsuchen" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Höre deine DRM-freien mp3, m4b, m4a (aac, ALAC, ...), flac, ogg und wav " "Hörbücher an" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Merkt sich, wo du das letzte mal aufgehört hast" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Schlafen Timer" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "" "Die Wiedergabegeschwindigkeit kann für jedes Hörbuch separat eingestellt " "werden" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Durchsuche deine Bibliothek" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Unterstützung mehrer Speicherorte" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Offline Modus: Er erlaubt es dir Hörbücher, die du auf einer externen " "Festplatte oder auf einer Netzwerkfestplatte gespeichert hast, für unterwegs" " auf deinem internen Speicher zu speichern." #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Drag&Drop um neue Hörbücher zu impoertieren" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Sortiere deine Hörbücher nach Autor, Leser und Name" cozy-1.3.0/po/extra/es.po000066400000000000000000000070651457036466300152350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Jose Luis Tirado , 2019 # Julian Geywitz , 2021 # 3d8f3be0ee8144f79bb8d426275ac860_306eb54 <399766b5ab6702f5e3ef857abef0cf21_951974>, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: 3d8f3be0ee8144f79bb8d426275ac860_306eb54 <399766b5ab6702f5e3ef857abef0cf21_951974>, 2022\n" "Language-Team: Spanish (https://app.transifex.com/geigi/teams/78138/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Reproductor de audiolibros" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Reproducir y organizar su colección de audiolibros" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Escuchar audiolibros" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "¿Le gustan los audiolibros? Entonces, ¡instale Cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy es un reproductor de audiolibros. Estas son algunas de sus " "características:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importe todos sus audiolibros a Cozy para navegar cómodamente por ellos" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Escuchar sus audiolibros sin DRM en mp3, m4a (aac, ALAC, ..:), flac, ogg y " "wav." #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Recuerda la posición de reproducción." #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Temporizador de apagado" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "" "Control de la velocidad de reproducción para cada libro de forma individual." #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Buscar en la biblioteca" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Soporta varias ubicaciones de almacenamiento." #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "¡Modo fuera de línea! Le permite mantener un audiolibro en el almacenamiento" " interno si los almacena en unidades externas o de red. ¡Perfecto para " "escuchar en cualquier parte!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Arrastrar y soltar para importar nuevos audiolibros." #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Ordenar los libros por autor, lector o nombre." cozy-1.3.0/po/extra/extra.pot000066400000000000000000000044541457036466300161340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage " "if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "" cozy-1.3.0/po/extra/fa_IR.po000066400000000000000000000076271457036466300156120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # TheBlueQuasar, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: TheBlueQuasar, 2022\n" "Language-Team: Persian (Iran) (https://app.transifex.com/geigi/teams/78138/fa_IR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_IR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "پخش‌کننده کتاب صوتی" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "مجموعه کتاب‌های صوتی‌تان را پخش و مدیریت کنید" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "به کتاب‌های صوتی گوش دهید" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "آیا کتاب‌های صوتی را دوست دارید؟ پس بیایید به جای دنجی برویم!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy یک پخش‌کننده کتاب صوتی است. برخی از ویژگی‌های آن:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "تمام کتاب‌های صوتی‌تان را به Cozy وارد کنید تا به‌راحتی آن‌ها را مرور نمایید" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "به کتاب‌های صوتی mp3، m4a (aac، ALAV، ...)، flac، ogg و wav فاقد DRM خود " "گوش دهید" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "موقعیت پخش‌ شما را به خاطر می‌سپارد" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "زمان‌سنج خواب" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "کنترل سرعت پخش برای هر کتاب به‌صورت مجزا" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "در کتابخانه‌تان جستجو کنید" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "پشتیبانی از چندین محل ذخیره‌سازی" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "حالت آفلاین! این امکان را برایتان فراهم می‌کند که یک کتاب صوتی را در فضای " "ذخیره‌سازی داخلی‌تان نگه دارید اگر کتاب‌های صوتی‌تان را روی درایو خارجی یا " "شبکه نگه‌ می‌دارید. عالی برای گوش دادن در حال آمد و شد!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "برای وارد کردن کتاب‌های صوتی‌تان بکشید و بیاندازید" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "کتاب‌های صوتی‌تان را براساس نویسنده، گوینده و نام مرتب کنید" cozy-1.3.0/po/extra/fi.po000066400000000000000000000066021457036466300152200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Oi Suomi On! , 2020 # Julian Geywitz , 2021 # Jiri Grönroos , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Jiri Grönroos , 2021\n" "Language-Team: Finnish (https://app.transifex.com/geigi/teams/78138/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Äänikirjojen toisto-ohjelma" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Toista ja järjestele äänikirjakokoelmasi" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Kuuntele äänikirjoja" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Pidätkö äänikirjoista? Ota Cozy haltuun!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy on äänikirjojen toisto-ohjelma. Tässä joitain sen ominaisuuksia:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Tuo kaikki äänikirjasi Cozyyn selataksesi niitä mukavasti" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Kuuntele DRM-vapaita mp3, m4b (aac, ALAC, ...), flac, ogg ja wav-" "tiedostomuotoisia äänikirjojasi" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Ohjelma muistaa kohdan johon toisto on jäänyt" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Ajastin" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Toiston nopeudenhallinta jokaiselle kirjalle yksilöllisesti" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Etsi kirjastostasi" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Monitallennussijaintituki" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Yhteydetön tila! Tämä mahdollistaa äänikirjojesi säilyttämisen sisäisessä " "tallennustilassa mikäli varastoit äänikirjoja ulkoiseen verkkoasemaan. Sopii" " hyvin liikkuvaan kuunteluun! " #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Raahaa ja pudota tuodaksesi kirjastoon uusia äänikirjoja" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Lajittele äänikirjasi tekijän, lukijan ja nimen mukaan" cozy-1.3.0/po/extra/fr.po000066400000000000000000000067361457036466300152410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Thibault Martin, 2021 # Julian Geywitz , 2021 # Corentin Bettiol , 2021 # renecoty, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: renecoty, 2022\n" "Language-Team: French (https://app.transifex.com/geigi/teams/78138/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Lecteur de livres audio" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Lisez et organisez votre collection de livres audio" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Écoutez des livres audio" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Vous aimez les livres audio ? On est cozy !" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy est un lecteur de livres audio. Voici quelques-unes de ses " "fonctionnalités :" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importez tous vos livres audios dans Cozy pour les parcourir confortablement" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Écoutez vos livres audio sans DRM au format mp3, m4b, m4a (aac, ALAC, …), " "flac, ogg et wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Mémorisation de votre position de lecture" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Minuterie" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Contrôle de la vitesse de lecture pour chaque livre" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Recherchez dans votre bibliothèque" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Prise en charge d’emplacements de stockage multiples" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Mode hors-ligne ! Ceci vous permet de conserver vos livres audio sur votre " "espace de stockage local si vous les stockez sur un emplacement réseau ou " "externe. Parfait pour la lecture en déplacement !" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Glissez et déposez pour importer de nouveaux livres audio" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Triez vos livres audio par auteur, narrateur et nom" cozy-1.3.0/po/extra/gl.po000066400000000000000000000065351457036466300152310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2022 # Fran Diéguez , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Fran Diéguez , 2022\n" "Language-Team: Galician (https://app.transifex.com/geigi/teams/78138/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Reprodutor de audiolibros" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Reproduza e organice a súa colección de audiolibros" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Escoitar audiolibros" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Gústanlle os audiolibros? Entón instale Cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy é un reprodutor de audiolibros. Conta coas seguintes características:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Importe todos os audiolibros en Cozy para exploralos cómodamente" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Escoitar os seus audiolibros sen DRM en mp3, m4a (aac, ALAC, ..:), flac, ogg" " e wav." #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Recorde a posición de reprodución." #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Temporizador para durmir" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "" "Control da velocidade de reprodución para cada libro de forma individual." #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Buscar na biblioteca" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Admite varias localizacións de almacenamento." #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Modo fóra de liña! Permítelle manter un audiolibro no almacenamiento interno" " se os almacena en unidades externas ou de rede. Perfecto para escoitar en " "calquera parte!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Arrastre e solte para importar novos audiolibros." #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Ordenar os libros por autor, lector ou nome." cozy-1.3.0/po/extra/he.po000066400000000000000000000073331457036466300152200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Yaron Shahrabani , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Yaron Shahrabani , 2022\n" "Language-Team: Hebrew (https://app.transifex.com/geigi/teams/78138/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "נגן ספרי שמע" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "ניתן להשמיע ולסדר את אוסף ספרי השמע שלך" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "האזנה לספרי שמע" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "ספרי שמע מעניינים אותך? בואו נתכרבל!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy הוא נגן ספרי שמע. הנה כמה מהיכולות שלו:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "ניתן לייבא את כל הספרי השמע שלך ל־Cozy כדי לעיין בהם בנוחות" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "מאפשר להאזין לספרי השמע שלך מהסוגים mp3,‏ m4b,‏ m4a (aac, ALAC, …), flac,‏ " "ogg ו־wav שאינם מוגנים ב־DRM (ניהול זכויות דיגיטליות)" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "זוכר את מיקום ההשמעה שלך" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "מתזמן שינה" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "בקרת מהירות נגינה לכל ספר בנפרד" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "חיפוש בספרייה שלך" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "תמיכה במגוון מיקומי אחסון" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "מצב בלתי מקוון! מאפשר לך לשמור על ספרי השמע באחסון הפנימי שלך במקרה שספרי " "השמע שלך מאוחסנים בכונן שמחובר לרשת או חיצוני. מושלם להאזנה בדרכים!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "ניתן לגרור ולשחרר כדי לייבא ספרי שמע חדשים" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "ניתן למיין את ספרי השמע שלך לפי סופר, קורא ושם" cozy-1.3.0/po/extra/hi.po000066400000000000000000000104051457036466300152160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Panwar108 , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Panwar108 , 2021\n" "Language-Team: Hindi (https://app.transifex.com/geigi/teams/78138/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "ऑडियो पुस्तक प्लेयर" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "ऑडियो पुस्तक संग्रह श्रवण एवं प्रबंधन" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "ऑडियो पुस्तकें श्रवण करें" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "क्या आपकी ऑडियो पुस्तकों में रूचि हैं? यदि हाँ तो Cozy उपयोग करें!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy एक आधुनिक ऑडियो पुस्तक प्लेयर है। इसकी विशेषताएँ निम्नलिखित हैं :" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "अपनी ऑडियो पुस्तकों के सरल प्रबंधन हेतु उन सभी को Cozy में आयात करें" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "डीआरएम मुक्त निःशुल्क mp3, m4b, m4a (aac, ALAC, …), flac, ogg व wav ऑडियो " "पुस्तकें श्रवण करें" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "वाचक स्थिति स्मरण" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "निद्रा टाइमर" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "प्रत्येक पुस्तक हेतु वाचक गति नियंत्रण" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "संग्रह में खोजें" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "एकाधिक संचय स्थान समर्थन" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "ऑफलाइन मोड! इस द्वारा आप ऑडियो पुस्तकें आंतरिक स्थान पर संचित कर सकते हैं " "यदि वे बाह्य या नेटवर्क ड्राइव पर हैं। श्रवण करें कभी भी कहीं भी!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "माउस द्वारा ड्रैग कर नवीन ऑडियो पुस्तकें आयात करें" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "ऑडियो पुस्तकें लेखक, वाचक व नाम से अनुक्रमित करें" cozy-1.3.0/po/extra/hr.po000066400000000000000000000064531457036466300152370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Milo Ivir , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Milo Ivir , 2021\n" "Language-Team: Croatian (https://app.transifex.com/geigi/teams/78138/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\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" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Program za slušanje audio knjiga" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Slušaj audio knjige i upravljaj tvojom zbirkom" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Slušaj audio knjige" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Voliš audio knjige? Koristi Cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy je player za audio knjige. Neke od funkcija su:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Uvezi sve svoje audio knjige u Cozy za jednostavno pregledavanje" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Slušaj audio knjige u formatima mp3, m4b, m4a (aac, ALAC, …), flac, ogg i " "wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Program pamti položaj reprodukcije" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Odbrojavanje do mirovanja" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Upravljanje brzinom reprodukcije za svaku knjigu pojedinačno" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Pretraži tvoju zbirku" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Podrška za višestruka spremišta" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Izvanmrežni način rada! Omogućuje spremanje audio knjiga u internom " "spremištu, ako se audio knjige spreme na vanjski ili mrežni pogon. Savršeno " "za slušanje na putu!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Uvoz novih audio knjiga pomoću povuci-i-ispusti" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Razvrstavanje audio knjiga po autoru, čitaču i imenu" cozy-1.3.0/po/extra/hu.po000066400000000000000000000065021457036466300152350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Benedek Dévényi, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Benedek Dévényi, 2024\n" "Language-Team: Hungarian (https://app.transifex.com/geigi/teams/78138/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Hangoskönyv-lejátszó" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Hallgasd és rendszerezd hangoskönyvtáradat" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Hallgass hangoskönyveket" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Szereted a hangoskönyveket? Akkor érezd magad otthonosan a Cozy-val!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "A Cozy egy hangoskönyv-lejátszó. Íme néhány funkciója:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importáld hangoskönyveidet a Cozyba, hogy kényelmesen böngészhesd őket" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Hallgasd kedvenc DRM-mentes hangoskönyveidet mp3, m4b, m4a (aac, ALAC, …), " "flac, ogg és wav formátumban" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Megjegyzi a hallgatott könyveid jelátszási pozícióját" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Alvásidőzítő" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Lejátszási sebesség szabályozása minden könyvhöz külön-külön" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Keresés a könyvtáradban" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Támogatja több tárolóhely megadását" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Offline mód! Így letöltheted hangoskönyveidet, ha azokat egy külső vagy " "hálózati meghajtón tárolod. Tökéletes az útközbeni hallgatáshoz!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Hangoskönyvek importálása „fogd és vidd” funkcióval" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Rendszerezd hangoskönyveidet cím, szerző és előadó szerint" cozy-1.3.0/po/extra/it.po000066400000000000000000000066231457036466300152410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2021 # albanobattistella , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: albanobattistella , 2021\n" "Language-Team: Italian (https://app.transifex.com/geigi/teams/78138/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Lettore di audiolibri" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Riproduci e organizza la tua raccolta di audiolibri" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Ascolta gli audiolibri" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Ti piacciono gli audiolibri? Allora mettiamoci comodi!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cosy è un lettore di audiolibri. Ecco alcune delle caratteristiche:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Importa tutti i tuoi audiolibri in Cosy per sfogliarli comodamente" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Ascolta i tuoi audiolibri DRM free mp3, m4b, m4a (aac, ALAC, ...), flac, ogg" " e wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Ricorda la posizione di riproduzione" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Timer" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "" "Controllo della velocità di riproduzione per ogni libro individualmente" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Cerca nella tua libreria" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Supporto per più posizioni di archiviazione" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Modalità offline! Ciò ti consente di conservare un audiolibro nella memoria " "interna se archivi i tuoi audiolibri su un'unità esterna o di rete. Perfetto" " da ascoltare in movimento!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Trascina e rilascia per importare nuovi audio libri" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Ordina i tuoi audiolibri per autore, lettore e nome" cozy-1.3.0/po/extra/meson.build000066400000000000000000000001411457036466300164140ustar00rootroot00000000000000i18n.gettext('extra', args: [ '--from-code=UTF-8' ], preset: 'glib', install: false )cozy-1.3.0/po/extra/ms_MY.po000066400000000000000000001122261457036466300156460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # abuyop , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-22 22:01+0200\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: abuyop , 2021\n" "Language-Team: Malay (Malaysia) (https://www.transifex.com/geigi/teams/78138/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" #: data/com.github.geigi.cozy.desktop:3 #: data/com.github.geigi.cozy.appdata.xml:6 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Pemain Buku Audio" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Baca dan urus koleksi buku audio anda" #: data/com.github.geigi.cozy.appdata.xml:7 msgid "A modern audio book player" msgstr "Sebuah pembaca buku audio yang modern" #: data/com.github.geigi.cozy.appdata.xml:9 msgid "Do you like audio books? Then lets get cozy!" msgstr "Anda suka mendengar buku audio? Jom dapatkan cozy!" #: data/com.github.geigi.cozy.appdata.xml:12 msgid "" "Cozy is a modern audio book player. Here are some of the current features:" msgstr "" "Cozy merupakan sebuah pembaca buku audio yang modern. Senarai di bawah " "merupakan beberapa fitur semasa:" #: data/com.github.geigi.cozy.appdata.xml:16 msgid "Import all your audio books into cozy to browse them comfortably" msgstr "" "Import semua buku audio anda ke dalam cozy supaya dapat melayarinya dengan " "selesa" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Dengar buku audio mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav yang bebas" " DRM" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Remembers your playback position" msgstr "Ingat kedudukan main balik anda" #: data/com.github.geigi.cozy.appdata.xml:19 msgid "Sleep timer!" msgstr "Pemasa tidur!" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Playback speed control for each book individually" msgstr "Kawal kelajuan main balik untuk setiap buku secara individu" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "Search your library" msgstr "Gelintar pustaka anda" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Multiple storage location support" msgstr "Sokongan lokasi storan berbilang" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Mod luar talian! Ia membolehkan anda menyimpan buku audio anda ke dalam " "storan dalaman anda sekiranya anda menyimpan buku audio pada pemacu luar " "atau rangkaian. Mudah mendengar ketika berada di luar!" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Drag and Drop to import new audio books" msgstr "Serert dan Lepas untuk mengimport buku audio baharu" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Sort your audio books by author, reader and name" msgstr "Isih buku audio anda mengikut pengarang, pembaca dan nama" #: data/com.github.geigi.cozy.appdata.xml:45 msgid "Julian Geywitz" msgstr "Julian Geywitz" #: data/com.github.geigi.cozy.appdata.xml:54 msgid "Performance improvements for the book detail view and some bugfixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:58 msgid "" "Chapters in the book detail view will now be loaded lazily (thanks chris-" "kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:59 msgid "" "Books with a single chapter don't display a chapter number anymore (thanks " "chris-kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:60 msgid "Fix: Locals in What's new in Cozy screen (thanks alyssais!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:61 msgid "Fix: Catch an error that could occur when a book stops" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:62 msgid "Small performance improvements" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:63 #: data/com.github.geigi.cozy.appdata.xml:78 #: data/com.github.geigi.cozy.appdata.xml:93 #: data/com.github.geigi.cozy.appdata.xml:107 #: data/com.github.geigi.cozy.appdata.xml:121 #: data/com.github.geigi.cozy.appdata.xml:134 #: data/com.github.geigi.cozy.appdata.xml:148 #: data/com.github.geigi.cozy.appdata.xml:160 #: data/com.github.geigi.cozy.appdata.xml:183 #: data/com.github.geigi.cozy.appdata.xml:205 #: data/com.github.geigi.cozy.appdata.xml:227 #: data/com.github.geigi.cozy.appdata.xml:243 #: data/com.github.geigi.cozy.appdata.xml:259 #: data/com.github.geigi.cozy.appdata.xml:270 #: data/com.github.geigi.cozy.appdata.xml:286 #: data/com.github.geigi.cozy.appdata.xml:298 #: data/com.github.geigi.cozy.appdata.xml:313 #: data/com.github.geigi.cozy.appdata.xml:328 #: data/com.github.geigi.cozy.appdata.xml:342 #: data/com.github.geigi.cozy.appdata.xml:365 #: data/com.github.geigi.cozy.appdata.xml:377 msgid "As always, updated translations thanks to all of the translators!" msgstr "Seperti biasa, kemas kini terjemahan terima kasih para penterjemah!" #: data/com.github.geigi.cozy.appdata.xml:69 #: data/com.github.geigi.cozy.appdata.xml:84 #: data/com.github.geigi.cozy.appdata.xml:127 #: data/com.github.geigi.cozy.appdata.xml:265 #: data/com.github.geigi.cozy.appdata.xml:304 #: data/com.github.geigi.cozy.appdata.xml:319 #: data/com.github.geigi.cozy.appdata.xml:334 msgid "A small bugfix release which makes Cozy more reliable." msgstr "" "Satu keluaran pembaikan pepijat kecil yang menjadikan Cozy lebih diharap." #: data/com.github.geigi.cozy.appdata.xml:73 msgid "" "When an issue occurs during playback the error message is displayed to the " "user" msgstr "" "Apabila satu isu berlaku ketika main balik, mesej ralat dipaparkan kepada " "pengguna" #: data/com.github.geigi.cozy.appdata.xml:74 msgid "" "Fix: Importing media without tags now properly decodes the file name as " "chapter name (thanks chris-kobrzak!)" msgstr "" "Baiki: Pengimportan media tanpa tag kini dapat menyahkod nama fail dengan " "baik seperti nama bab (terima kasih buat chris-kobrzak!)" #: data/com.github.geigi.cozy.appdata.xml:75 msgid "Fix: Ensure that always a default storage location is present" msgstr "Baiki: Memastikan sentiasa ada lokasi storan lalai yang hadir" #: data/com.github.geigi.cozy.appdata.xml:76 msgid "Fix: During import an error could occur which stopped the import" msgstr "" "Baiki: Ketika mengimport satu ralat berlaku yang menyebabkan proses " "pengimportan terhenti" #: data/com.github.geigi.cozy.appdata.xml:77 msgid "Fix: During the database migration an error could occur" msgstr "Baiki: Ketika pemindahan pangkalan data, satu ralat berlaku" #: data/com.github.geigi.cozy.appdata.xml:88 msgid "" "When copying files to the audiobook library goes wrong, the user is now " "informed with the error" msgstr "" "Jika proses menyalin fail ke dalam pustaka buku audio bermasalah, kini " "pengguna dimaklumkan ralat tersebut" #: data/com.github.geigi.cozy.appdata.xml:89 msgid "Fix: Possible error while displaying offline cache copy progress" msgstr "" "Baiki: Ralat mungkin berlaku ketika memaparkan kemajuan salin cache luar " "talian" #: data/com.github.geigi.cozy.appdata.xml:90 msgid "" "Fix: When changing the audiobook location or selecting a file in the file " "not found dialog an unexpected error could occur" msgstr "" "Baiki: Ketika mengubah lokasi buku audio atau memilih satu fail di dalam " "fail tidak ditemui, satu dialog ralat tidak dijangka muncul" #: data/com.github.geigi.cozy.appdata.xml:91 msgid "Fix: Removing a storage dir in settings did not work" msgstr "Baiki: Membuang satu storan dalam tetapan yang tidak berfungsi" #: data/com.github.geigi.cozy.appdata.xml:92 msgid "Fix: Removing a book from the library did sometimes not work" msgstr "Baiki: Membuang satu buku dari pustaka kadang kala tidak berlaku" #: data/com.github.geigi.cozy.appdata.xml:99 #: data/com.github.geigi.cozy.appdata.xml:113 msgid "This release features chapter support for m4b files." msgstr "Keluaran ini memfiturkan sokongan bab untuk fail m4b." #: data/com.github.geigi.cozy.appdata.xml:103 #: data/com.github.geigi.cozy.appdata.xml:117 msgid "" "A long awaited feature has finally arrived: Chapter support for m4b files." msgstr "" "Satu fitur yang sangat dinantikan telah tiba: Sokongan bab untuk fail m4b." #: data/com.github.geigi.cozy.appdata.xml:104 #: data/com.github.geigi.cozy.appdata.xml:118 msgid "" "Books with inconsistent spelling are now grouped into a single book (thanks " "chris-kobrzak!)." msgstr "" "Buku-buku dengan ejaan tidak konsisten kini dikelompok dalam satu buku " "(terima kasih chris-kobrzak!)." #: data/com.github.geigi.cozy.appdata.xml:105 #: data/com.github.geigi.cozy.appdata.xml:119 msgid "Improved reliability of restoring the previous playback position." msgstr "" "Kebolehpercayaan ditambah baik ketika memulihkan kedudukan main balik " "terdahulu." #: data/com.github.geigi.cozy.appdata.xml:106 #: data/com.github.geigi.cozy.appdata.xml:120 msgid "" "Fix: clicking on a currently playing chapter did not pause the chapter as " "expected." msgstr "" "Baiki: Klik pada bab semasa yang dimainkan tidak dijeda seperti yang " "diharapkan." #: data/com.github.geigi.cozy.appdata.xml:131 msgid "" "Fix: Playback speed sometimes was not set correctly when a chapter changed." msgstr "" "Baiki: Kelajuan main balik kadang kala tidak ditetapkan dengan baik apabila " "satu bab berubah." #: data/com.github.geigi.cozy.appdata.xml:132 msgid "" "Fix: Changing the playback position with customized playback speed did jump " "to a wrong position." msgstr "" "Baiki: Mengubah kedudukan main balik dengan kelajuan main balik tersuai " "melompat ke kedudukan yang salah." #: data/com.github.geigi.cozy.appdata.xml:133 msgid "Fix: Startup failed if the artwork cache did contain a broken file." msgstr "Baiki: Permulaan gagal jika cache kerja seni ada fail rosak." #: data/com.github.geigi.cozy.appdata.xml:140 msgid "" "This release fixes rare bugs which could prevent Cozy from starting up " "correctly." msgstr "" "Keluaran ini membaiki pepijat-pepijat jarang berlaku yang menghalang Cozy " "dimulakan dengan baik." #: data/com.github.geigi.cozy.appdata.xml:144 msgid "Fix: Startup failed if the last played file could not be found." msgstr "" "Baiki: Permulaan gagal jika fail terakhir yang dimainkan tidak ditemui." #: data/com.github.geigi.cozy.appdata.xml:145 msgid "Fix: Startup failed if the last played book does not exist anymore." msgstr "Baiki: Permulaan gagal jika buku terakhir dimainkan tidak wujud lagi." #: data/com.github.geigi.cozy.appdata.xml:146 msgid "Fix: An error which could occur when removing a storage location." msgstr "Baiki: Satu ralat berlaku ketika membuang satu lokasi storan." #: data/com.github.geigi.cozy.appdata.xml:147 msgid "Some additional minor fixes." msgstr "Beberapa pembaikan kecil tambahan." #: data/com.github.geigi.cozy.appdata.xml:155 msgid "Add a rewind button to the titlebar." msgstr "Tambah satu butang mandir dalam palang tajuk." #: data/com.github.geigi.cozy.appdata.xml:156 msgid "The rewind and forward duration can now be customized in the settings." msgstr "Tempoh mandir dan maju kini boleh disuaikan melalui tetapan." #: data/com.github.geigi.cozy.appdata.xml:157 msgid "Fix: Prevent standby during playback." msgstr "Baiki: Halang bersedia ketika main balik." #: data/com.github.geigi.cozy.appdata.xml:158 msgid "" "Fix: Possible crash during startup with enabled 30 seconds rewind feature." msgstr "" "Baiki: Mungkin berlaku kerosakan ketika permulaan dengan fitur mandir 30 " "saat dibenarkan." #: data/com.github.geigi.cozy.appdata.xml:159 msgid "" "Fix: Adding a new storage location could lead to an internal error which " "might show in strange behavior." msgstr "" "Baiki: Penambahan satu lokasi storan baharu boleh menyebabkan ralat dalaman " "iaitu Cozy berkelakuan pelik." #: data/com.github.geigi.cozy.appdata.xml:166 #: data/com.github.geigi.cozy.appdata.xml:189 #: data/com.github.geigi.cozy.appdata.xml:211 msgid "" "This version of Cozy features an important change in library management. " "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan. Now audiobooks are" " not removed from your library automatically anymore. This prevents " "accidentally loosing the progress of a audiobook when a file can't be found " "temporarily. To remove an audiobook from the library simply right-click on " "it and choose the remove from library option." msgstr "" "Versi Cozy ini memfiturkan satu perubahan penting dalam pengurusan pustaka. " "Sebelum ini, setiap fail yang diimport dalam pustaka anda tetapi hilang akan" " dibuang daripada pustaka ketika proses pengimbasan. Kini, buku audio tidak " "dibuang daripada pustaka secara automatik lagi. Tindakan ini menghalang " "kehilangan kemajuan buku audio jika fail hilang buat sementara. Untuk " "membuang buku audio daripada pustaka, hanya klik-kanan pada buku itu dan " "klik pilihan buang daripada pustaka." #: data/com.github.geigi.cozy.appdata.xml:173 #: data/com.github.geigi.cozy.appdata.xml:196 #: data/com.github.geigi.cozy.appdata.xml:218 msgid "" "The download option will be enabled for audiobooks on removable or network " "drives automatically for each new storage location you add." msgstr "" "Pilihan muat turun akan dibenarkan untuk buku audio dalam pemacu boleh alih " "atau rangkaian secara automatik setiap kali anda menambah lokasi storan " "baharu." #: data/com.github.geigi.cozy.appdata.xml:174 #: data/com.github.geigi.cozy.appdata.xml:197 #: data/com.github.geigi.cozy.appdata.xml:219 msgid "" "Unavailable books (books where a file can't be found) can now be opened to " "display the book detail view. They will be flagged with a little unavailable" " tag" msgstr "" "Buku tidak tersedia (buku yang mana failnya tidak ditemui) kini boleh dibuka" " untuk memaparkan pandangan terperinci buku. Ia akan ditanda dengan satu tag" " tidak tersedia" #: data/com.github.geigi.cozy.appdata.xml:175 #: data/com.github.geigi.cozy.appdata.xml:198 #: data/com.github.geigi.cozy.appdata.xml:220 msgid "Under the hood improvements in the media importer" msgstr "Di bawah penambahbaikan utaam dalam pengimport media" #: data/com.github.geigi.cozy.appdata.xml:176 #: data/com.github.geigi.cozy.appdata.xml:199 #: data/com.github.geigi.cozy.appdata.xml:221 msgid "" "Media playback is rewritten from ground up. It's far more stable than " "before." msgstr "" "Main balik media ditulis semula dari asas. Ia lebih stabil berbanding " "sebelum ini." #: data/com.github.geigi.cozy.appdata.xml:177 #: data/com.github.geigi.cozy.appdata.xml:200 #: data/com.github.geigi.cozy.appdata.xml:222 msgid "" "Fix: When a different system language than English is used Cozy created two " "folders in the users home directory on the first startup, a translated and a" " English one. Now only the translated folder will be created." msgstr "" "Baiki: Apabila ada sistem bahasa lain selain Bahasa Inggeris digunakan, Cozy" " akan mencipta dua folder dalam direktori pengguna ketika permulaan kali " "pertama. Iaitu yang diterjemah dan asal Bahasa Inggeris. Sekarang hanya " "folder terjemah sahaja akan dicipta." #: data/com.github.geigi.cozy.appdata.xml:178 #: data/com.github.geigi.cozy.appdata.xml:201 #: data/com.github.geigi.cozy.appdata.xml:223 msgid "Fix: A wrong mouse pointer was displayed with some pointer themes" msgstr "" "Baiki: Penuding tetikus yang salah dipaparkan dengan beberapa tema penuding." #: data/com.github.geigi.cozy.appdata.xml:179 #: data/com.github.geigi.cozy.appdata.xml:202 #: data/com.github.geigi.cozy.appdata.xml:224 msgid "Fix: A memory leak in the importer" msgstr "Baiki: Ada kebocoran ingatan dalam pengimport" #: data/com.github.geigi.cozy.appdata.xml:180 #: data/com.github.geigi.cozy.appdata.xml:203 #: data/com.github.geigi.cozy.appdata.xml:225 msgid "Fix: The playback speed of a book was not remembered correctly" msgstr "Baiki: Kelajuan main balik sesebuah buku tidak diingati dengan baik" #: data/com.github.geigi.cozy.appdata.xml:181 #: data/com.github.geigi.cozy.appdata.xml:204 #: data/com.github.geigi.cozy.appdata.xml:226 msgid "" "Fix: The desktop integration did not respect the switch author and reader " "setting" msgstr "" "Baiki: Penyepaduan atas meja tidak berdasarkan tetapan perubahan pengarang " "dan pembaca" #: data/com.github.geigi.cozy.appdata.xml:182 #: data/com.github.geigi.cozy.appdata.xml:285 msgid "Many other small fixes that make Cozy more reliable" msgstr "Banyak pembaikan kecil lain yang menjadikan Cozy lebih diharap" #: data/com.github.geigi.cozy.appdata.xml:233 #: data/com.github.geigi.cozy.appdata.xml:249 msgid "" "Surprise! Cozy features a new icon thanks to jimmac! This updates also " "features some smaller fixes and a small redesign of the headerbar." msgstr "" "Kejutan baharu! Cozy memfiturkan satu ikon baru... terima kasih jimmac! " "Kemas kini juga memfiturkan beberapa pembaikan dan satu reka bentuk semula " "palang pengepala kecil-kecilan." #: data/com.github.geigi.cozy.appdata.xml:237 #: data/com.github.geigi.cozy.appdata.xml:253 msgid "A new icon! Thanks jimmac :)" msgstr "Satu ikon serba baharu! Terima kasih jimmac :)" #: data/com.github.geigi.cozy.appdata.xml:238 #: data/com.github.geigi.cozy.appdata.xml:254 msgid "Refined headerbar" msgstr "Palang pengepala diperhalusi lagi" #: data/com.github.geigi.cozy.appdata.xml:239 #: data/com.github.geigi.cozy.appdata.xml:255 msgid "A click on the cover image in the headerbar opens the book detail view" msgstr "" "Satu klik atas imej kulit hadapan dalam palang pengepala akan membuka " "pandangan perincian buku" #: data/com.github.geigi.cozy.appdata.xml:240 #: data/com.github.geigi.cozy.appdata.xml:256 msgid "" "Book detail view: Pressing the back button on the mouse brings you back to " "the library" msgstr "" "Pandangan perincian buku: Dengan menekan butang kembali tetikus, anda akan " "kembali semula ke pustaka" #: data/com.github.geigi.cozy.appdata.xml:241 #: data/com.github.geigi.cozy.appdata.xml:257 msgid "Fix: Aborting the download of a book is now handled more gracefully" msgstr "" "Baiki: Proses menghenti-paksa buku yang dimuat turun kini dikendali dengan " "lebih baik" #: data/com.github.geigi.cozy.appdata.xml:242 #: data/com.github.geigi.cozy.appdata.xml:258 msgid "Fix: Opening a book using the return key now works as expected" msgstr "" "Baiki: Proses membuka buku melalui kekunci return kini berfungsi seperti " "yang diharapkan" #: data/com.github.geigi.cozy.appdata.xml:269 msgid "Cozy is now compatible with Python 3.9 (thanks phpwutz!)" msgstr "Cozy kini serasi dengan Python 3.9 (terima kasih phpwutz!)" #: data/com.github.geigi.cozy.appdata.xml:276 msgid "This release features a lot of bug fixes." msgstr "Keluaran ini memfiturkan banyak pembaikan pepijat." #: data/com.github.geigi.cozy.appdata.xml:280 msgid "" "The rewind and fast forward buttons in the desktop integration now jump 30 " "seconds back and forth instead of jumping a whole chapter" msgstr "" "Butang mandir dan maju pantas dalam penyepaduan atas meja kini melompat 30 " "saat ke belakang dan hadapan selain dari melompat terus keseluruhan bab." #: data/com.github.geigi.cozy.appdata.xml:281 msgid "Fix: the rewind button in the toolbar is now working again" msgstr "Baiki: butang mandir dalam palang alat kini berfungsi kembali" #: data/com.github.geigi.cozy.appdata.xml:282 msgid "Fix: automatic rewind, when enabled in settings, is now working again" msgstr "" "Baiki: butang mandir,bila dibenarkan dalam tetapan, kini berfungsi seperti " "biasa" #: data/com.github.geigi.cozy.appdata.xml:283 msgid "" "Fix: when rewinding at the beginning of a book Cozy did jump to the end of " "the book" msgstr "" "Baiki: Ketika memandir pada permulaan buku, Cozy tiba-tiba melompat terus ke" " penghujung buku" #: data/com.github.geigi.cozy.appdata.xml:284 msgid "" "Fix: pressing escape to leave the book detail view is now working again" msgstr "" "Baiki: Kekunci escape berfungsi meninggalkan pandangan perincian buku bila " "ia ditekan" #: data/com.github.geigi.cozy.appdata.xml:292 msgid "" "This release features a rewrite of the book detail view to prepare " "everything for chapter support with m4b files which will follow in a later " "update. If something isn't working as expected let me know!" msgstr "" "Keluaran ini memfiturkan tulis-semula pandangan perincian buku yang dapat " "menyediakan segala sokongan bab untuk fail-fail m4b dalam kemas kini " "terkini. Jika ada masih bermasalah dan tidak berfungsi seperti yang " "diharapkan sila maklum kami!" #: data/com.github.geigi.cozy.appdata.xml:296 msgid "" "Fix: If an audiobook directory contained a lot of non audio files, Cozy " "could skip all other files on import (thanks foliva!)" msgstr "" "Baiki: Jika sesebuah direktori buku audio mengandungi banyak fail bukan " "audio, Cozy akan melangkau semua fail tidak berkenaan ketika mengimport " "(terima kasih foliva!)" #: data/com.github.geigi.cozy.appdata.xml:297 msgid "" "Fix: When copying files via Drag and Drop sometimes the progress bar " "reported an incorrect progress" msgstr "" "Baiki: Ketika menyalin fail melalui Seret dan Lepas, kadang kala palang " "kemajuan melaporkan kemajuan yang salah" #: data/com.github.geigi.cozy.appdata.xml:308 #: data/com.github.geigi.cozy.appdata.xml:323 #: data/com.github.geigi.cozy.appdata.xml:338 msgid "Increase maximum playback speed to 3.5x" msgstr "Tingkatkan kelajuan main balik maksimum sehingga 3.5x" #: data/com.github.geigi.cozy.appdata.xml:309 #: data/com.github.geigi.cozy.appdata.xml:324 #: data/com.github.geigi.cozy.appdata.xml:339 msgid "" "Fix: audio files with uppercase extensions where not detected (thanks to " "leuc)" msgstr "" "Baiki: Fail-fail audio dengan sambungan huruf besar gagal dikesan (terima " "kasih leuc)" #: data/com.github.geigi.cozy.appdata.xml:310 #: data/com.github.geigi.cozy.appdata.xml:325 msgid "" "Fix: when using drag and drop some files where not copied and imported " "correctly" msgstr "" "Baiki: ketika menggunakan kaedah seret dan lepas, beberapa fail tidak " "disalin dan diimport dengan betul" #: data/com.github.geigi.cozy.appdata.xml:311 #: data/com.github.geigi.cozy.appdata.xml:326 #: data/com.github.geigi.cozy.appdata.xml:340 msgid "Fix: removing a book from the library was sometimes not possible" msgstr "" "Baiki: membuang sebuah buku daripada pustaka kadang kala adalah mustahil" #: data/com.github.geigi.cozy.appdata.xml:312 #: data/com.github.geigi.cozy.appdata.xml:327 #: data/com.github.geigi.cozy.appdata.xml:341 msgid "" "Fix: sometimes Cozy's database ran into a locking issue, which could lead to" " unexpected behaviour of Cozy" msgstr "" "Baiki: kadang kala pangkalan data Cozy menghadapi masalah penguncian, yang " "menyebabkan Cozy berkelakuan tidak dijangka" #: data/com.github.geigi.cozy.appdata.xml:348 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support, which " "will follow in a later update. Stay tuned!" msgstr "" "Ramai yang menunggunya: Sokongan untuk buku-buku audio m4b! Versi ini " "memfiturkan sokongan asas untuk fail-fail m4b tanpa sokongan bab, yang akan " "mendapat kemas kini nanti. Harap bersabar!" #: data/com.github.geigi.cozy.appdata.xml:352 msgid "Basic support for m4b audio books (chapters are not supported yet)" msgstr "Sokongan asas untuk buku audio m4b (bab tidak disokong buat masa ini)" #: data/com.github.geigi.cozy.appdata.xml:353 msgid "Fixed multiple bugs when using drag and drop to import files" msgstr "" "Baiki banyak pepijat yang muncul ketika menggunakan kaedah seret dan lepas " "untuk mengimport fail" #: data/com.github.geigi.cozy.appdata.xml:359 #: data/com.github.geigi.cozy.appdata.xml:371 msgid "" "Some of your files where not recognized by Cozy despite being valid audio " "files? Not anymore! This version features a completely rewritten importer " "which is far more reliable. Enjoy!" msgstr "" "Sebahagian fail anda tidak dikenal pasti oleh Cozy walaupun ia merupakan " "fail audio yang sah? Sekarang tidak berlaku lagi! Versi ini memfiturkan " "pengimport sepenuhnya ditulis-semula yang lebih dipercayai. Diharap anda " "menyukainya!" #: data/com.github.geigi.cozy.appdata.xml:363 #: data/com.github.geigi.cozy.appdata.xml:375 msgid "A completely rewritten and far more reliable media importer" msgstr "Pengimport media yang ditulis-semula sepenuhnya dan lebih dipercayai" #: data/com.github.geigi.cozy.appdata.xml:364 #: data/com.github.geigi.cozy.appdata.xml:376 msgid "Optional error reporting on crashes" msgstr "Pelaporan ralat secara pilihan ketika berlaku kerosakan" #: data/com.github.geigi.cozy.appdata.xml:384 msgid "Multiple author and readers are now separated in the library view" msgstr "" "Pengarang dan pembaca berbilang kini diasingkan dalam pandangan pustaka" #: data/com.github.geigi.cozy.appdata.xml:385 msgid "Increase maximum playback speed to 3x" msgstr "Kelajuan main balik maksimum ditingkatkan sehingga 3x" #: data/com.github.geigi.cozy.appdata.xml:386 msgid "" "Fix: playback speed was not saved correctly under some circumstances, thanks" " to magnickolas" msgstr "" "Baiki: kelajuan main balik tidak disimpan dengan betul atas beberapa sebab, " "terima kasih mangnickolas" #: data/com.github.geigi.cozy.appdata.xml:387 msgid "Updated translations thanks to all of the translators!" msgstr "Kemas kini terjemahan, terima kasih kepada semua penterjemah!" #: data/com.github.geigi.cozy.appdata.xml:394 msgid "Fix: Jump to folder was not working" msgstr "Baiki: Lompat ke folder tidak berfungsi" #: data/com.github.geigi.cozy.appdata.xml:395 msgid "Fix: Removing a book from the library did not work as expected" msgstr "" "Baiki: Membuang satu buku daripada pustaka tidak berfungsi seperti yang " "diharapkan" #: data/com.github.geigi.cozy.appdata.xml:396 msgid "Fix: Error that could occur when opening the book overview" msgstr "Baiki: Ralat mungkin berlaku ketika membuka gambaran keseluruhan buku" #: data/com.github.geigi.cozy.appdata.xml:397 #: data/com.github.geigi.cozy.appdata.xml:412 #: data/com.github.geigi.cozy.appdata.xml:424 #: data/com.github.geigi.cozy.appdata.xml:432 #: data/com.github.geigi.cozy.appdata.xml:446 #: data/com.github.geigi.cozy.appdata.xml:454 #: data/com.github.geigi.cozy.appdata.xml:471 #: data/com.github.geigi.cozy.appdata.xml:480 #: data/com.github.geigi.cozy.appdata.xml:492 #: data/com.github.geigi.cozy.appdata.xml:502 #: data/com.github.geigi.cozy.appdata.xml:533 #: data/com.github.geigi.cozy.appdata.xml:552 msgid "Updated translations" msgstr "Terjemahan dikemas kini" #: data/com.github.geigi.cozy.appdata.xml:404 msgid "Support for more mp3 files! Let me know if you have problems." msgstr "" "Lebih sokongan ke atas fail-fail mp3! Beritahu kami jika anda menghadapi " "masalah." #: data/com.github.geigi.cozy.appdata.xml:405 msgid "Preparations to support chapters within audio files" msgstr "Persediaan menyokong bab-bab di dalam fail audio" #: data/com.github.geigi.cozy.appdata.xml:406 msgid "The beginning of the biggest cleanup and refactoring under the hood" msgstr "Permulaan bagi pembersihan dan pemfaktoran-semula besar-besaran" #: data/com.github.geigi.cozy.appdata.xml:407 msgid "Visual improvements in book overview, thanks to elya5" msgstr "" "Penambahbaikan visual dalam gambaran keseluruhan buku, terima kasih elya5" #: data/com.github.geigi.cozy.appdata.xml:408 msgid "Support for smaller screen sizes, thanks again to elya5" msgstr "" "Sokongan ke atas saiz skrin lebih kecil, terima kasih sekali lagi buat elya5" #: data/com.github.geigi.cozy.appdata.xml:409 msgid "Fix: Some book titles where not displayed, thanks to naglis" msgstr "" "Baiki: Sesetengah tajuk buku tidak dapat dipaparkan, terima kasih naglis" #: data/com.github.geigi.cozy.appdata.xml:410 msgid "Fix: Empty books could crash the application" msgstr "Baiki: Buku-buku kosong boleh menyebabkan kerosakan aplikasi" #: data/com.github.geigi.cozy.appdata.xml:411 msgid "Fix: Author and reader can now be swapped from settings" msgstr "" "Baiki: Pengarang dan pembaca kini boleh disilih kedudukannya menerusi " "tetapan" #: data/com.github.geigi.cozy.appdata.xml:419 msgid "Fix: Crash which could occur while changing the titlebar display mode" msgstr "" "Baiki: Kerosakan mungkin berlaku ketika mengubah mod paparan palang tajuk" #: data/com.github.geigi.cozy.appdata.xml:420 msgid "Fix: Better handling of resources that cannot be found" msgstr "Baiki: Pengendalian lebih baik ke atas sumber yang tidak ditemui" #: data/com.github.geigi.cozy.appdata.xml:421 msgid "Fix: Fira font is now readable on the welcome screen" msgstr "Baiki: Fon Fira kini boleh dibaca dalam skrin aluan" #: data/com.github.geigi.cozy.appdata.xml:422 msgid "Fix: Multiple bugs regarding the titlebar" msgstr "Baiki: Pelbagai pepijat berkaitan palang tajuk" #: data/com.github.geigi.cozy.appdata.xml:423 msgid "Fix: File not found dialog was not displayed for external devices" msgstr "" "Baiki: Dialog fail tidak ditemui tidak dipaparkan terhadap peranti luaran" #: data/com.github.geigi.cozy.appdata.xml:431 msgid "Fix: Files with missing tags failed to import" msgstr "Baiki: Fail-fail yang tiada tag gagal diimport" #: data/com.github.geigi.cozy.appdata.xml:439 msgid "" "A warning is displayed in the titlebar if network/external drives are not " "connected" msgstr "" "Satu amaran dipaparkan dalam palang tajuk jika pemacu rangkaian/luar tidak " "bersambung" #: data/com.github.geigi.cozy.appdata.xml:440 msgid "MPRIS desktop integration is more stable" msgstr "Penyepaduan atas meja MPRIS kini lebih stabil" #: data/com.github.geigi.cozy.appdata.xml:441 msgid "" "Fix: Last book was loaded on startup even when the storage medium was " "offline" msgstr "" "Baiki: Buku terakhir masih dimuatkan ketika permulaan walaupun medium storan" " di luar talian" #: data/com.github.geigi.cozy.appdata.xml:442 msgid "Fix: Bugs in audiobook location settings window" msgstr "Baiki: Pepijat-pepijat dalam tetingkap tetapan lokasi buku audio" #: data/com.github.geigi.cozy.appdata.xml:443 msgid "Fix: Bug which sometimes could prevent playback of an audiobook" msgstr "Baiki: Pepijat yang kadang kala menghalang main balik buku audio" #: data/com.github.geigi.cozy.appdata.xml:444 msgid "Fix: Crash which could occur on startup" msgstr "Baiki: Kerosakan yang mungkin berlaku ketika permulaan" #: data/com.github.geigi.cozy.appdata.xml:445 msgid "" "Fix: Jumping in titlebar while dragging the position slider with long audio " "files" msgstr "" "Baiki: Pelungsur kedudukan melompat ke palang tajuk semasa menyeret fail " "audio bersaiz besar atau tempoh yang panjang" #: data/com.github.geigi.cozy.appdata.xml:453 msgid "Sleep timer: Automatic system power control" msgstr "Pemasa tidur: Kawalan kuasa sistem automatik" #: data/com.github.geigi.cozy.appdata.xml:461 msgid "Support for opus files" msgstr "Menyokong fail opus" #: data/com.github.geigi.cozy.appdata.xml:462 msgid "Better support for ogg cover art" msgstr "Sokongan lebih baik untuk seni kulit hadapan ogg" #: data/com.github.geigi.cozy.appdata.xml:463 msgid "Swedish translation" msgstr "Terjemahan bahasa Sweden" #: data/com.github.geigi.cozy.appdata.xml:470 msgid "Fix: some valid media files were not detected" msgstr "Baiki: beberapa fail media yang sah tidak dikesan" #: data/com.github.geigi.cozy.appdata.xml:472 #: data/com.github.geigi.cozy.appdata.xml:483 msgid "Other small fixes" msgstr "Lain-lain pembaikan kecil" #: data/com.github.geigi.cozy.appdata.xml:479 msgid "Support for python 3.8. Cheers to emmaliddell" msgstr "Menyokong python 3.8. Terima kasih emmaliddell" #: data/com.github.geigi.cozy.appdata.xml:481 msgid "Fixes in the titlebar" msgstr "Pembaikan palang tajuk" #: data/com.github.geigi.cozy.appdata.xml:482 msgid "Fix: show navigation bar when searching from book overview" msgstr "" "Baiki: tunjuk palang pengemudian ketika menggelintar selayang pandang buku" #: data/com.github.geigi.cozy.appdata.xml:490 #: data/com.github.geigi.cozy.appdata.xml:500 msgid "Cozy features a new icon! Cheers to Fatih20" msgstr "Cozy kini memfiturkan satu ikon baharu! Yay buat Fatih20" #: data/com.github.geigi.cozy.appdata.xml:491 #: data/com.github.geigi.cozy.appdata.xml:501 msgid "App information is now translated! Cheers to NathanBnm" msgstr "Maklumat Apl kini boleh diterjemah! Yay buat NathanBnm" #: data/com.github.geigi.cozy.appdata.xml:493 #: data/com.github.geigi.cozy.appdata.xml:503 msgid "Fix: Sometimes the app name was not correctly displayed" msgstr "Baiki: Kadang kala nama apl tidak dipaparkan dengan betul" #: data/com.github.geigi.cozy.appdata.xml:510 #: data/com.github.geigi.cozy.appdata.xml:517 msgid "" "Fix: Cozy crashed on startup when prefering cover image files over embedded " "album art" msgstr "" "Baiki: Cozy mengalami kerosakan ketika mula sekiranya fail imej muka hadapan" " diutamakan berbanding seni album terbenam" #: data/com.github.geigi.cozy.appdata.xml:524 msgid "Fixed startup crash on elementary OS 5.0 Juno" msgstr "Kerosakan ketika permulaan dibaiki pada elementary OS 5.0 Juno" #: data/com.github.geigi.cozy.appdata.xml:531 msgid "Support for elementary OS 5.0 Juno" msgstr "Sokongan untuk elementary OS 5.0 Juno" #: data/com.github.geigi.cozy.appdata.xml:532 msgid "" "Fixed a bug which prevented Cozy from automatically playing the next chapter" msgstr "" "Baiki pepijat yang menghalang cozy memainkan bab berikutnya secara automatik" " " #: data/com.github.geigi.cozy.appdata.xml:540 msgid "" "Fixed a bug which prevented cozy from automatically playing the next chapter" msgstr "" "Baiki pepijat yang menghalang cozy memainkan bab berikutnya secara automatik" " " #: data/com.github.geigi.cozy.appdata.xml:547 msgid "Improved artwork image quality" msgstr "Kualiti imej kerja seni ditambah baik" #: data/com.github.geigi.cozy.appdata.xml:548 msgid "The book overview now supports multiple disks in audiobooks" msgstr "" "Selayang pandang buku kini menyokong cakera berbilang dalam buku audio" #: data/com.github.geigi.cozy.appdata.xml:549 msgid "" "The file not found window will only open when the file is on the internal " "drive" msgstr "" "Tetingkap fail tidak ditemui hanya terbuka ketika fail berada dalam pemacu " "dalaman" #: data/com.github.geigi.cozy.appdata.xml:550 msgid "Fixed a typo" msgstr "Baiki salah eja" #: data/com.github.geigi.cozy.appdata.xml:551 msgid "Support for elementary OS 5.0" msgstr "Sokongan untuk elementary OS 5.0" #: data/com.github.geigi.cozy.appdata.xml:559 msgid "" "Offline Mode! If your audiobooks are on an external or network drive, you " "can switch the download button to keep a local cached copy of the book to " "listen to on the go. To enable this feature you have to set your storage " "location to external in the settings." msgstr "" "Mod Luar Talian! Jika buku audio anda berada dalam pemacu luar atau " "rangkaian, anda boleh arahkan butang muat turun menyimpan salinan cache buku" " supaya mudah mendengarnya ketika di luar. Untuk membenarkan fitur ini, anda" " perlu tetapkan lokasi storan ke luaran dalam tetapan." #: data/com.github.geigi.cozy.appdata.xml:560 msgid "Detect online/offline storage devices" msgstr "Kesan peranti storan dalam/luar talian" #: data/com.github.geigi.cozy.appdata.xml:561 msgid "Option to hide unavailable books" msgstr "Pilihan untuk menyembunyikan buku-buku yang tiada" #: data/com.github.geigi.cozy.appdata.xml:562 msgid "Support for wav files" msgstr "Sokongan untuk fail wav" #: data/com.github.geigi.cozy.appdata.xml:563 msgid "Support for audio files that have no tags at all" msgstr "Sokongan untuk fail audio yang tidak mempunyai tag langsung" #: data/com.github.geigi.cozy.appdata.xml:564 msgid "You can mark books as read using the right click menu" msgstr "" "Anda boleh tanda buku sebagai telah dibaca menggunakan menu klik kanan" #: data/com.github.geigi.cozy.appdata.xml:565 msgid "New setting: Prefer cover image file over embedded covers" msgstr "" "Tetapan baharu: Utamakan fail imej muka hadapan berbanding kulit terbenam" #: data/com.github.geigi.cozy.appdata.xml:566 msgid "Redesigned Sleep Timer" msgstr "Pemasa tidur telah direka semula" #: data/com.github.geigi.cozy.appdata.xml:567 msgid "" "More Sleep Timer: You can now stop the playback after the current chapter" msgstr "" "Lagi Berkenaan Pemasa Tidur: Kini anda boleh hentikan main balik selepas bab" " semasa" #: data/com.github.geigi.cozy.appdata.xml:568 msgid "And even more: Fadeout on timer end (in settings)" msgstr "Dan lagi: Resap leyap pada hujung pemasa (dalam tetapan)" #: data/com.github.geigi.cozy.appdata.xml:569 msgid "Redesigned hello screen and settings" msgstr "Skrin hello dan tetapan telah direka semula" #: data/com.github.geigi.cozy.appdata.xml:570 msgid "Fixed bug where cozy would not start on GTK older than 3.22" msgstr "" "Pepijat dibaiki ketika cozy gagal dimulakan pada GTK lebih lama dari versi " "3.22" #: data/com.github.geigi.cozy.appdata.xml:571 msgid "" "If no author field is present, the reader field will be used as author. This" " requires a force reimport (settings) on already imported books." msgstr "" "Jika medan pengarang tiada, medan pembaca akan digunakan sebagai pengarang. " "Ia perlu mengimport semula (tetapan) pada buku-buku import." #: data/com.github.geigi.cozy.appdata.xml:572 msgid "Optimizations under the hood" msgstr "Pengoptimuman pada aplikasi" cozy-1.3.0/po/extra/nl.po000066400000000000000000000063021457036466300152300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Heimen Stoffels , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Heimen Stoffels , 2021\n" "Language-Team: Dutch (https://app.transifex.com/geigi/teams/78138/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Luisterboekspeler" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Beluister en organiseer je luisterboeken" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Speel luisterboeken af" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Speel je graag luisterboeken af? Dan wil je cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy is een luisterboekspeler. Hieronder vind je enkele kenmerken:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Importeer al je luisterboeken om ze ordelijk te kunnen bekijken" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Speel je drm-vrije luisterboeken af (mp3, m4a (aac, alac, …), flac, ogg en " "wav)" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "De afspeelpositie wordt opgeslagen" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Tijdklok" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Kies bij elk boek de gewenste afspeelsnelheid" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Doorzoek je bibliotheek" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Ondersteuning voor meerdere opslaglocaties" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Offline-modus! Hiermee kun je een luisterboek lokaal opslaan als je ze " "normaal extern opslaat. Ideaal om onderweg te kunnen luisteren!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Importeer luisterboeken middels slepen-en-neerzetten" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Sorteer je luisterboeken op auteur, voorlezer en naam" cozy-1.3.0/po/extra/pl.po000066400000000000000000000070431457036466300152350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # translatornator , 2021 # Julian Geywitz , 2021 # Bartosz Nogajczyk, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Bartosz Nogajczyk, 2022\n" "Language-Team: Polish (https://app.transifex.com/geigi/teams/78138/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Odtwarzacz Audiobooków" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Odtwarzaj i organizuj swoją kolekcję książek audio" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Słuchaj audiobooków" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Lubisz audiobooki? W takim razie przytulmy się!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy to odtwarzacz książek audio. Oto niektóre z jego funkcji:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importuj wszystkie swoje książki audio do Cozy, aby wygodnie je przeglądać" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Słuchaj swoich książek audio bez DRM w formatach mp3, m4b, m4a (aac, ALAC, " "...), flac, ogg i wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Zapamiętuje pozycję odtwarzania" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Minutnik uśpienia" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Kontrola prędkości odtwarzania dla każdej książki z osobna" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Szukaj w bibliotece" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Obsługa wielu lokalizacji przechowywania" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Tryb Offline! Dzięki temu możesz zachować książkę audio na wewnętrznej " "pamięci masowej, jeśli przechowujesz książki audio na dysku zewnętrznym lub " "sieciowym. Idealny do słuchania w podróży!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Przeciągnij i upuść, aby zaimportować nowe audiobooki" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Sortuj swoje książki audio według autora, lektora i nazwiska" cozy-1.3.0/po/extra/pt.po000066400000000000000000000735521457036466300152550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # André Barata , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-22 22:01+0200\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: André Barata , 2020\n" "Language-Team: Portuguese (https://www.transifex.com/geigi/teams/78138/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 #: data/com.github.geigi.cozy.appdata.xml:6 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Leitor de Audiolivros" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Reproduza e organize a sua coleção de áudio livros" #: data/com.github.geigi.cozy.appdata.xml:7 msgid "A modern audio book player" msgstr "Um leitor de áudio livros moderno" #: data/com.github.geigi.cozy.appdata.xml:9 msgid "Do you like audio books? Then lets get cozy!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:12 msgid "" "Cozy is a modern audio book player. Here are some of the current features:" msgstr "" "O Cozy é um leitor de áudio livros moderno. Estas são algumas das " "funcionalidades atuais:" #: data/com.github.geigi.cozy.appdata.xml:16 msgid "Import all your audio books into cozy to browse them comfortably" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Remembers your playback position" msgstr "Lembra-se da posição da última reprodução" #: data/com.github.geigi.cozy.appdata.xml:19 msgid "Sleep timer!" msgstr "Temporizador de dormida!" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Playback speed control for each book individually" msgstr "Controle de velocidade de reprodução para cada livro individualmente" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "Search your library" msgstr "Procurarr na sua biblioteca" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Multiple storage location support" msgstr "Suporte para localizações de armazenamento múltiplas" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Drag and Drop to import new audio books" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Sort your audio books by author, reader and name" msgstr "Organize os seus áudio livros por autor, narrador e nome" #: data/com.github.geigi.cozy.appdata.xml:45 msgid "Julian Geywitz" msgstr "Julian Geywitz" #: data/com.github.geigi.cozy.appdata.xml:54 msgid "Performance improvements for the book detail view and some bugfixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:58 msgid "" "Chapters in the book detail view will now be loaded lazily (thanks chris-" "kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:59 msgid "" "Books with a single chapter don't display a chapter number anymore (thanks " "chris-kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:60 msgid "Fix: Locals in What's new in Cozy screen (thanks alyssais!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:61 msgid "Fix: Catch an error that could occur when a book stops" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:62 msgid "Small performance improvements" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:63 #: data/com.github.geigi.cozy.appdata.xml:78 #: data/com.github.geigi.cozy.appdata.xml:93 #: data/com.github.geigi.cozy.appdata.xml:107 #: data/com.github.geigi.cozy.appdata.xml:121 #: data/com.github.geigi.cozy.appdata.xml:134 #: data/com.github.geigi.cozy.appdata.xml:148 #: data/com.github.geigi.cozy.appdata.xml:160 #: data/com.github.geigi.cozy.appdata.xml:183 #: data/com.github.geigi.cozy.appdata.xml:205 #: data/com.github.geigi.cozy.appdata.xml:227 #: data/com.github.geigi.cozy.appdata.xml:243 #: data/com.github.geigi.cozy.appdata.xml:259 #: data/com.github.geigi.cozy.appdata.xml:270 #: data/com.github.geigi.cozy.appdata.xml:286 #: data/com.github.geigi.cozy.appdata.xml:298 #: data/com.github.geigi.cozy.appdata.xml:313 #: data/com.github.geigi.cozy.appdata.xml:328 #: data/com.github.geigi.cozy.appdata.xml:342 #: data/com.github.geigi.cozy.appdata.xml:365 #: data/com.github.geigi.cozy.appdata.xml:377 msgid "As always, updated translations thanks to all of the translators!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:69 #: data/com.github.geigi.cozy.appdata.xml:84 #: data/com.github.geigi.cozy.appdata.xml:127 #: data/com.github.geigi.cozy.appdata.xml:265 #: data/com.github.geigi.cozy.appdata.xml:304 #: data/com.github.geigi.cozy.appdata.xml:319 #: data/com.github.geigi.cozy.appdata.xml:334 msgid "A small bugfix release which makes Cozy more reliable." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:73 msgid "" "When an issue occurs during playback the error message is displayed to the " "user" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:74 msgid "" "Fix: Importing media without tags now properly decodes the file name as " "chapter name (thanks chris-kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:75 msgid "Fix: Ensure that always a default storage location is present" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:76 msgid "Fix: During import an error could occur which stopped the import" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:77 msgid "Fix: During the database migration an error could occur" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:88 msgid "" "When copying files to the audiobook library goes wrong, the user is now " "informed with the error" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:89 msgid "Fix: Possible error while displaying offline cache copy progress" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:90 msgid "" "Fix: When changing the audiobook location or selecting a file in the file " "not found dialog an unexpected error could occur" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:91 msgid "Fix: Removing a storage dir in settings did not work" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:92 msgid "Fix: Removing a book from the library did sometimes not work" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:99 #: data/com.github.geigi.cozy.appdata.xml:113 msgid "This release features chapter support for m4b files." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:103 #: data/com.github.geigi.cozy.appdata.xml:117 msgid "" "A long awaited feature has finally arrived: Chapter support for m4b files." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:104 #: data/com.github.geigi.cozy.appdata.xml:118 msgid "" "Books with inconsistent spelling are now grouped into a single book (thanks " "chris-kobrzak!)." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:105 #: data/com.github.geigi.cozy.appdata.xml:119 msgid "Improved reliability of restoring the previous playback position." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:106 #: data/com.github.geigi.cozy.appdata.xml:120 msgid "" "Fix: clicking on a currently playing chapter did not pause the chapter as " "expected." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:131 msgid "" "Fix: Playback speed sometimes was not set correctly when a chapter changed." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:132 msgid "" "Fix: Changing the playback position with customized playback speed did jump " "to a wrong position." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:133 msgid "Fix: Startup failed if the artwork cache did contain a broken file." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:140 msgid "" "This release fixes rare bugs which could prevent Cozy from starting up " "correctly." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:144 msgid "Fix: Startup failed if the last played file could not be found." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:145 msgid "Fix: Startup failed if the last played book does not exist anymore." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:146 msgid "Fix: An error which could occur when removing a storage location." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:147 msgid "Some additional minor fixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:155 msgid "Add a rewind button to the titlebar." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:156 msgid "The rewind and forward duration can now be customized in the settings." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:157 msgid "Fix: Prevent standby during playback." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:158 msgid "" "Fix: Possible crash during startup with enabled 30 seconds rewind feature." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:159 msgid "" "Fix: Adding a new storage location could lead to an internal error which " "might show in strange behavior." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:166 #: data/com.github.geigi.cozy.appdata.xml:189 #: data/com.github.geigi.cozy.appdata.xml:211 msgid "" "This version of Cozy features an important change in library management. " "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan. Now audiobooks are" " not removed from your library automatically anymore. This prevents " "accidentally loosing the progress of a audiobook when a file can't be found " "temporarily. To remove an audiobook from the library simply right-click on " "it and choose the remove from library option." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:173 #: data/com.github.geigi.cozy.appdata.xml:196 #: data/com.github.geigi.cozy.appdata.xml:218 msgid "" "The download option will be enabled for audiobooks on removable or network " "drives automatically for each new storage location you add." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:174 #: data/com.github.geigi.cozy.appdata.xml:197 #: data/com.github.geigi.cozy.appdata.xml:219 msgid "" "Unavailable books (books where a file can't be found) can now be opened to " "display the book detail view. They will be flagged with a little unavailable" " tag" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:175 #: data/com.github.geigi.cozy.appdata.xml:198 #: data/com.github.geigi.cozy.appdata.xml:220 msgid "Under the hood improvements in the media importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:176 #: data/com.github.geigi.cozy.appdata.xml:199 #: data/com.github.geigi.cozy.appdata.xml:221 msgid "" "Media playback is rewritten from ground up. It's far more stable than " "before." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:177 #: data/com.github.geigi.cozy.appdata.xml:200 #: data/com.github.geigi.cozy.appdata.xml:222 msgid "" "Fix: When a different system language than English is used Cozy created two " "folders in the users home directory on the first startup, a translated and a" " English one. Now only the translated folder will be created." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:178 #: data/com.github.geigi.cozy.appdata.xml:201 #: data/com.github.geigi.cozy.appdata.xml:223 msgid "Fix: A wrong mouse pointer was displayed with some pointer themes" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:179 #: data/com.github.geigi.cozy.appdata.xml:202 #: data/com.github.geigi.cozy.appdata.xml:224 msgid "Fix: A memory leak in the importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:180 #: data/com.github.geigi.cozy.appdata.xml:203 #: data/com.github.geigi.cozy.appdata.xml:225 msgid "Fix: The playback speed of a book was not remembered correctly" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:181 #: data/com.github.geigi.cozy.appdata.xml:204 #: data/com.github.geigi.cozy.appdata.xml:226 msgid "" "Fix: The desktop integration did not respect the switch author and reader " "setting" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:182 #: data/com.github.geigi.cozy.appdata.xml:285 msgid "Many other small fixes that make Cozy more reliable" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:233 #: data/com.github.geigi.cozy.appdata.xml:249 msgid "" "Surprise! Cozy features a new icon thanks to jimmac! This updates also " "features some smaller fixes and a small redesign of the headerbar." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:237 #: data/com.github.geigi.cozy.appdata.xml:253 msgid "A new icon! Thanks jimmac :)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:238 #: data/com.github.geigi.cozy.appdata.xml:254 msgid "Refined headerbar" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:239 #: data/com.github.geigi.cozy.appdata.xml:255 msgid "A click on the cover image in the headerbar opens the book detail view" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:240 #: data/com.github.geigi.cozy.appdata.xml:256 msgid "" "Book detail view: Pressing the back button on the mouse brings you back to " "the library" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:241 #: data/com.github.geigi.cozy.appdata.xml:257 msgid "Fix: Aborting the download of a book is now handled more gracefully" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:242 #: data/com.github.geigi.cozy.appdata.xml:258 msgid "Fix: Opening a book using the return key now works as expected" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:269 msgid "Cozy is now compatible with Python 3.9 (thanks phpwutz!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:276 msgid "This release features a lot of bug fixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:280 msgid "" "The rewind and fast forward buttons in the desktop integration now jump 30 " "seconds back and forth instead of jumping a whole chapter" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:281 msgid "Fix: the rewind button in the toolbar is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:282 msgid "Fix: automatic rewind, when enabled in settings, is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:283 msgid "" "Fix: when rewinding at the beginning of a book Cozy did jump to the end of " "the book" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:284 msgid "" "Fix: pressing escape to leave the book detail view is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:292 msgid "" "This release features a rewrite of the book detail view to prepare " "everything for chapter support with m4b files which will follow in a later " "update. If something isn't working as expected let me know!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:296 msgid "" "Fix: If an audiobook directory contained a lot of non audio files, Cozy " "could skip all other files on import (thanks foliva!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:297 msgid "" "Fix: When copying files via Drag and Drop sometimes the progress bar " "reported an incorrect progress" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:308 #: data/com.github.geigi.cozy.appdata.xml:323 #: data/com.github.geigi.cozy.appdata.xml:338 msgid "Increase maximum playback speed to 3.5x" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:309 #: data/com.github.geigi.cozy.appdata.xml:324 #: data/com.github.geigi.cozy.appdata.xml:339 msgid "" "Fix: audio files with uppercase extensions where not detected (thanks to " "leuc)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:310 #: data/com.github.geigi.cozy.appdata.xml:325 msgid "" "Fix: when using drag and drop some files where not copied and imported " "correctly" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:311 #: data/com.github.geigi.cozy.appdata.xml:326 #: data/com.github.geigi.cozy.appdata.xml:340 msgid "Fix: removing a book from the library was sometimes not possible" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:312 #: data/com.github.geigi.cozy.appdata.xml:327 #: data/com.github.geigi.cozy.appdata.xml:341 msgid "" "Fix: sometimes Cozy's database ran into a locking issue, which could lead to" " unexpected behaviour of Cozy" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:348 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support, which " "will follow in a later update. Stay tuned!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:352 msgid "Basic support for m4b audio books (chapters are not supported yet)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:353 msgid "Fixed multiple bugs when using drag and drop to import files" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:359 #: data/com.github.geigi.cozy.appdata.xml:371 msgid "" "Some of your files where not recognized by Cozy despite being valid audio " "files? Not anymore! This version features a completely rewritten importer " "which is far more reliable. Enjoy!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:363 #: data/com.github.geigi.cozy.appdata.xml:375 msgid "A completely rewritten and far more reliable media importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:364 #: data/com.github.geigi.cozy.appdata.xml:376 msgid "Optional error reporting on crashes" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:384 msgid "Multiple author and readers are now separated in the library view" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:385 msgid "Increase maximum playback speed to 3x" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:386 msgid "" "Fix: playback speed was not saved correctly under some circumstances, thanks" " to magnickolas" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:387 msgid "Updated translations thanks to all of the translators!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:394 msgid "Fix: Jump to folder was not working" msgstr "Correção: Saltar para uma pasta não funcionava" #: data/com.github.geigi.cozy.appdata.xml:395 msgid "Fix: Removing a book from the library did not work as expected" msgstr "Correção: Remover um livro da biblioteca não funcionava como previsto" #: data/com.github.geigi.cozy.appdata.xml:396 msgid "Fix: Error that could occur when opening the book overview" msgstr "Correção: Ocorria um erro ao abrir a vista geral de um livro" #: data/com.github.geigi.cozy.appdata.xml:397 #: data/com.github.geigi.cozy.appdata.xml:412 #: data/com.github.geigi.cozy.appdata.xml:424 #: data/com.github.geigi.cozy.appdata.xml:432 #: data/com.github.geigi.cozy.appdata.xml:446 #: data/com.github.geigi.cozy.appdata.xml:454 #: data/com.github.geigi.cozy.appdata.xml:471 #: data/com.github.geigi.cozy.appdata.xml:480 #: data/com.github.geigi.cozy.appdata.xml:492 #: data/com.github.geigi.cozy.appdata.xml:502 #: data/com.github.geigi.cozy.appdata.xml:533 #: data/com.github.geigi.cozy.appdata.xml:552 msgid "Updated translations" msgstr "Traduções atualizadas" #: data/com.github.geigi.cozy.appdata.xml:404 msgid "Support for more mp3 files! Let me know if you have problems." msgstr "Suporte para mais ficheiros mp3! Avise-me se tiver problemas." #: data/com.github.geigi.cozy.appdata.xml:405 msgid "Preparations to support chapters within audio files" msgstr "Preparação para o suporte de capítulos dentro dos ficheiros áudio" #: data/com.github.geigi.cozy.appdata.xml:406 msgid "The beginning of the biggest cleanup and refactoring under the hood" msgstr "O começo da maior limpeza e reestruturação do código interno" #: data/com.github.geigi.cozy.appdata.xml:407 msgid "Visual improvements in book overview, thanks to elya5" msgstr "Melhorias visuais na vista geral dos livros, obrigado a elya5" #: data/com.github.geigi.cozy.appdata.xml:408 msgid "Support for smaller screen sizes, thanks again to elya5" msgstr "Suporte para ecrãs mais pequenos, obrigado outra vez a elya5" #: data/com.github.geigi.cozy.appdata.xml:409 msgid "Fix: Some book titles where not displayed, thanks to naglis" msgstr "" "Correção: Alguns títulos de livros não eram exibidos, obrigado a naglis" #: data/com.github.geigi.cozy.appdata.xml:410 msgid "Fix: Empty books could crash the application" msgstr "Correção: Livros vazios podiam causar falhas na aplicação" #: data/com.github.geigi.cozy.appdata.xml:411 msgid "Fix: Author and reader can now be swapped from settings" msgstr "Correção: O autor e narrador agora podem ser trocados nas definições" #: data/com.github.geigi.cozy.appdata.xml:419 msgid "Fix: Crash which could occur while changing the titlebar display mode" msgstr "" "Correção: Falha que podia ocorrer ao alterar o modo de visualização da barra" " de título" #: data/com.github.geigi.cozy.appdata.xml:420 msgid "Fix: Better handling of resources that cannot be found" msgstr "" "Correção: Melhor forma de lidar com recursos que não podem ser encontrados" #: data/com.github.geigi.cozy.appdata.xml:421 msgid "Fix: Fira font is now readable on the welcome screen" msgstr "Correção: A fonte Fira agora legível no ecrã bem vindo" #: data/com.github.geigi.cozy.appdata.xml:422 msgid "Fix: Multiple bugs regarding the titlebar" msgstr "Correção: Múltiplos erros em relação à barra de título" #: data/com.github.geigi.cozy.appdata.xml:423 msgid "Fix: File not found dialog was not displayed for external devices" msgstr "" "Correção: O dialogo ficheiro não encontrado não exibia para dispositivos " "externos" #: data/com.github.geigi.cozy.appdata.xml:431 msgid "Fix: Files with missing tags failed to import" msgstr "Correção: Ficheiros com rótulos em falta falhavam ao importar" #: data/com.github.geigi.cozy.appdata.xml:439 msgid "" "A warning is displayed in the titlebar if network/external drives are not " "connected" msgstr "" "É mostrado um aviso na barra de título se não estiver conectado um disco de " "rede/externo" #: data/com.github.geigi.cozy.appdata.xml:440 msgid "MPRIS desktop integration is more stable" msgstr "A integração MPRIS no ambiente de trabalho é mais estável" #: data/com.github.geigi.cozy.appdata.xml:441 msgid "" "Fix: Last book was loaded on startup even when the storage medium was " "offline" msgstr "" "Correção: O último livro foi carregado ao iniciar mesmo quando o dispositivo" " de armazenamento estava desligado" #: data/com.github.geigi.cozy.appdata.xml:442 msgid "Fix: Bugs in audiobook location settings window" msgstr "Correção: Erros na janela de definições de localização de audiolivros" #: data/com.github.geigi.cozy.appdata.xml:443 msgid "Fix: Bug which sometimes could prevent playback of an audiobook" msgstr "Correção: Erro que por vezes impedia a reprodução de um audiolivro" #: data/com.github.geigi.cozy.appdata.xml:444 msgid "Fix: Crash which could occur on startup" msgstr "Correção: Falha que podia ocorrer ao iniciar" #: data/com.github.geigi.cozy.appdata.xml:445 msgid "" "Fix: Jumping in titlebar while dragging the position slider with long audio " "files" msgstr "" "Correção: Saltar na barra de título enquanto arrasta a posição do controlo " "de deslize com ficheiros de áudio longos" #: data/com.github.geigi.cozy.appdata.xml:453 msgid "Sleep timer: Automatic system power control" msgstr "Temporizador de dormir: Controlo automático de energia do sistema" #: data/com.github.geigi.cozy.appdata.xml:461 msgid "Support for opus files" msgstr "Suporte para ficheiros opus" #: data/com.github.geigi.cozy.appdata.xml:462 msgid "Better support for ogg cover art" msgstr "Suporte melhorado para capas em formato ogg" #: data/com.github.geigi.cozy.appdata.xml:463 msgid "Swedish translation" msgstr "Tradução Sueca" #: data/com.github.geigi.cozy.appdata.xml:470 msgid "Fix: some valid media files were not detected" msgstr "Correção: Não eram detetados ficheiros válidos de midia" #: data/com.github.geigi.cozy.appdata.xml:472 #: data/com.github.geigi.cozy.appdata.xml:483 msgid "Other small fixes" msgstr "Pequenas correções" #: data/com.github.geigi.cozy.appdata.xml:479 msgid "Support for python 3.8. Cheers to emmaliddell" msgstr "Suporte para python 3.8. Graças a emmaliddell" #: data/com.github.geigi.cozy.appdata.xml:481 msgid "Fixes in the titlebar" msgstr "Correções da barra de título" #: data/com.github.geigi.cozy.appdata.xml:482 msgid "Fix: show navigation bar when searching from book overview" msgstr "" "Correção: Mostrar a barra de navegação ao procurar a partir da vista geral " "do livro" #: data/com.github.geigi.cozy.appdata.xml:490 #: data/com.github.geigi.cozy.appdata.xml:500 msgid "Cozy features a new icon! Cheers to Fatih20" msgstr "O Cozy tem agora um novo ícone! Graças a Fatih20" #: data/com.github.geigi.cozy.appdata.xml:491 #: data/com.github.geigi.cozy.appdata.xml:501 msgid "App information is now translated! Cheers to NathanBnm" msgstr "A informação da aplicação está agora traduzida! Graças a NathanBnm" #: data/com.github.geigi.cozy.appdata.xml:493 #: data/com.github.geigi.cozy.appdata.xml:503 msgid "Fix: Sometimes the app name was not correctly displayed" msgstr "Correção: Por vezes o nome da aplicação não era exibido corretamente" #: data/com.github.geigi.cozy.appdata.xml:510 #: data/com.github.geigi.cozy.appdata.xml:517 msgid "" "Fix: Cozy crashed on startup when prefering cover image files over embedded " "album art" msgstr "" "Correção: O Cozy falhava ao iniciar quando eram preferidos os ficheiros das " "imagens de capas ás artes de álbuns incorporadas" #: data/com.github.geigi.cozy.appdata.xml:524 msgid "Fixed startup crash on elementary OS 5.0 Juno" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:531 msgid "Support for elementary OS 5.0 Juno" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:532 msgid "" "Fixed a bug which prevented Cozy from automatically playing the next chapter" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:540 msgid "" "Fixed a bug which prevented cozy from automatically playing the next chapter" msgstr "" "Corrigido um erro que impedia que o Cozy reproduzisse automaticamente o " "capítulo seguinte" #: data/com.github.geigi.cozy.appdata.xml:547 msgid "Improved artwork image quality" msgstr "Melhoria da qualidade de imagem de arte" #: data/com.github.geigi.cozy.appdata.xml:548 msgid "The book overview now supports multiple disks in audiobooks" msgstr "" "A vista geral de um livro suporta agora discos múltiplos nos audiolivros" #: data/com.github.geigi.cozy.appdata.xml:549 msgid "" "The file not found window will only open when the file is on the internal " "drive" msgstr "" "A janela do erro não foi possível encontrar só vai abrir quando o ficheiro " "estiver no disco interno" #: data/com.github.geigi.cozy.appdata.xml:550 msgid "Fixed a typo" msgstr "Corrigido um erro ortográfico" #: data/com.github.geigi.cozy.appdata.xml:551 msgid "Support for elementary OS 5.0" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:559 msgid "" "Offline Mode! If your audiobooks are on an external or network drive, you " "can switch the download button to keep a local cached copy of the book to " "listen to on the go. To enable this feature you have to set your storage " "location to external in the settings." msgstr "" "Modo offline! Se os seus audiolivros estiverem num disco de rede ou num " "disco externo, pode alterar o botão de descarregar para manter uma copia " "local, em cache, do livro para ouvir quando quiser. Para ligar esta " "funcionalidade tem que definir a localização de armazenamento para externo " "nas definições." #: data/com.github.geigi.cozy.appdata.xml:560 msgid "Detect online/offline storage devices" msgstr "Detetar dispositivos de armazenamento em modo ligado/desligado" #: data/com.github.geigi.cozy.appdata.xml:561 msgid "Option to hide unavailable books" msgstr "Opção para esconder livros indisponíveis" #: data/com.github.geigi.cozy.appdata.xml:562 msgid "Support for wav files" msgstr "Suporte para ficheiros wav" #: data/com.github.geigi.cozy.appdata.xml:563 msgid "Support for audio files that have no tags at all" msgstr "" "Suporte para ficheiros de áudio que não possuem rótulos de forma nenhuma" #: data/com.github.geigi.cozy.appdata.xml:564 msgid "You can mark books as read using the right click menu" msgstr "" "Pode marcar livros como lidos usando o menu ao clicar com o botão do lado " "direito" #: data/com.github.geigi.cozy.appdata.xml:565 msgid "New setting: Prefer cover image file over embedded covers" msgstr "Nova definição: Preferir ficheiro de imagem de capa a capas embutidas" #: data/com.github.geigi.cozy.appdata.xml:566 msgid "Redesigned Sleep Timer" msgstr "Temporizador de dormir redesenhado" #: data/com.github.geigi.cozy.appdata.xml:567 msgid "" "More Sleep Timer: You can now stop the playback after the current chapter" msgstr "" "Mais para o temporizador de dormir: Pode agora parar a reprodução depois do " "capítulo atual" #: data/com.github.geigi.cozy.appdata.xml:568 msgid "And even more: Fadeout on timer end (in settings)" msgstr "" "E ainda mais: desvanecer quando o temporizador terminar (nas definições)" #: data/com.github.geigi.cozy.appdata.xml:569 msgid "Redesigned hello screen and settings" msgstr "Ecrã das boas vindas redesenhado como também algumas definições" #: data/com.github.geigi.cozy.appdata.xml:570 msgid "Fixed bug where cozy would not start on GTK older than 3.22" msgstr "" "Corrigido um erro em que o Cozy não iniciava em versões GTK mais antigas que" " 3.22" #: data/com.github.geigi.cozy.appdata.xml:571 msgid "" "If no author field is present, the reader field will be used as author. This" " requires a force reimport (settings) on already imported books." msgstr "" "Se o campo de autor não estiver presente, o campo do narrador vai ser usado " "como autor. Isto requer um importar forçado (definições) em livros que já " "foram importados." #: data/com.github.geigi.cozy.appdata.xml:572 msgid "Optimizations under the hood" msgstr "Otimizações de código" cozy-1.3.0/po/extra/pt_BR.po000066400000000000000000000071651457036466300156350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # 8397d83d97a763a1ecf9aac2657f04e5_82fe388 <03d40bf3df601a10fffa673cbcf3ff48_350333>, 2019 # Cleiton Floss , 2020 # Rafael Fontenelle , 2021 # Julian Geywitz , 2021 # B Cafune, 2022 # Beatriz Rodrigues, 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Beatriz Rodrigues, 2023\n" "Language-Team: Portuguese (Brazil) (https://app.transifex.com/geigi/teams/78138/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Reprodutor de audiolivros" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Reproduza e organize sua coleção de audiolivros" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Escutar audiolivros" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Você gosta de audiolivros? Então aconchegue-se com o Cozy!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy é um reprodutor de audiolivros. Aqui estão algumas das funcionalidades:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importe todos os seus audiolivros para o Cozy e navegue-os confortavelmente" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Ouça seus audiolivros livres de DRM em mp3, m4b, m4a (aac, ALAC, ...), flac," " ogg e wav" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Lembra da última posição de reprodução" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Temporizador" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Controle da velocidade de reprodução para cada livro individualmente" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Buscar na sua biblioteca" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Suporte a vários locais de armazenamento" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Modo desconectado! Isso permite que você mantenha um audiolivro em seu " "armazenamento interno se você armazenar seus audiolivros em uma unidade " "externa ou de rede. Perfeito para ouvir em qualquer lugar!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Arraste e solve para importar novos audiolivros" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Ordene seus audiolivros por autor, narrador e nome" cozy-1.3.0/po/extra/ru.po000066400000000000000000000101551457036466300152460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Camellan , 2019 # Dellon Zerus , 2020 # Julian Geywitz , 2021 # Victor, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Victor, 2022\n" "Language-Team: Russian (https://app.transifex.com/geigi/teams/78138/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Проигрыватель аудиокниг" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Воспроизведение и организация своей коллекции аудиокниг" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Слушайте аудиокниги" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Тебе нравятся аудиокниги? Тогда устраивайся поудобнее!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy — плеер для аудиокниг. Вот некоторые возможности:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Импортируйте все свои аудиокниги в Cosy, чтобы обозревать их с комфортом" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Слушайте ваши бесплатные mp3, m4a (aac, ALAC, ...), flac, ogg и wav аудио " "книги" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Запоминает позицию воспроизведения" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Таймер сна" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Управление скоростью воспроизведения отдельно для каждой книги" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Поиск в вашей аудиобиблиотеке" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Поддержка нескольких хранилищ" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Автономный режим! Это позволяет вам хранить аудиокниги в памяти устройства, " "если вы храните аудиокниги на внешнем или сетевом диске. Идеально, чтобы " "слушать на ходу!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Для импорта новых аудиокниг просто перетащите книги в окно программы" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Сортируйте ваши аудиокниги по автору, диктору и имени" cozy-1.3.0/po/extra/sv.po000066400000000000000000000064751457036466300152620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Åke Engelbrektson, 2021 # Luna Jernberg , 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Luna Jernberg , 2023\n" "Language-Team: Swedish (https://app.transifex.com/geigi/teams/78138/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Ljudboksspelare" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Spela upp och organisera din ljudbokssamling" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Lyssna på ljudböcker" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Gillar du ljudböcker? Då kan det bli mysigt!" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "Cozy är en ljudboksspelare. Här är några av funktionerna:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "" "Importera alla dina ljudböcker till Cozy för att bekvämt bläddra efter dem" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "Lyssna på dina DRM-fria mp3, m4b, m4a (aac, ALAC, …), flac, ogg och wav " "ljudböcker." #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Kommer ihåg var du slutade lyssna." #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Insomningsur" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Kontroll av uppspelningshastighet, individuellt för varje bok." #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Sök i ditt bibliotek." #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Stöd för flera lagringsplatser." #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Offlineläge! Detta gör att du kan behålla en ljudbok på ditt interna minne " "om du lagrar dina ljudböcker på en extern eller nätverksenhet. Perfekt att " "lyssna på när du är på språng!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Dra och släpp för att importera nya ljudböcker" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "Sortera dina ljudböcker efter författare, uppläsare och namn." cozy-1.3.0/po/extra/te.po000066400000000000000000001006321457036466300152300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Jagadeeshvarma, 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-22 22:01+0200\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Jagadeeshvarma, 2021\n" "Language-Team: Telugu (https://www.transifex.com/geigi/teams/78138/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.geigi.cozy.desktop:3 #: data/com.github.geigi.cozy.appdata.xml:6 msgid "Cozy" msgstr "కొజి" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "ధ్వని పుస్తక ప్లేయర్" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "మీ ధ్వని పుస్తక సేకరణను ప్లే చేయండి మరియు నిర్వహించండి" #: data/com.github.geigi.cozy.appdata.xml:7 msgid "A modern audio book player" msgstr "ఆధునిక ధ్వని పుస్తక ప్లేయర్" #: data/com.github.geigi.cozy.appdata.xml:9 msgid "Do you like audio books? Then lets get cozy!" msgstr "మీకు ధ్వని పుస్తకాలు నచ్చిందా? అప్పుడు కొజి పొందండి!" #: data/com.github.geigi.cozy.appdata.xml:12 msgid "" "Cozy is a modern audio book player. Here are some of the current features:" msgstr "కొజి ఒక ఆధునిక ధ్వని పుస్తక ప్లేయర్. ప్రస్తుత లక్షణాలు ఇక్కడ ఉన్నాయి:" #: data/com.github.geigi.cozy.appdata.xml:16 msgid "Import all your audio books into cozy to browse them comfortably" msgstr "" "మీ అన్ని ధ్వని పుస్తకాలను సౌకర్యవంతంగా బ్రౌజ్ చేయడానికి కొజి‌లోకి దిగుమతి " "చేయండి" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "మీ DRM ఉచిత mp3, m4b, m4a (aac, ALAC,…), flac, ogg మరియు wav ధ్వని " "పుస్తకాలను వినండి" #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Remembers your playback position" msgstr "మీ ప్లేబ్యాక్ స్థానాన్ని గుర్తు చేస్తుంది" #: data/com.github.geigi.cozy.appdata.xml:19 msgid "Sleep timer!" msgstr "నిద్ర టైమర్!" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Playback speed control for each book individually" msgstr "ప్రతి ఒక్క పుస్తకానికి ప్లేబ్యాక్ వేగ నియంత్రణ" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "Search your library" msgstr "మీ గ్రంధాలయంని శోధించండి" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Multiple storage location support" msgstr "బహుళ నిల్వ స్థాన మద్దతు" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "ఆఫ్‌లైన్ మోడ్! మీరు మీ ధ్వని పుస్తకాలను బయటి లేదా నెట్‌వర్క్ డ్రైవ్‌లో నిల్వ" " చేస్తే మీ అంతర్గత నిల్వలో ధ్వని పుస్తకాన్ని ఉంచడానికి ఇది మిమ్మల్ని " "అనుమతిస్తుంది. ప్రయాణంలో వినడానికి పరిపూర్ణమైనది!" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Drag and Drop to import new audio books" msgstr "క్రొత్త ధ్వని పుస్తకాలను దిగుమతి చేయడానికి లాగండి మరియు వదలండి" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Sort your audio books by author, reader and name" msgstr "మీ ధ్వని పుస్తకాలను రచయిత, రీడర్ మరియు పేరు ప్రకారం క్రమబద్ధీకరించండి" #: data/com.github.geigi.cozy.appdata.xml:45 msgid "Julian Geywitz" msgstr "జూలియన్ గేవిట్జ్" #: data/com.github.geigi.cozy.appdata.xml:54 msgid "Performance improvements for the book detail view and some bugfixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:58 msgid "" "Chapters in the book detail view will now be loaded lazily (thanks chris-" "kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:59 msgid "" "Books with a single chapter don't display a chapter number anymore (thanks " "chris-kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:60 msgid "Fix: Locals in What's new in Cozy screen (thanks alyssais!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:61 msgid "Fix: Catch an error that could occur when a book stops" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:62 msgid "Small performance improvements" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:63 #: data/com.github.geigi.cozy.appdata.xml:78 #: data/com.github.geigi.cozy.appdata.xml:93 #: data/com.github.geigi.cozy.appdata.xml:107 #: data/com.github.geigi.cozy.appdata.xml:121 #: data/com.github.geigi.cozy.appdata.xml:134 #: data/com.github.geigi.cozy.appdata.xml:148 #: data/com.github.geigi.cozy.appdata.xml:160 #: data/com.github.geigi.cozy.appdata.xml:183 #: data/com.github.geigi.cozy.appdata.xml:205 #: data/com.github.geigi.cozy.appdata.xml:227 #: data/com.github.geigi.cozy.appdata.xml:243 #: data/com.github.geigi.cozy.appdata.xml:259 #: data/com.github.geigi.cozy.appdata.xml:270 #: data/com.github.geigi.cozy.appdata.xml:286 #: data/com.github.geigi.cozy.appdata.xml:298 #: data/com.github.geigi.cozy.appdata.xml:313 #: data/com.github.geigi.cozy.appdata.xml:328 #: data/com.github.geigi.cozy.appdata.xml:342 #: data/com.github.geigi.cozy.appdata.xml:365 #: data/com.github.geigi.cozy.appdata.xml:377 msgid "As always, updated translations thanks to all of the translators!" msgstr "ఎప్పటిలాగే, నవీకరించబడిన అనువాదాలు అనువాదకులందరికీ ధన్యవాదాలు!" #: data/com.github.geigi.cozy.appdata.xml:69 #: data/com.github.geigi.cozy.appdata.xml:84 #: data/com.github.geigi.cozy.appdata.xml:127 #: data/com.github.geigi.cozy.appdata.xml:265 #: data/com.github.geigi.cozy.appdata.xml:304 #: data/com.github.geigi.cozy.appdata.xml:319 #: data/com.github.geigi.cozy.appdata.xml:334 msgid "A small bugfix release which makes Cozy more reliable." msgstr "ఒక చిన్న బగ్‌ఫిక్స్ విడుదల ఇది కొజిని మరింత నమ్మదగినదిగా చేస్తుంది." #: data/com.github.geigi.cozy.appdata.xml:73 msgid "" "When an issue occurs during playback the error message is displayed to the " "user" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:74 msgid "" "Fix: Importing media without tags now properly decodes the file name as " "chapter name (thanks chris-kobrzak!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:75 msgid "Fix: Ensure that always a default storage location is present" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:76 msgid "Fix: During import an error could occur which stopped the import" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:77 msgid "Fix: During the database migration an error could occur" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:88 msgid "" "When copying files to the audiobook library goes wrong, the user is now " "informed with the error" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:89 msgid "Fix: Possible error while displaying offline cache copy progress" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:90 msgid "" "Fix: When changing the audiobook location or selecting a file in the file " "not found dialog an unexpected error could occur" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:91 msgid "Fix: Removing a storage dir in settings did not work" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:92 msgid "Fix: Removing a book from the library did sometimes not work" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:99 #: data/com.github.geigi.cozy.appdata.xml:113 msgid "This release features chapter support for m4b files." msgstr "ఈ విడుదల m4b ఫైళ్ళకు అధ్యాయ మద్దతును కలిగి ఉంది." #: data/com.github.geigi.cozy.appdata.xml:103 #: data/com.github.geigi.cozy.appdata.xml:117 msgid "" "A long awaited feature has finally arrived: Chapter support for m4b files." msgstr "" "దీర్ఘకాలంగా ఎదురుచూస్తున్న లక్షణం చివరకు వచ్చింది: m4b ఫైళ్ళకు అధ్యాయం " "మద్దతు." #: data/com.github.geigi.cozy.appdata.xml:104 #: data/com.github.geigi.cozy.appdata.xml:118 msgid "" "Books with inconsistent spelling are now grouped into a single book (thanks " "chris-kobrzak!)." msgstr "" "అస్థిరమైన స్పెల్లింగ్ ఉన్న పుస్తకాలు ఇప్పుడు ఒకే పుస్తకంగా వర్గీకరించబడ్డాయి" " (ధన్యవాదాలు క్రిస్-కోబ్రాజాక్!)." #: data/com.github.geigi.cozy.appdata.xml:105 #: data/com.github.geigi.cozy.appdata.xml:119 msgid "Improved reliability of restoring the previous playback position." msgstr "మునుపటి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించే మెరుగైన విశ్వసనీయత." #: data/com.github.geigi.cozy.appdata.xml:106 #: data/com.github.geigi.cozy.appdata.xml:120 msgid "" "Fix: clicking on a currently playing chapter did not pause the chapter as " "expected." msgstr "" "పరిష్కరించండి: ప్రస్తుతం ఆడుతున్న అధ్యాయంపై క్లిక్ చేయడం అధ్యాయాన్ని ఊహించిన" " విధంగా పాజ్ చేయలేదు." #: data/com.github.geigi.cozy.appdata.xml:131 msgid "" "Fix: Playback speed sometimes was not set correctly when a chapter changed." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:132 msgid "" "Fix: Changing the playback position with customized playback speed did jump " "to a wrong position." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:133 msgid "Fix: Startup failed if the artwork cache did contain a broken file." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:140 msgid "" "This release fixes rare bugs which could prevent Cozy from starting up " "correctly." msgstr "" "ఈ విడుదల కొజి సరిగ్గా ప్రారంభించకుండా నిరోధించే అరుదైన లోపాలను " "పరిష్కరిస్తుంది." #: data/com.github.geigi.cozy.appdata.xml:144 msgid "Fix: Startup failed if the last played file could not be found." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:145 msgid "Fix: Startup failed if the last played book does not exist anymore." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:146 msgid "Fix: An error which could occur when removing a storage location." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:147 msgid "Some additional minor fixes." msgstr "కొన్ని అదనపు చిన్న పరిష్కారాలు." #: data/com.github.geigi.cozy.appdata.xml:155 msgid "Add a rewind button to the titlebar." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:156 msgid "The rewind and forward duration can now be customized in the settings." msgstr "" "రివైండ్ మరియు ఫార్వర్డ్ వ్యవధి ఇప్పుడు సెట్టింగులలో అనుకూలీకరించవచ్చు." #: data/com.github.geigi.cozy.appdata.xml:157 msgid "Fix: Prevent standby during playback." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:158 msgid "" "Fix: Possible crash during startup with enabled 30 seconds rewind feature." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:159 msgid "" "Fix: Adding a new storage location could lead to an internal error which " "might show in strange behavior." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:166 #: data/com.github.geigi.cozy.appdata.xml:189 #: data/com.github.geigi.cozy.appdata.xml:211 msgid "" "This version of Cozy features an important change in library management. " "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan. Now audiobooks are" " not removed from your library automatically anymore. This prevents " "accidentally loosing the progress of a audiobook when a file can't be found " "temporarily. To remove an audiobook from the library simply right-click on " "it and choose the remove from library option." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:173 #: data/com.github.geigi.cozy.appdata.xml:196 #: data/com.github.geigi.cozy.appdata.xml:218 msgid "" "The download option will be enabled for audiobooks on removable or network " "drives automatically for each new storage location you add." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:174 #: data/com.github.geigi.cozy.appdata.xml:197 #: data/com.github.geigi.cozy.appdata.xml:219 msgid "" "Unavailable books (books where a file can't be found) can now be opened to " "display the book detail view. They will be flagged with a little unavailable" " tag" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:175 #: data/com.github.geigi.cozy.appdata.xml:198 #: data/com.github.geigi.cozy.appdata.xml:220 msgid "Under the hood improvements in the media importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:176 #: data/com.github.geigi.cozy.appdata.xml:199 #: data/com.github.geigi.cozy.appdata.xml:221 msgid "" "Media playback is rewritten from ground up. It's far more stable than " "before." msgstr "" "మీడియా ప్లేబ్యాక్ గ్రౌండ్ అప్ నుండి తిరిగి వ్రాయబడింది. ఇది మునుపటి కంటే " "చాలా స్థిరంగా ఉంది." #: data/com.github.geigi.cozy.appdata.xml:177 #: data/com.github.geigi.cozy.appdata.xml:200 #: data/com.github.geigi.cozy.appdata.xml:222 msgid "" "Fix: When a different system language than English is used Cozy created two " "folders in the users home directory on the first startup, a translated and a" " English one. Now only the translated folder will be created." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:178 #: data/com.github.geigi.cozy.appdata.xml:201 #: data/com.github.geigi.cozy.appdata.xml:223 msgid "Fix: A wrong mouse pointer was displayed with some pointer themes" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:179 #: data/com.github.geigi.cozy.appdata.xml:202 #: data/com.github.geigi.cozy.appdata.xml:224 msgid "Fix: A memory leak in the importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:180 #: data/com.github.geigi.cozy.appdata.xml:203 #: data/com.github.geigi.cozy.appdata.xml:225 msgid "Fix: The playback speed of a book was not remembered correctly" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:181 #: data/com.github.geigi.cozy.appdata.xml:204 #: data/com.github.geigi.cozy.appdata.xml:226 msgid "" "Fix: The desktop integration did not respect the switch author and reader " "setting" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:182 #: data/com.github.geigi.cozy.appdata.xml:285 msgid "Many other small fixes that make Cozy more reliable" msgstr "కొజి‌ను మరింత నమ్మదగినదిగా చేసే అనేక ఇతర చిన్న పరిష్కారాలు" #: data/com.github.geigi.cozy.appdata.xml:233 #: data/com.github.geigi.cozy.appdata.xml:249 msgid "" "Surprise! Cozy features a new icon thanks to jimmac! This updates also " "features some smaller fixes and a small redesign of the headerbar." msgstr "" "ఆశ్చర్యం! కొజి కొత్త చిహ్నాన్ని కలిగి ఉంది జిమ్మాక్‌కు ధన్యవాదాలు! ఈ " "నవీకరణలలో కొన్ని చిన్న పరిష్కారాలు మరియు హెడర్‌బార్ యొక్క చిన్న పునఃరూపకల్పన" " కూడా ఉన్నాయి." #: data/com.github.geigi.cozy.appdata.xml:237 #: data/com.github.geigi.cozy.appdata.xml:253 msgid "A new icon! Thanks jimmac :)" msgstr "క్రొత్త చిహ్నం! ధన్యవాదాలు జిమ్మాక్ :)" #: data/com.github.geigi.cozy.appdata.xml:238 #: data/com.github.geigi.cozy.appdata.xml:254 msgid "Refined headerbar" msgstr "శుద్ధి చేసిన హెడర్ బార్" #: data/com.github.geigi.cozy.appdata.xml:239 #: data/com.github.geigi.cozy.appdata.xml:255 msgid "A click on the cover image in the headerbar opens the book detail view" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:240 #: data/com.github.geigi.cozy.appdata.xml:256 msgid "" "Book detail view: Pressing the back button on the mouse brings you back to " "the library" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:241 #: data/com.github.geigi.cozy.appdata.xml:257 msgid "Fix: Aborting the download of a book is now handled more gracefully" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:242 #: data/com.github.geigi.cozy.appdata.xml:258 msgid "Fix: Opening a book using the return key now works as expected" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:269 msgid "Cozy is now compatible with Python 3.9 (thanks phpwutz!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:276 msgid "This release features a lot of bug fixes." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:280 msgid "" "The rewind and fast forward buttons in the desktop integration now jump 30 " "seconds back and forth instead of jumping a whole chapter" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:281 msgid "Fix: the rewind button in the toolbar is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:282 msgid "Fix: automatic rewind, when enabled in settings, is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:283 msgid "" "Fix: when rewinding at the beginning of a book Cozy did jump to the end of " "the book" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:284 msgid "" "Fix: pressing escape to leave the book detail view is now working again" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:292 msgid "" "This release features a rewrite of the book detail view to prepare " "everything for chapter support with m4b files which will follow in a later " "update. If something isn't working as expected let me know!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:296 msgid "" "Fix: If an audiobook directory contained a lot of non audio files, Cozy " "could skip all other files on import (thanks foliva!)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:297 msgid "" "Fix: When copying files via Drag and Drop sometimes the progress bar " "reported an incorrect progress" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:308 #: data/com.github.geigi.cozy.appdata.xml:323 #: data/com.github.geigi.cozy.appdata.xml:338 msgid "Increase maximum playback speed to 3.5x" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:309 #: data/com.github.geigi.cozy.appdata.xml:324 #: data/com.github.geigi.cozy.appdata.xml:339 msgid "" "Fix: audio files with uppercase extensions where not detected (thanks to " "leuc)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:310 #: data/com.github.geigi.cozy.appdata.xml:325 msgid "" "Fix: when using drag and drop some files where not copied and imported " "correctly" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:311 #: data/com.github.geigi.cozy.appdata.xml:326 #: data/com.github.geigi.cozy.appdata.xml:340 msgid "Fix: removing a book from the library was sometimes not possible" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:312 #: data/com.github.geigi.cozy.appdata.xml:327 #: data/com.github.geigi.cozy.appdata.xml:341 msgid "" "Fix: sometimes Cozy's database ran into a locking issue, which could lead to" " unexpected behaviour of Cozy" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:348 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support, which " "will follow in a later update. Stay tuned!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:352 msgid "Basic support for m4b audio books (chapters are not supported yet)" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:353 msgid "Fixed multiple bugs when using drag and drop to import files" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:359 #: data/com.github.geigi.cozy.appdata.xml:371 msgid "" "Some of your files where not recognized by Cozy despite being valid audio " "files? Not anymore! This version features a completely rewritten importer " "which is far more reliable. Enjoy!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:363 #: data/com.github.geigi.cozy.appdata.xml:375 msgid "A completely rewritten and far more reliable media importer" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:364 #: data/com.github.geigi.cozy.appdata.xml:376 msgid "Optional error reporting on crashes" msgstr "క్రాష్‌లపై ఐచ్ఛిక లోపం రిపోర్టింగ్" #: data/com.github.geigi.cozy.appdata.xml:384 msgid "Multiple author and readers are now separated in the library view" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:385 msgid "Increase maximum playback speed to 3x" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:386 msgid "" "Fix: playback speed was not saved correctly under some circumstances, thanks" " to magnickolas" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:387 msgid "Updated translations thanks to all of the translators!" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:394 msgid "Fix: Jump to folder was not working" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:395 msgid "Fix: Removing a book from the library did not work as expected" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:396 msgid "Fix: Error that could occur when opening the book overview" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:397 #: data/com.github.geigi.cozy.appdata.xml:412 #: data/com.github.geigi.cozy.appdata.xml:424 #: data/com.github.geigi.cozy.appdata.xml:432 #: data/com.github.geigi.cozy.appdata.xml:446 #: data/com.github.geigi.cozy.appdata.xml:454 #: data/com.github.geigi.cozy.appdata.xml:471 #: data/com.github.geigi.cozy.appdata.xml:480 #: data/com.github.geigi.cozy.appdata.xml:492 #: data/com.github.geigi.cozy.appdata.xml:502 #: data/com.github.geigi.cozy.appdata.xml:533 #: data/com.github.geigi.cozy.appdata.xml:552 msgid "Updated translations" msgstr "Updated translations" #: data/com.github.geigi.cozy.appdata.xml:404 msgid "Support for more mp3 files! Let me know if you have problems." msgstr "" #: data/com.github.geigi.cozy.appdata.xml:405 msgid "Preparations to support chapters within audio files" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:406 msgid "The beginning of the biggest cleanup and refactoring under the hood" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:407 msgid "Visual improvements in book overview, thanks to elya5" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:408 msgid "Support for smaller screen sizes, thanks again to elya5" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:409 msgid "Fix: Some book titles where not displayed, thanks to naglis" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:410 msgid "Fix: Empty books could crash the application" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:411 msgid "Fix: Author and reader can now be swapped from settings" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:419 msgid "Fix: Crash which could occur while changing the titlebar display mode" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:420 msgid "Fix: Better handling of resources that cannot be found" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:421 msgid "Fix: Fira font is now readable on the welcome screen" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:422 msgid "Fix: Multiple bugs regarding the titlebar" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:423 msgid "Fix: File not found dialog was not displayed for external devices" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:431 msgid "Fix: Files with missing tags failed to import" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:439 msgid "" "A warning is displayed in the titlebar if network/external drives are not " "connected" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:440 msgid "MPRIS desktop integration is more stable" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:441 msgid "" "Fix: Last book was loaded on startup even when the storage medium was " "offline" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:442 msgid "Fix: Bugs in audiobook location settings window" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:443 msgid "Fix: Bug which sometimes could prevent playback of an audiobook" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:444 msgid "Fix: Crash which could occur on startup" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:445 msgid "" "Fix: Jumping in titlebar while dragging the position slider with long audio " "files" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:453 msgid "Sleep timer: Automatic system power control" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:461 msgid "Support for opus files" msgstr "opus ఫైళ్ళకు మద్దతు" #: data/com.github.geigi.cozy.appdata.xml:462 msgid "Better support for ogg cover art" msgstr "ogg కవర్ ఆర్ట్ కోసం మంచి మద్దతు" #: data/com.github.geigi.cozy.appdata.xml:463 msgid "Swedish translation" msgstr "స్వీడిష్ అనువాదం" #: data/com.github.geigi.cozy.appdata.xml:470 msgid "Fix: some valid media files were not detected" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:472 #: data/com.github.geigi.cozy.appdata.xml:483 msgid "Other small fixes" msgstr "ఇతర చిన్న పరిష్కారాలు" #: data/com.github.geigi.cozy.appdata.xml:479 msgid "Support for python 3.8. Cheers to emmaliddell" msgstr "పైథాన్ 3.8 కు మద్దతు. ఎమ్మాలిడెల్ కు చీర్స్" #: data/com.github.geigi.cozy.appdata.xml:481 msgid "Fixes in the titlebar" msgstr "టైటిల్ బార్‌లో పరిష్కారాలు" #: data/com.github.geigi.cozy.appdata.xml:482 msgid "Fix: show navigation bar when searching from book overview" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:490 #: data/com.github.geigi.cozy.appdata.xml:500 msgid "Cozy features a new icon! Cheers to Fatih20" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:491 #: data/com.github.geigi.cozy.appdata.xml:501 msgid "App information is now translated! Cheers to NathanBnm" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:493 #: data/com.github.geigi.cozy.appdata.xml:503 msgid "Fix: Sometimes the app name was not correctly displayed" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:510 #: data/com.github.geigi.cozy.appdata.xml:517 msgid "" "Fix: Cozy crashed on startup when prefering cover image files over embedded " "album art" msgstr "" "Fix: Cozy crashed on startup when prefering cover image files over embedded " "album art" #: data/com.github.geigi.cozy.appdata.xml:524 msgid "Fixed startup crash on elementary OS 5.0 Juno" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:531 msgid "Support for elementary OS 5.0 Juno" msgstr "ఎలిమెంట్రి OS 5.0 జూనోకు మద్దతు" #: data/com.github.geigi.cozy.appdata.xml:532 msgid "" "Fixed a bug which prevented Cozy from automatically playing the next chapter" msgstr "" #: data/com.github.geigi.cozy.appdata.xml:540 msgid "" "Fixed a bug which prevented cozy from automatically playing the next chapter" msgstr "" "Fixed a bug which prevented cozy from automatically playing the next chapter" #: data/com.github.geigi.cozy.appdata.xml:547 msgid "Improved artwork image quality" msgstr "Improved artwork image quality" #: data/com.github.geigi.cozy.appdata.xml:548 msgid "The book overview now supports multiple disks in audiobooks" msgstr "The book overview now supports multiple disks in audiobooks" #: data/com.github.geigi.cozy.appdata.xml:549 msgid "" "The file not found window will only open when the file is on the internal " "drive" msgstr "" "The file not found window will only open when the file is on the internal " "drive" #: data/com.github.geigi.cozy.appdata.xml:550 msgid "Fixed a typo" msgstr "Fixed a typo" #: data/com.github.geigi.cozy.appdata.xml:551 msgid "Support for elementary OS 5.0" msgstr "ఎలిమెంట్రి OS 5.0 కు మద్దతుంది" #: data/com.github.geigi.cozy.appdata.xml:559 msgid "" "Offline Mode! If your audiobooks are on an external or network drive, you " "can switch the download button to keep a local cached copy of the book to " "listen to on the go. To enable this feature you have to set your storage " "location to external in the settings." msgstr "" "Offline Mode! If your audiobooks are on an external or network drive, you " "can switch the download button to keep a local cached copy of the book to " "listen to on the go. To enable this feature you have to set your storage " "location to external in the settings." #: data/com.github.geigi.cozy.appdata.xml:560 msgid "Detect online/offline storage devices" msgstr "Detect online/offline storage devices" #: data/com.github.geigi.cozy.appdata.xml:561 msgid "Option to hide unavailable books" msgstr "Option to hide unavailable books" #: data/com.github.geigi.cozy.appdata.xml:562 msgid "Support for wav files" msgstr "Support for wav files" #: data/com.github.geigi.cozy.appdata.xml:563 msgid "Support for audio files that have no tags at all" msgstr "Support for audio files that have no tags at all" #: data/com.github.geigi.cozy.appdata.xml:564 msgid "You can mark books as read using the right click menu" msgstr "You can mark books as read using the right click menu" #: data/com.github.geigi.cozy.appdata.xml:565 msgid "New setting: Prefer cover image file over embedded covers" msgstr "New setting: Prefer cover image file over embedded covers" #: data/com.github.geigi.cozy.appdata.xml:566 msgid "Redesigned Sleep Timer" msgstr "Redesigned Sleep Timer" #: data/com.github.geigi.cozy.appdata.xml:567 msgid "" "More Sleep Timer: You can now stop the playback after the current chapter" msgstr "" "More Sleep Timer: You can now stop the playback after the current chapter" #: data/com.github.geigi.cozy.appdata.xml:568 msgid "And even more: Fadeout on timer end (in settings)" msgstr "And even more: Fadeout on timer end (in settings)" #: data/com.github.geigi.cozy.appdata.xml:569 msgid "Redesigned hello screen and settings" msgstr "Redesigned hello screen and settings" #: data/com.github.geigi.cozy.appdata.xml:570 msgid "Fixed bug where cozy would not start on GTK older than 3.22" msgstr "Fixed bug where cozy would not start on GTK older than 3.22" #: data/com.github.geigi.cozy.appdata.xml:571 msgid "" "If no author field is present, the reader field will be used as author. This" " requires a force reimport (settings) on already imported books." msgstr "" "If no author field is present, the reader field will be used as author. This" " requires a force reimport (settings) on already imported books." #: data/com.github.geigi.cozy.appdata.xml:572 msgid "Optimizations under the hood" msgstr "Optimizations under the hood" cozy-1.3.0/po/extra/tr.po000066400000000000000000000067251457036466300152550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # # Translators: # Oğuzhan KIRLI , 2021 # Julian Geywitz , 2021 # Sabri Ünal , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-16 15:04+0100\n" "PO-Revision-Date: 2019-09-08 09:39+0000\n" "Last-Translator: Sabri Ünal , 2022\n" "Language-Team: Turkish (https://app.transifex.com/geigi/teams/78138/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: data/com.github.geigi.cozy.desktop:3 msgid "Cozy" msgstr "Cozy" #: data/com.github.geigi.cozy.desktop:4 msgid "Audio Book Player" msgstr "Sesli Kitap Oynatıcı" #: data/com.github.geigi.cozy.desktop:5 msgid "Play and organize your audio book collection" msgstr "Sesli kitap koleksiyonunuzu oynatın ve düzenleyin" #: data/com.github.geigi.cozy.appdata.xml:15 msgid "Listen to audio books" msgstr "Sesli kitaplar dinle" #: data/com.github.geigi.cozy.appdata.xml:17 msgid "Do you like audio books? Then lets get cozy!" msgstr "Sesli kitapları sever misin? O zaman cozy'yi deneyelim! " #: data/com.github.geigi.cozy.appdata.xml:18 msgid "Cozy is a audio book player. Here are some of the features:" msgstr "" "Cozy bir sesli kitap oynatıcıdır. Kimi özelliklerden bazıları şunlardır:" #: data/com.github.geigi.cozy.appdata.xml:20 msgid "Import all your audio books into Cozy to browse them comfortably" msgstr "Rahatça göz atmak için tüm sesli kitaplarınızı Cozy'ye içe aktarın" #: data/com.github.geigi.cozy.appdata.xml:21 msgid "" "Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " "audio books" msgstr "" "DRM içermeyen mp3, m4b, m4a (aac, ALAC, ...) flac, ogg ve wav uzantılı sesli" " kitaplarınızı dinleyin" #: data/com.github.geigi.cozy.appdata.xml:22 msgid "Remembers your playback position" msgstr "Son oynatma konumunuzu hatırlar" #: data/com.github.geigi.cozy.appdata.xml:23 msgid "Sleep timer" msgstr "Uyku zamanlayıcı" #: data/com.github.geigi.cozy.appdata.xml:24 msgid "Playback speed control for each book individually" msgstr "Her kitap için ayrıca düzenlenebilen oynatma hızı denetimi" #: data/com.github.geigi.cozy.appdata.xml:25 msgid "Search your library" msgstr "Kütüphanende ara" #: data/com.github.geigi.cozy.appdata.xml:26 msgid "Multiple storage location support" msgstr "Çoklu depolama konumu desteği" #: data/com.github.geigi.cozy.appdata.xml:27 msgid "" "Offline Mode! This allows you to keep an audio book on your internal storage" " if you store your audio books on an external or network drive. Perfect to " "listen to on the go!" msgstr "" "Çevrimdışı mod! Bu, sesli kitaplarınızı harici veya ağ sürücüsünde " "depoluyorsanız, dahili depolamanızda bir sesli kitap tutmanıza olanak tanır." " Hareket halindeyken dinlemek için mükemmel!" #: data/com.github.geigi.cozy.appdata.xml:28 msgid "Drag and Drop to import new audio books" msgstr "Yeni sesli kitap içe aktarmak için sürükle ve bırak" #: data/com.github.geigi.cozy.appdata.xml:29 msgid "Sort your audio books by author, reader and name" msgstr "" "Sesli kitapları yazarına, seslendirenine veya adına göre sıralayabilirsiniz" cozy-1.3.0/po/fa_IR.po000066400000000000000000000732051457036466300144620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # TheBlue Quasar, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: TheBlue Quasar, 2022\n" "Language-Team: Persian (Iran) (https://www.transifex.com/geigi/teams/78138/fa_IR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_IR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "کتاب​های صوتی" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "در​حال رونوشت" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "رونوشت ممکن نیست: مسیر کتاب صوتی صرفاً قابل‌خواندن است" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "رونوشت ممکن نیست: دیسک پر است" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "رونوشت ممکن نیست: دسترسی رد شد" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "خطا طی وارد کردن پرونده​های جدید" #: cozy/model/track.py:38 msgid "Chapter" msgstr "فصل" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} ساعت" msgstr[1] "{hours} ساعت" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "دقیقه" msgstr[1] "{minutes} دقیقه" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} ثانیه" msgstr[1] "{seconds} ثانیه" #: cozy/tools.py:102 msgid "finished" msgstr "پایان​یافته" #: cozy/tools.py:126 msgid "never" msgstr "هرگز" #: cozy/tools.py:128 msgid "today" msgstr "امروز" #: cozy/tools.py:130 msgid "yesterday" msgstr "دیروز" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%sروز پیش" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} هفته پیش" msgstr[1] "{weeks}" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} ماه پیش" msgstr[1] "{months}" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} سال پیش" msgstr[1] "{years} " #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "دانلود‌شده" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "دانلود" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "این قسمت را پخش کن" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "دیسک" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "تمامی پرونده​ها" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "تنظیم مسیر کتاب​های صوتی" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} آفلاین است." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "تعیین به عنوان خوانده​شده" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "باز کردن در مرورگر پرونده​ها" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "حذف از کتابخانه" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "غیرفعال​شده" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "گزارش خطای اصلی" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "گزارش خطای مفصّل" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "گزارش خطای مفصل به​همراه خطاهای وارد​کردن " #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "بدون هیچ گزارش خطا یا از​کار​افتادن" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "اطلاعات ذیل در صورت وقوع خطا یا از​کار​افتادن ارسال خواهد شد:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "کدام خطا رخ داده" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "سطری از کد که در آن خطا رخ داده" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "نسخه Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "توزیع لینوکس" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "محیط میزکار" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "نوع رسانه​ای که Cozy نتوانسته وارد کند" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "همه" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "نمایش همه کتاب​ها" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "پرش به نویسنده" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "پرش به گوینده" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "این کتاب را پخش کن" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "دقیقه" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "خاموش" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "درایو خارجی" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "درایو داخلی" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "در حال تازه​سازی مجموعه کتاب​های صوتی" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "در حال رونوشت پرونده​های جدید..." #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "در حال تغییر مکان کتاب صوتی..." #: data/ui/about.ui:16 msgid "GitHub" msgstr "گیت​هاب" #: data/ui/album_element.ui:104 msgid "Play" msgstr "پخش کردن" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "باقی​مانده" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "کل" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "آخرین پخش​شده" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "منتشرشده" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "برخی یا تمام پرونده​های این کتاب قابل یافتن نیست." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "غیر​قابل​دسترس" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "در حال بارگیری فصل‌ها‌، لطفا منتظر بمانید..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "بازکردن نمای کلی کتاب" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "بستن ‌Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "دریافت کمک در گیت‌هاب" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "خطایی طی بروزرسانی پایگاه‌داده رخ داد" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "طی یک بروزرسانی پایگاه‌داده خطایی رخ داد و Cozy قادر به راه‌اندازی نخواهد بود.\n" "یک پشتیبان از پایگاه‌داده پیش از بروزرسانی ایجاد شده‌بود و اکنون بازیابی شده‌است.\n" "تا زمانی که این مسئله حل شود لطفا از نسخه 0.9.5 Cozy استفاده کنید.\n" "شما می‌توانید به حل این مشکل با گزارش یک مسئله در گیت‌هاب کمک کنید." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "لغو" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "حذف کتاب‌صوتی" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "آیا مطمئن هستید می‌خواهید کتاب‌صوتی انتخاب‌شده را حذف کنید؟" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "این کتاب‌صوتی از دیسک شما و از کتابخانه Cozy حذف خواهد شد." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "بازخورد کاربر" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "شما می‌توانید به Cozy با دادن اطلاعات در زمینه‌ی خطاها و ازکارافتادن‌ها کمک " "کنید." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "دادن این اطلاعات اختیاری و کاملا ناشناس است. ما هرگز اطلاعات شخصی، " "پرونده‌هایی که وارد می‌کنید یا هر اطلاعاتی را که قادر به شناسایی شما باشد " "جمع‌آوری نمی‌کنیم." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy منبع-باز است و کد منبع بازخورد کاربر از این‌جا قابل بررسی می‌باشد:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "یافتن مکان" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "پرونده پیدا نشد" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" "این پرونده قابل بافتن نبود. آیا می‌خواهید به‌صورت دستی مکان آن را بیابید؟" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "نشان‌دادن پیشرفت کار پس‌زمینه" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "در کتابخانه‌تان جستجو کنید" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "دکمه‌ی منوی جستجو" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "پنجره‌ی بازشوی جستجو را باز کن" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "گزینه‌ها" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "دکمه‌ی منوی گزینه‌ها" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "پنجره‌ی بازشوی گزینه‌ها را باز کن" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "باشه" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "وارد کردن برخی پرونده‌ها ممکن نشد." #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "این می‌تواند دلایل متعددی داشته باشد:\n" "- فرمت صوتی پشتیبانی‌شده نیست\n" "- مسیر یا نام پرونده حروف غیر utf-8 دارد\n" "- پرونده‌(ها) پرونده‌های معتبر صوتی نیستند\n" "- پرونده(ها) خرابند" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "اخیر" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "لیست نویسندگان" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "نویسنده" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "لیست گوینده‌ها" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "گوینده" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "لیست کتاب‌ها" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "با رفتن به نمای نویسنده یا گوینده گشتن در کتابخانه‌تان را آغاز کنید." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "در زمانی که Cozy کتابخانه‌تان را آماده می‌کند، همراه‌مان باشید..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "کتاب‌های صوتی‌تان را وارد کنید" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy به‌طور خودکار کتاب‌های صوتی‌تان را در یک مسیر - کتابخانه‌تان - وارد " "می‌کند." #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "بکشید و بیاندازید" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "کتاب‌های صوتی‌تان را داخل Cozy بکشید و آن‌ها به‌طور خودکار وارد می‌شوند" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "کتاب‌های صوتی را از یک مسیر، درایو شبکه یا یک دیسک خارجی بارگیری کنید" #: data/ui/main_window.ui:417 msgid "Select" msgstr "انتخاب" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "واگرد" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "دکمه واگرد" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "واگرد پخش" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "شروع پخش" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "دکمه پخش/توقف" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "شروع یا توقف پخش" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "جلو" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "دکمه جلو" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "جلوبردن پخش" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "در حال پخش" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "عنوان کتاب" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "عنوان کتاب درحال پخش" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "نام بخش" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "عنوان بخش در حال پخش" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "زمان سپری‌شده" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "زمانی که سپری شده" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "زمان سپری‌شده بخش فعلی" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "پرش به موقعیت در فصل فعلی" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "نوار موقعیت" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "موقعیت بخش فعلی به ثانیه" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "زمان باقی‌مانده" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "زمانی که باقی مانده" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "زمان باقی‌مانده بخش فعلی" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "کنترل میزان صدا" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "سرعت پخش" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "زمان‌سنج خواب" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "دکمه منوی زمان‌سنج" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "پنجره‌ی بازشوی زمان‌سنج خواب را باز کن" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "باز کردن کتاب" #: data/ui/preferences.ui:55 msgid "General" msgstr "عمومی" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "ظاهر" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "برچسب‌ها" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "اگر نویسنده و گوینده اشتباه نمایش داده می‌شوند فعال کنید" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "پخش" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "واگرد 30 ثانیه از کتاب فعلی در هنگام شروع‌ Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "زمان‌سنج خواب" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "فضای ذخیره‌سازی" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "اثر هنری" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "" "همیشه از تصاویر (cover.jpg, *.png و ...) زمانی که قابل‌دسترس است استفاده کن" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "مکان‌های ذخیره‌سازی" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "افزودن مکان" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "حذف مکان" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "تنظیم این مکان ذخیره‌سازی به عنوان داخلی/خارجی." #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "تعیین به عنوان فضای ذخیره‌سازی پیش‌فرض برای کتاب‌های صوتی جدید" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "تعیین به عنوان پیش‌فرض" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "بازخورد" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "بازخورد کاربر" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "جستجو" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "جعبه جستجو" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "جستجو در کتابخانه کتاب‌صوتی‌تان" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "به دنبال چه کتابی هستید؟" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "کتاب" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "بخش" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "هیچ چیزی یافت نشد :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "مدت زمان‌سنج" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "نوار مدت زمان‌سنج" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "تنطیم زمان‌سنج خواب به دقیقه" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "پس از این فصل توقف کن" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "فعال‌کردن کنترل نیروی سیستم" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "نوع عمل پس از این که زمان‌سنج پایان می‌یابد.\n" "«خاموش‌کردن» تلاش خواهد کرد سیستم‌ شما را خاموش کند‌ (به آن بستن هم گفته می‌شود)\n" "«تعلیق» تلاش خواهد کرد سیستم شما را به تعلیق درآورد (به آن به‌خواب‌رفتن هم گفته می‌شود)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "عمل نیروی سیستم\n" "مورد انجام" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "تعلیق‌کردن" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "خاموش‌کردن" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "ـپویش کتابخانه" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "ـمخفی‌کردن کتاب‌های غیرقابل‌دسترس" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "ـتنظیمات" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "ـکمک" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "ـدرباره" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "ـترک‌کردن" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "خوش آمدید!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "کتاب‌های صوتی خود را بیافزایید و بیایید به جای دنجی برویم." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "چه چیزی جدید است؟" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "ادامه" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "چه چیزی در Cozy جدید است؟" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "واردکننده‌ی رسانه‌ای کاملا بازنویسی‌شده و بسیار قابل‌اتکا تر" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "آيا این تجربه را داشته‌اید که پرونده‌های صوتی قابل واردکردن نبودند؟ آن " "پرونده‌ها را بکشید و داخل Cozy بیاندازید یا از منوی نرم‌افزار در نوارعنوان " "برای اسکن مجدد مسیرهای کتاب‌های صوتی‌تان استفاده کنید!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "پرونده‌های رسانه پشتیبانی‌شده در حال حاضر mp3، m4a، flac،ogg، opus و wav " "هستند." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "امکانات بیشتری در یک بروزرسانی بعدی در راه است." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "تغییری مهم در مدیریت کتابخانه" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "قبلا هر پرونده‌ای که به کتابخانه‌تان وارد شده بود اما قابل یافتن نبود در طی " "اسکن از کتابخانه حذف می‌شد." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "اکنون کتاب‌های صوتی به صورت خودکار از کتابخانه‌تان حذف نمی‌شوند. این از " "ازدست رفتن پیشرفت یک کتاب صوتی زمانی که یک پرونده موقتاً قابل یافتن نیست " "جلوگیری می‌کند." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "برای خذف یک کتاب صوتی از کتابخانه صرفا روی آن راست-کلیک کنید و گزینه خذف از " "کتابخانه را انتخاب نمایید." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "پشتیبانی ابتدایی برای کتاب‌های صوتی m4b" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "بسیاری از شما متنظر آن بودید: پشتیبانی از کتاب‌های صوتی m4b! این نسخه شامل " "پشتیبانی ابتدایی برای پرونده‌های m4b بدون پشتیبانی فصل می‌باشد." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "پرونده‌های m4b تان را بکشید و داخل Cozy بیاندازید یا از منوی نرم‌افزار در " "نوار عنوان برای اسکن مجدد مسیرهای کتاب صوتی‌تان استفاده کنید." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "پشتیبانی از فصل در یک بروزرسانی بعدی خواهد آمد. همراه‌مان باشید!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "پشتیبانی فصل برای کتاب‌های صوتی m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "این نسخه از Cozy شامل پشتیبانی فصل برای کتاب‌های صوتی m4b می‌باشد." #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "اگر از قبل پرونده‌های m4b را وارد کرده‌اید لازم است اسکن کتابخانه‌تان را از " "منوی نرم‌افزار آغاز کنید." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "سپس فصل‌ها شناسایی خواهند شد." cozy-1.3.0/po/fi.po000066400000000000000000000636761457036466300141130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Jaakko Saarikko , 2021 # Julian Geywitz , 2021 # Oi Suomi On! , 2021 # Jiri Grönroos , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-08-09 20:31+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Jiri Grönroos , 2022\n" "Language-Team: Finnish (https://www.transifex.com/geigi/teams/78138/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:106 msgid "Audiobooks" msgstr "Äänikirjat" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Jäljennetään" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Ei voida jäljentää: äänikirjojen kansio on \"vain luku\" -muodossa" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Ei voida jäljentää: levy on täynnä" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Ei voida jäjentää: käyttöoikeus evätty" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Virhe tuotaessa uusia tiedostoja" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Luku" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} tunti" msgstr[1] "{hours} tuntia" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuutti" msgstr[1] "{minutes} minuuttia" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekunti" msgstr[1] "{seconds} sekuntia" #: cozy/tools.py:102 msgid "finished" msgstr "päättynyt" #: cozy/tools.py:126 msgid "never" msgstr "ei koskaan" #: cozy/tools.py:128 msgid "today" msgstr "tänään" #: cozy/tools.py:130 msgid "yesterday" msgstr "eilen" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s päivää sitten" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} viikko sitten" msgstr[1] "{weeks} viikkoa sitten" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} kuukausi sitten" msgstr[1] "{months} kuukautta sitten" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} vuosi sitten" msgstr[1] "{years} vuotta sitten" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Ladattu" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Lataa" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Toista tämä osa" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Levy" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Kaikki tiedostot" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Aseta äänikirjahakemisto" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} ei ole verkossa." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Merkitse luetuksi" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Avaa tiedostoselaimessa" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Poista kirjastosta" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Pois käytöstä" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Perusmuotoinen virheraportointi" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Yksityiskohtainen virheraportointi" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Yksityiskohtainen virheraportointi tuontivirheiden kanssa" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Ei virhe- tai kaatumisraportointia." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "Seuraavat tiedot lähetetään virheen tai kaatumisen ilmetessä:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Minkä kaltainen virhe tapahtui" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Koodirivi jolla virhe ilmeni" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Cozyn versio" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linux-jakelu" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Työpöytäympäristö" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tiedostojen mediamuoto joita Cozy ei saanut tuotua" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Kaikki" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Näytä kaikki kirjat" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Siirry tekijään" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Siirry lukijaan" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Toista tämä kirja" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Pois" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:380 msgid "External drive" msgstr "Ulkoinen asema" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Sisäinen asema" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Päivitetään äänikirjakokoelmaa" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Kopioidaan uusia tiedostoja…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Muutetaan äänikirjojen sijaintia…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Toista" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Jäljellä" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Yhteensä" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Viimeksi toistettu" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Julkaistu" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Joitain tai yhtäkään tämän kirjan tiedostoa ei löydy." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "ei saatavilla" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Ladataan lukuja, odota hetki..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Avaa kirjan esittely" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Sulje Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Apua tarjolla GitHubissa" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Tietokantaa päivittäessä tapahtui virhe" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Tietokannan päivityksen aikana ilmeni virhe ja Cozy ei pysty nyt käynnistymään. \n" "Tietokannasta luotiin kuitenkin varmuuskopio ennen päivitystä ja se on nyt palautettu.\n" "Kunnes tämä kyseinen ongelma saadaan ratkaistua; käytä Cozyn versiota 0.9.5.\n" "Voit auttaa tämän ongelman ratkaisemisessa tekemällä tapahtuneesta selonteon GitHub:iin. " #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Peru" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Poista äänikirja" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Haluatko varmasti poistaa valitun äänikirjan?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Äänikirja poistetaan levyltä ja Cozyn kirjastosta." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:458 msgid "User feedback" msgstr "Käyttäjäpalaute" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Voit auttaa parantamaan Cozya antamalla tietoja virheiden ja kaatumisten " "ilmetessä" #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Tämän tiedon antaminen on valinnaista ja täysin anonyymiä. Emme milloinkaan " "kerää henkilökohtaista dataa, tiedostoja joita koetit tuoda, tai muutakaan " "tietoa jonka kautta sinut voitaisiin tunnistaa." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy on koodiltaan avointa ja käyttäjäpalautteen lähdekoodi voidaan käydä " "läpi ja tarkastaa täällä:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Paikanna" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Tiedostoa ei löytynyt" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Tiedostoa ei löytynyt. Haluatko paikantaa sen?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Näytä taustatyön edistyminen" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Etsi kirjastostasi" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Hakuvalikkopainike" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Avaa hakuponnahdus" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Asetukset" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Asetusvalikkopainike" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Avaa asetusten ponnahdus" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "OK" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Joitakin tiedostoja ei voitu tuoda" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Tähän voi olla useita syitä:\n" "- Äänimuoto ei ole tuettu\n" "- Polku tai tiedostonimi sisältää ei utf-8 merkkejä\n" "- Tiedosto(t) eivät ole kelvollisia äänitiedostoja\n" "- Tiedosto(t) ovat rikkoontuneet" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Viimeisin" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lista tekijöistä" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Tekijä" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista lukijoista" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lukija" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lista kirjoista" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Aloita kirjastosi selaaminen valitsemalla näkymäksi Tekijä tai Lukija." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Pysy valppaana kun Cozy valmistelee kirjastoasi…" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Tuo äänikirjasi" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy tuo automaattisesti kaikki äänikirjasi yhteen hakemistoon - kirjastoosi" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Vedä ja pudota" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Vedä äänikirjasi Cozyyn ja ne tuodaan automaattisesti" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Lataa äänikirjoja kansiosta, verkkoasemalta tai ulkoisesta tallennustilasta" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Valitse" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Kelaus taaksepäin" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Kelauspainike" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Kelaa toistoa taaksepäin" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Aloita toisto" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Toisto-/taukopainike" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Aloita tai keskeytä toisto" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Kelaus eteenpäin" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Eteenpäin kelauksen painike" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Kelaa toistoa eteenpäin" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Toistetaan" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Kirjan nimi" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Toistettavan kirjan nimi" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Osan nimi" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Toistettavan osan nimi" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Kulunut aika" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Kulunut aika" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Osan toistoon kulunut aika" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Hyppää kohtaan tässä luvussa" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Kohdan osoitin" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Toiston kohta sekunneissa" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Jäljellä oleva aika" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Jäljellä oleva aika" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Osan jäljellä oleva aika" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Äänenvoimakkuuden säätö" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Toistonopeus" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Ajastin" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Ajastinvalikkopainike" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Avaa ajastimen ponnahdus" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Avaa kirja" #: data/ui/preferences.ui:55 msgid "General" msgstr "Yleiset" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Ulkoasu" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Tunnisteet" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktivoi jos tekijä ja lukija näytetään väärin päin" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Toistaminen" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Kelaa nykyistä kirjaa 30 sekuntia taaksepäin kun Cozy käynnistetään " #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Uniajastin" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Tallennustila" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Kansitaide" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Käytä aina kuvia (cover.jpg, *.png, …) kun saatavilla" #: data/ui/preferences.ui:247 data/ui/preferences.ui:253 msgid "Storage locations" msgstr "Tallennussijainnit" #: data/ui/preferences.ui:312 msgid "Add location" msgstr "Lisää sijainti" #: data/ui/preferences.ui:338 msgid "Remove location" msgstr "Poista sijainti" #: data/ui/preferences.ui:376 msgid "Toggle this storage location to be internal/external." msgstr "Aseta tallennussijainti sisäiseksi tai ulkoiseksi." #: data/ui/preferences.ui:405 msgid "Set as default storage location for new audiobooks" msgstr "Aseta oletussijainniksi uusille äänikirjoille" #: data/ui/preferences.ui:409 msgid "Set as default" msgstr "Aseta oletukseksi" #: data/ui/preferences.ui:453 msgid "Feedback" msgstr "Palaute" #: data/ui/preferences.ui:463 msgid "User Feedback" msgstr "Käyttäjäpalaute" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Etsi" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Hakulaatikko" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Etsi kirjastostasi" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Mitä kirjaa etsit?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Kirja" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Osa" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Mitään ei löytynyt :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Ajastimen kesto" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Ajastimen keston säädin" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Aseta ajastimen kesto minuuteissa" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Pysäytä tämänhtekisen kappaleen jälkeen" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Kytke päälle järjestelmän tehohallinta" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Toimintamalli kun ajastin saapuu päätökseen.\n" "\"sammuta\" yrittää sammuttaa järjestelmäsi (tunnetaan myös muodossa virta pois)\n" "\"keskeytä\" yrittää järjestelmäsi keskeytystä (tunnetaan myös muodossa nukkuminen)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Järjestelmän virtatoiminto\n" "joka suoritetaan" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "keskeytä" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "sammuta" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Skannaa kirjasto" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Piilota kirjat jotka eivät ole saatavilla" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Asetukset" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "O_hje" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Tietoja" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Lopeta" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Tervetuloa!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Lisää äänikirjasi ja siirrytään eteenpäin." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Mitä uutta?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Jatka" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Mitä uutta Cozy sisältää" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Kokonaisuudessaan uudelleenkirjoitettu ja paljon luotettavampi " "mediantuontiohjelma." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Kohtasitko kokemuksia äänitiedostoista joita ei voitu tuoda ohjelmaan? " "Raahaa & pudota nuo tiedostot Cozyyn tai käytä ohjelmavalikkoa " "otsikkopalkissa uudelleenskannataksesi äänikirjahakemistosi!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Tuetut tiedostomuodot ovat tällä hetkellä mp3, m4a, flac, ogg, opus ja wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Lisää on tulossa päivitysten mukana tuonnempana." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Tärkeä muutos kirjastonhallinnassa" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Jokainen tiedosto joka siirrettiin aiemmin kirjastoon, mutta joita ei enää " "nykyisellään löydetty, poistettiin kirjastosta läpikäymistoiminnon aikana." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Nyt äänikirjoja ei enää poisteta kirjastostasi automaattisesti. Tämä estää " "äänikirjan kuuntelukehityksen menettämisen vahingossa silloin kun tiedostoa " "ei väliaikaisesti löydykään." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Poistaaksesi äänikirjan kirjastostasi, napsauta vain yksinkertaisesti sen " "päällä ja valitse poista kirjastosta -vaihtoehto." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Perustuki m4b-äänikirjoille." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Monet teistä ovatkin sitä odottaneet: m4b-äänikirjatukea! Tämä versio " "esittelee perustuen m4b-tiedostoille ilman tukea kuitenkaan eri luvuille." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Raahaa & pudota m4b-tiedostosi Cozyyn tai käytä ohjelmavalikkoa " "otsikkopalkissa uudelleenskannataksesi äänikirjahakemistosi." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "Tuki eri luvuille seuraa tulevien päivitysten yhteydessä. Pysy mukana!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Tuki lukuosioille m4b-muotoisten äänikirjojen suhteen." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Tämä Cozyn julkaisuversio sisältää tuen eri luvuille m4b-äänikirjoissa! " #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Mikäli sinulla on jo valmiiksi m4b-tiedostoja tuotuna kirjastoosi, sinun " "tulee käynnistää kirjastokohteiden läpikäynti uudelleen ohjelmavalikosta. " #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Luvut tullaan tämän kautta sitten tunnistamaan." cozy-1.3.0/po/fr.po000066400000000000000000000652171457036466300141150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Charavner Louis , 2020 # Thibault Martin , 2021 # e78dfa95e8487a60e89adc3a5c3879f2, 2021 # Trevor Clokie , 2021 # Julian Geywitz , 2021 # Irénée THIRION, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Irénée THIRION, 2022\n" "Language-Team: French (https://www.transifex.com/geigi/teams/78138/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Livres audio" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Copie en cours" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Copie impossible : le répertoire Audiobook est en lecture seule" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Copie impossible : stockage plein" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Copie impossible : permission refusée" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Erreur dans l'importation de nouveaux fichiers" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Chapitre" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} heure" msgstr[1] "{hours} heures" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minute" msgstr[1] "{minutes} minutes" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} seconde" msgstr[1] "{seconds} secondes" #: cozy/tools.py:102 msgid "finished" msgstr "terminé" #: cozy/tools.py:126 msgid "never" msgstr "jamais" #: cozy/tools.py:128 msgid "today" msgstr "aujourd’hui" #: cozy/tools.py:130 msgid "yesterday" msgstr "hier" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "Il y a %s jours" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "Il y a {weeks} semaine" msgstr[1] "Il y a {weeks} semaines" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "Il y a {months} mois" msgstr[1] "Il y a {months} mois" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "Il y a {years} an" msgstr[1] "Il y a {years} ans" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Téléchargement terminé" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Télécharger" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Lire cette partie" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disque" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Tous les fichiers" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Définir le répertoire des livres audio" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} est inaccessible." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marquer comme lu" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Ouvrir dans l’explorateur de fichiers" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Supprimer" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Désactivé" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Rapport d’erreurs simple" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Rapport d’erreurs détaillé" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Rapport d’erreurs détaillé avec erreurs d’import" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Pas de rapport d’erreur ou de plantage." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Les informations suivantes seront envoyées en cas d’erreur ou de plantage :" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Quel type d’erreur est survenu" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Ligne de code où l’erreur est survenue" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Version de Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribution de Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Environnement de bureau" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Type de fichiers média que Cozy n’a pas pu importer" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Tous" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Afficher tous les livres" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Aller à l’auteur" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Aller au narrateur" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Lire ce livre" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Désactivée" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Stockage externe" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Stockage interne" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Rafraîchissement de la collection de livres audio" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Copiant les fichiers..." #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Modifier l'emplacement des livres audio…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Jouer" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restant" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Dernière lecture" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Publié" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Tout ou partie des fichiers de ce livre ne peuvent être trouvés." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "indisponible" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Chargement des chapitres, merci de patienter..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Voir le résumé" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Fermer Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Recevoir de l'aide sur GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Une erreur a eu lieu lors du chargement de la base de données" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Durant une mise à jour de la base de données une erreur est survenue et Cozy ne sera pas capable de démarrer.\n" "Une sauvegarde de la base de données a été créée avant la mise à jour et a désormais été restaurée.\n" "Jusqu'à ce que ce problème soit résolu, merci d'utiliser la version 0.9.5 de Cozy.\n" "Vous pouvez aider à résoudre ce problème en rapportant l'erreur sur GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Annuler" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Supprimez ce livre audio" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Êtes-vous certain que vous voulez supprimer le livre audio choisi ?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" "Le livre audio sera supprimé de votre disque et de la librairie de Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Rapports utilisateur" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Vous pouvez aider à améliorer Cozy en envoyant des rapports d’erreur ou de " "plantage." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "L’envoi de ces informations est facultatif et complètement anonyme. Nous ne " "collectons aucune donnée personnelle, fichier que vous importez ou " "informations permettant de vous identifier." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy est open source, et le code d’envoi de rapports d’erreur peut être " "inspecté ici :" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Voir l’emplacement" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Fichier introuvable" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Ce fichier est introuvable. Voulez-vous le rechercher manuellement ?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Afficher la progression des tâches en arrière-plan" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Rechercher dans votre bibliothèque" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Bouton du menu de recherche" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Ouvrir la boîte de recherche" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Options" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Bouton du menu options" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Ouvrir les options" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Certains fichiers n’ont pas pu être importés" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Ceci peut se produire pour diverses raisons :\n" "- L'encodage audio n’est pas pris en charge\n" "- Le chemin d’accès contient des caractères non utf-8\n" "- Il ne s’agit pas de fichier(s) audio valide(s)\n" "- Il s’agit de fichier(s) corrompu(s)" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Récent" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Liste des auteurs" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Auteur" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Liste des narrateurs" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Narrateur" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Liste des livres" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Commencez à explorer votre librairie en passant à la vue Auteur ou Lecteur." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Attendez pendant que Cozy prépare votre bibliothèque..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importer vos livres audios" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy va automatiquement importer vos livres audios dans un répertoire unique" " - votre bibliothèque" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Glisser & Déposer" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Faites glisser vos livres audio directement dans Cozy pour les importer" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Charger les livres audio depuis un répertoire, un stockage en ligne ou un " "disque externe" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Sélectionner" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Rembobinage" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Bouton de rembobinage" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Rembobinage de la lecture" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Démarrer la lecture" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Bouton Marche/Arrêt" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Démarrer ou interrompre la lecture" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Avancer" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Bouton d'avancement" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Avancer la lecture" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Lecture en cours" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Titre" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Titre du livre en cours de lecture" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nom du chapitre" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Titre du chapitre en cours de lecture" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Temps écoulé" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Temps écoulé" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Temps écoulé depuis le début du chapitre" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Se déplacer dans le chapitre courant" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Indicateur de position" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Position dans le chapitre courant en secondes" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Temps restant" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Temps restant" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Temps restant du chapitre actuel" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Volume" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Vitesse de lecture" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Minuterie" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Bouton du chronomètre" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Ouvrir le chronomètre" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Ouvrir le livre" #: data/ui/preferences.ui:55 msgid "General" msgstr "Général" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Apparence" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Étiquettes" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Activer si l'auteur et le lecteur sont mal affichés" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Lecture" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Rembobiner 30 secondes du livre en cours lors du démarrage de Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Minuterie de veille" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Stockage" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Couverture" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Toujours utiliser des images (couverture.jpg, *.png, ...) si possible" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Emplacements de stockage" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Ajouter un emplacement" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Retirer l’emplacement" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Basculer l’état interne/externe pour cet emplacement" #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "Définir comme emplacement par défaut pour les nouveaux livres audio" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Définir par défaut" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Retours" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Retour Utilisateur" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Recherche" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Boîte de recherche" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Recherchez dans votre bibliothèque de livres audio" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Quel livre recherchez-vous ?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Livre" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Chapitre" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Rien n’a été trouvé :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Durée du décompte" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Indicateur du décompte" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Ajuster la durée du chronomètre" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Arrêter la lecture à la fin de ce chapitre" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Activer la gestion d'énergie" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Choisissez une action à effectuer à la fin du décompte.\n" "« éteindre » éteindra votre ordinateur.\n" "« mettre en veille » mettra votre ordinateur en veille" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Action d’état du système\n" "à effectuer" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "mettre en veille" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "éteindre" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Scanner la bibliothèque" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Masquer les livres non disponibles" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Préférences" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Aide" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_À propos" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Quitter" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Bienvenue !" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Ajoutez vos livres audio et soyez cozy." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Nouveautés" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Continuer" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Ce qui est nouveau avec Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Un assistant d’importation complètement réécrit et beaucoup plus fiable" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Avez-vous fait face à des fichiers qui ne pouvaient pas être importés ? " "Glissez & déposez ces fichiers sur Cozy ou utilisez le menu dans la barre " "d’en-tête pour scanner à nouveau vos répertoires de livres audio !" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Les fichiers média pris en charge actuellement son mp3, m4a, flac, off, opus" " et wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Plus de nouveautés dans une prochaine mises à jour." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Un changement important au management des bibliothèques" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Auparavant, tous les fichiers dans votre bibliothèque qui Cozy ne peut pas " "trouver étaient supprimés de votre bibliothèque pendant les scans." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Désormais les livres audio ne sont plus supprimés automatiquement de votre " "librairie. Cela évite de perdre accidentellement la progression d'un livre " "audio quand un fichier ne peut pas être trouvé temporairement." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Pour supprimer un livre audio de votre bibliothèque, faites un clic droit " "sur le livre et choisissez l'option de le supprimer de votre bibliothèque." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Prise en charge élémentaire des livres audio m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Beaucoup d’entre vous l’attendaient : la prise en charge des livres audio " "m4b ! Cette version introduit la prise en charge élémentaire des fichiers " "m4b sans prise en charge du chapitrage." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Glissez et déposez vos fichiers m4b sur Cozy, ou utilisez le menu dans la " "barre d’en-tête pour scanner à nouveau vos répertoires de livres audio." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "La prise en charge du chapitrage sera pour une prochaine mise à jour. Gardez" " un œil sur les mises à jour !" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Prise en charge des chapitres pour les livres audio m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Cette version de Cozy apporte une prise en charge des chapitres pour les " "livres audio m4b !" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Si vous avez déjà des fichiers m4b importés vous aurez besoin de démarrer un" " scan de votre librairie depuis le menu de l'application. " #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Les chapitres seront alors détectés." cozy-1.3.0/po/gl.po000066400000000000000000000643121457036466300141030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2022 # Fran Diéguez , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Fran Diéguez , 2022\n" "Language-Team: Galician (https://www.transifex.com/geigi/teams/78138/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audiolibros" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Copiando" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Non foi posíbel copiar: O cartafol de audiolibros é de só lectura" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Non foi posíbel copiar: O disco está cheo" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "No foi posíbel copiar: Permiso denegado" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Produciuse un erro ao importar os novos ficheiros" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Capítulo" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} hora" msgstr[1] "{hours} horas" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuto" msgstr[1] "{minutes} minutos" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} segundo" msgstr[1] "{seconds} segundos" #: cozy/tools.py:102 msgid "finished" msgstr "rematado" #: cozy/tools.py:126 msgid "never" msgstr "nunca" #: cozy/tools.py:128 msgid "today" msgstr "hoxe" #: cozy/tools.py:130 msgid "yesterday" msgstr "onte" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "Hai %s días" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "Hai {weeks} semana" msgstr[1] "Hai {weeks} semanas" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "Hai {months} mes" msgstr[1] "Hai {months} meses" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "Hai {years} ano" msgstr[1] "Hai {years} anos" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Descargado" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Descargar" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Reproducir esta sección" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disco" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Todos os ficheiros" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Estabelecer cartafol de audiolibros" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} non está dispoñíbel." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marcar como lido" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Abrir en explorador de ficheiros" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Quitar da biblioteca" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Desactivado" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Informe de erros básico" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Informe de erros detallado" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Informe de erros detallado con erros de importación" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Non hai ningún informe de errores ou peches inesperados." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "A siguinte información será enviada en caso de fallo ou error:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Que tipo de error se produciu" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Liña de código onde se orixinou o error" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versión de Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribución de Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Ambiente de escritorio" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tipos de ficheiros de medios que Cozy non puido importar" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Todos" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Mostrar todos los libros" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Ir ao autor" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Ir ao lector" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Reproducir este libro" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Apagado" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Disco externo" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Disco interno" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Actualizando a colección de audiolibros" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Copiando novos ficheiros…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Cambiando ubicación do audiolibro…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Reproducir" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restante" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Última reprodución" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Publicado" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Non foi posíbel atopar algúns ou todos los ficheiros de este libro." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "non dispoñíbel" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Cargando capítulos, por favor agarde…" #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Abrir a sinopse do libro" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Pechar Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Reciba axuda en GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Produciuse un error ao actualizar a base de datos" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Durante unha actualización da base de datos produciuse un error e Cozy non poderá iniciarse.\n" "Creouse unha copia de seguridade da base de datos antes da actualización e restaurouse agora.\n" "Ate que se resolva este problema, por favor utilice a versión 0.9.5 de Cozy.\n" "Pode axudar a resolver este problema reportando un problema en GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Cancelar" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Eliminar audiolibro" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Ten certeza que quere eliminar o audiolibro seleccionado?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "O audiolibro eliminarase do seu disco e da biblioteca de Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Comentarios de usuario" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Pode axudar a mellorar Cozy aportando información en caso de fallos e erros." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Otorgar esta información é opcional e completamente anónima. Nunca " "recolleremos información personal, ficheiros que importase oy ningunha outra" " información que puidera identificarlle." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "Cozy é código libre, o código e os comentarios pódense leer aquí:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Localizar" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Ficheiro non atopado" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Non se puido atopar o ficheiro . Desexa localizalo manualmente?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Mostrar o progreso da tarefa en segundo plano" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Buscar na súa biblioteca" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Botón de menú de busca" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Abrir o cuadro de busca" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opcións" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Botón de menú de opcións" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Abrir o cadro de opcións" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Aceptar" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Non foi posíbel importar algúns ficheiros" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Pode deberse a varios motivos:\n" "• Non se admite o formato de audio\n" "• A ruta ou o nome de ficheiro contén caracteres non UTF-8\n" "• Os ficheiros de audio non son válidos\n" "• Os ficheiro están danados" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Recente" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lista de autores" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista de lectores" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lector" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lista de libros" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Comece a explorar a súa biblioteca cambiando á vista de Autor ou de Lector." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Permaneza atento mentres Cozy prepara a súa biblioteca…" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importe os seus audiolibros" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importa automáticamente os seus audiolibros a un cartafol - a súa " "biblioteca." #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Arrastrar e soltar" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Arrastre os seus audiolibros a Cozy e importaranse automaticamente." #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Cargar audiolibros desde un cartafol, unha unidade de rede ou un disco " "externo" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Seleccionar" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Retroceder" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Botón de Retroceder" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Retroceder a reprodución" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Reproducir" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Botón de reprodución/pausa" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Iniciar ou pausar a reprodución" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Avanzar" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Botón Avanzar" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Botón Retroceso" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Reproducindo agora" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Título do libro" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Título do libro que está reproducíndose" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nome da sección" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Título da sección que está reproducíndose" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Tiempo transcorrido" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tiempo transcorrido" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Tiempo transcorrido da sección actual" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Saltar á posición no capítulo actual" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Deslizador de posición" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posición da sección actual en segundos" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tempo restante" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tempo restante" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Tempo restante da sección actual" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Control de volume" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Velocidade de reprodución" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Temporizador de apagado" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Botón de temporizador de apagado" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Abrir o cadro do temporizador de apagado" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Abrir libro" #: data/ui/preferences.ui:55 msgid "General" msgstr "Xeral" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Aparencia" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Etiquetas" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Actíveo se o autor ou o lector se mostran da forma incorrecta" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Reprodución" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Atrasar 30 segundos do libro actual ao iniciar Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Temporizador de apagado" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Almacenamento" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Material gráfico" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Usar imaxes (portada.jpg, *.png, …) cando están dispoñíbeis" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Localizacións de almacenamento" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Engadir localización" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Eliminar localización" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Trocar esta localización de almacenamento entre interna e externa." #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "" "Estabelecer como localización de almacenamento predeterminada para os novos " "audiolibros" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Estabelecer como predeterminado" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Comentarios" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Comentarios de usuario" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Buscar" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Cadro de busca" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Buscar na súa biblioteca de audiolibros" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Qué libro está buscando?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Libro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Sección" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Non se atopou nada :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Duración do temporizador" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Deslizador do tempo do temporizador" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Axustar o temporizador de apagado en minutos" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Parar despois do capítulo actual" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Activar control de acendido do sistema" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tipo de acción que se realizará ao rematar o temporizador.\n" "«apagar» intentará apagar o sistema.\n" "«suspender» intentará suspender o sistema (tamén se coñece como «durmir»)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Acción ha realizar\n" "ao apagar o sistema" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "suspender" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "apagar" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "Anali_zar biblioteca" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Ocultar libros non dispoñíbeis" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferencias" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "Ax_uda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Sobre" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Saír" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Bienvenida!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Engada os seus audiolibros e pongámonos cómodos." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Novidades?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Continuación" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Novidades en Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Un importador de ficheiros completamente rescrito e moito máis confiábel." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Atopaches algún ficheiro que non puideches importar? Podes arrastrar e " "soltar eses ficheiros en Cozy ou usar o menú da aplicación na barra de " "título para reanalizar o seus cartafoles de audiolibros!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Os ficheiros soportados actualmente son mp3, m4a, flac, ogg, opus e wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Máis cousas nunha actualización futura" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Un cambio importante na xestión das bibliotecas" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Anteriormente, todos os ficheiros que se importaban na biblioteca, pero que " "xa non se podían atopar, eliminábanse da biblioteca durante una exploración." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Agora os audiolibros xa non se eliminan automáticamente da súa biblioteca. " "Isto evita perder accidentalmente o progreso dun audiolibro cando un " "ficheiro non se pode atopar temporalmente." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Para eliminar un audiolibro da biblioteca basta con facer clic co botón " "derecho do ratón sobre él e elexir a opción de eliminar da biblioteca." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Soporte básico para libros de audio m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Moitos estábano agardando: Compatibilidade para os audiolibros de m4b! Esta " "versión conta con compatibilidade básica para ficheiros m4b sen " "compatiblidade de capítulos." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Arrastre e solte os seus ficheiros m4b en Cozy ou usa o menú da aplicación " "na barra de título para volver a explorar os seus cartafoles de audiolibros." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "A compatiblidade de capítulos presentarase nunha actualización posterior. " "Mantéñase atento!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Compatibilidade con capítulos de audiolibros m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Esta versión de Cozy inclúe compatiblidade de capítulos para audiolibros " "m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Se xa ten ficheiros m4b importados, terá que iniciar un análisis da súa " "biblioteca desde o menú da aplicación." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Entón detectaranse os capítulos." cozy-1.3.0/po/he.po000066400000000000000000000504511457036466300140740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # איתמר גרינברג, 2022 # Yaron Shahrabani , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Yaron Shahrabani , 2024\n" "Language-Team: Hebrew (https://app.transifex.com/geigi/teams/78138/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "ספרים מוקלטים" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "העתקה" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "לא ניתן להעתיק: ספריית ספרי השמע היא לקריאה בלבד" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "לא ניתן להעתיק: הכונן מלא" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "לא ניתן להעתיק: ההרשאה נדחתה" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "שגיאה בייבוא קבצים חדשים" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "שעה" msgstr[1] "שעתיים" msgstr[2] "{hours} שעות" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "דקה" msgstr[1] "{minutes} דקות" msgstr[2] "{minutes} דקות" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "שנייה" msgstr[1] "{seconds} שניות" msgstr[2] "{seconds} שניות" #: cozy/tools.py:102 msgid "finished" msgstr "הסתיים" #: cozy/tools.py:126 msgid "never" msgstr "לעולם לא" #: cozy/tools.py:128 msgid "today" msgstr "היום" #: cozy/tools.py:130 msgid "yesterday" msgstr "אתמול" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "לפני %s ימים" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "לפני שבוע" msgstr[1] "לפני שבועיים" msgstr[2] "לפני {weeks} שבועות" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "לפני חודש" msgstr[1] "לפני חודשיים" msgstr[2] "לפני {months} חודשים" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "לפני שנה" msgstr[1] "לפני שנתיים" msgstr[2] "לפני {years} שנים" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "הורד" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "הורדה" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "במהלך עדכון מסד הנתונים אירעה שגיאה ב־Cozy ולא תהיה לו אפשרות לעלות. נוצר " "גיבוי של מסד הנתונים לפני העדכון והוא שוחזר כעת. עד לפתרון התקלה נא להשתמש " "בגרסה 0.9.5 של Cozy. אפשר לסייע לפתור את הבעיה הזאת על ידי דיווח עליה " "ב־GitHub." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "עדכון מסד הנתונים נכשל" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "לסגור את Cozy" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "קבלת עזרה ב־GitHub" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "למחוק ספר שמע?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "ספר השמע יוסר מהכונן שלך ומהספרייה של Cozy." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "ביטול" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "הסרת ספר שמע" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "תקליטור" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "קובץ לא נמצא" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "הקובץ הזה לא נמצא. לנסות לאתר אותו באופן ידני?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "איתור" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "איתור קובץ חסר" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "קובצי {ext}" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "קובצי שמע" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "יכולות להיות לכך מגוון סיבות:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "תצורת השמע לא נתמכת" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "הנתיב או שם הקובץ מכילים תווים שאינם מתקן utf-8" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "אלו אינם קובצי שמע תקינים" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "הקבצים פגומים" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "לא ניתן לייבא חלק מהקבצים" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "בסדר" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "תומכי פטריאון" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "תמיכה בפרקים בתצורת m4b ב־mutagen" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "מיזמי קוד פתוח" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "ירון שהרבני " #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "סימון כנקרא" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "פתיחה בדפדפן הקבצים" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "הסרה מהספרייה" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "השמעת הספר הזה" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "מושבת" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "דיווח שגיאות בסיסי" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "דיווח שגיאות מפורט" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "דיווח שגיאות מפורט עם שגיאות ייבוא" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "אין דיווח על שגיאות או קריסה." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "המידע הבא יישלח במקרה של שגיאה או קריסה:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "איזה סוג של שגיאה אירעה" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "שורת הקוד שבה אירעה שגיאה" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "הגרסה של Cozy" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "הפצת לינוקס" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "סביבת שולחן עבודה" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "סוג מדיה של קבצים ש־Cozy לא הצליח לייבא" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "הכול" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "הצגה של כל הספרים" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "דילוג אל {artist_name}" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "דק׳" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "כבוי" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "הגדרת ספריית שמע" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "כונן חיצוני" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "כונן פנימי" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "רענון אוסף ספרי שמע" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "קבצים חדשים מועתקים…" #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "מיקום ספר השמע משתנה…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "השמעה" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "נותרו" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "סך הכול" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "הושמע אחרון" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "פורסם" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "לא ניתן למצוא חלק או את כל הקבצים של ספר זה." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "לא זמין" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "הפרקים נטענים, נא להמתין…" #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "פתיחת סקירת ספר" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "לנגן את החלק הזה" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "משוב משתמשים" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "אפשר לסייע לשפר את Cozy על ידי תרומת מידע במקרה של שגיאות וקריסות." #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "תרומת מידע זה היא בגדר רשות ואלמונית לחלוטין. לעולם לא נאסוף נתונים אישיים, " "קבצים מיובאים או כל מידע שיכול להוביל לזיהוי שלך." #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "Cozy הוא בקוד פתוח וניתן לעיין בקוד המקור של משוב המשתמש כאן:" #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "קוד המקור " "ב־GitHub" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "בחירת תיקייה" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "החלפת מצב סרגל צד סינון" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "אפשרויות" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "פתיחת חלון האפשרויות הקופץ" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "חיפוש בספרייה שלך" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "פתיחת חלון החיפוש הקופץ" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "הצגת התקדמות המשימה ברקע" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "נא להתחיל להקליד…" #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "_סריקת הספרייה" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "הס_תרת ספרים שאינם זמינים" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "ה_עדפות" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "_על Cozy" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "י_ציאה" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "יש להשליך לכאן ספרי שמע כדי להוסיף אותם לספרייה שלך" #: data/ui/main_window.ui:48 msgid "Library" msgstr "ספרייה" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "לאחרונה" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "סופר" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "רשימת הסופרים" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "קורא" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "רשימת קוראים" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "רשימת ספרים" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "עדיין אין ספרים אחרונים" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "ניתן לסייר בספרייה שלך על ידי החלפה לתצוגות היוצר או הקורא" #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "מושמע כעת" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "שם הספר המושמע כעת" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "כותרת החלק המושמע כעת" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "הרצה לאחור" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "הרצת ההשמעה אחורה" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "התחלת השמעה" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "התחלת או השהיית ההשמעה" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "קדימה" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "הרצת ההשמעה קדימה" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "בקרת עוצמת השמע" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "מהירות השמעה" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "מתזמן שינה" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "פתיחת חלונית תזמון השינה" #: data/ui/preferences.ui:27 msgid "General" msgstr "כללי" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "מראה" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "מצב כהה" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "תגיות" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "החלפה בין היוצר והקורא" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "יש להפעיל אם הסופר והקורא לא מוצגים כראוי" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "נגינה" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "נגינה מחדש" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "להחזיר אחורה את הספר ב־30 שניות עם הפעלת Cozy" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "משך חזרה אחורה" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "משך דילוג קדימה" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "עמעום" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "משך עמעום" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "אחסון" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "אומנות תואמת" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "להעדיף תמונות חיצוניות על עטיפה מוטמעת" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "תמיד להשתמש בתמונות (cover.jpg,‏ ‎*.png, …) כשיש כאלה" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "משוב" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "חיפוש בספרייה שלך" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "לא נמצאו תוצאות" #: data/ui/search_page.ui:33 msgid "Book" msgstr "ספר" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "זמן שחלף" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "הזמן שחלף מהחלק הנוכחי" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "קפיצה למיקום בפרק הנוכחי" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "מיקום החלק הנוכחי בשניות" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "זמן שנותר" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "הזמן שנותר מהחלק הנוכחי" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "מיקומי אחסון" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "הגדרה כברירת מחדל" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "הסרה" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "משך שעון העצר" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "הגדרת משך שעון העצר לשינה בדקות" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "לעצור אחרי הפרק הנוכחי" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "הפעלת בקרת צריכת חשמל של המערכת" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "סוג הפעולה שתינקט עם סיום ספירת שעון העצר.\n" "„כיבוי” ינסה לכבות את המערכת שלך.\n" "„השהיה” תנסה להשהות את המערכת שלך (ידוע גם בתור שינה או תרדמת)." #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "פעולת כיבוי/הדלקה לביצוע" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "השהיה" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "כיבוי" cozy-1.3.0/po/hi.po000066400000000000000000001042671457036466300141050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Panwar108 , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Panwar108 , 2022\n" "Language-Team: Hindi (https://www.transifex.com/geigi/teams/78138/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "ऑडियो पुस्तकें" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "कॉपी करना जारी" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "कॉपी करना विफल : ऑडियो पुस्तक डायरेक्टरी केवल रीड योग्य है" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "कॉपी करना विफल : डिस्क पर स्पेस नहीं है" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "कॉपी करना विफल : अनुमति अस्वीकृत" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "नवीन फाइलें आयात करते समय त्रुटि" #: cozy/model/track.py:38 msgid "Chapter" msgstr "अध्याय" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} घंटा" msgstr[1] "{hours} घंटे" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} मिनट" msgstr[1] "{minutes} मिनट" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} सेकंड" msgstr[1] "{seconds} सेकंड" #: cozy/tools.py:102 msgid "finished" msgstr "पूर्ण" #: cozy/tools.py:126 msgid "never" msgstr "कभी नहीं" #: cozy/tools.py:128 msgid "today" msgstr "आज" #: cozy/tools.py:130 msgid "yesterday" msgstr "बीता कल" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s दिन पूर्व" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} सप्ताह पूर्व" msgstr[1] "{weeks} सप्ताह पूर्व" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} माह पूर्व" msgstr[1] "{months} माह पूर्व" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} वर्ष पूर्व" msgstr[1] "{years} वर्ष पूर्व" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "डाउनलोड की गई" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "डाउनलोड" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "यह खंड आरंभ करें" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "डिस्क" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "सभी फाइलें" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "ऑडियो पुस्तक हेतु डायरेक्टरी सेट करें" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} ऑफलाइन है।" #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "श्रवण पूर्ण के रूप में चिन्हित करें" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "फाइल ब्राउज़र में खोलें" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "संग्रह से हटाएँ" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "निष्क्रिय" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "त्रुटि हेतु सामान्य रिपोर्ट" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "त्रुटि हेतु विस्तृत रिपोर्ट" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "आयात त्रुटियों सहित विस्तृत रिपोर्ट" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "त्रुटि या निरस्त हेतु कोई रिपोर्ट नहीं।" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "कोई त्रुटि या निरस्त होने पर निम्नलिखित सूचना भेजी जाएगी :" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "त्रुटि प्रकार" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "त्रुटि संबंधी कोड की पंक्ति" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Cozy संस्करण" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "लिनक्स वितरण" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "डेस्कटॉप वातावरण" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "मीडिया फाइल प्रकार जिनका Cozy द्वारा आयात विफल रहा" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "सभी" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "सभी पुस्तकें प्रदर्शित करें" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "लेखक देखें" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "वाचक देखें" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "यह पुस्तक आरंभ करें" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "मिनट" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "बंद" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "बाह्य ड्राइव" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "आतंरिक ड्राइव" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "ऑडियो पुस्तक संग्रह रिफ्रेश करना जारी" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "नवीन फाइलें कॉपी करना जारी..." #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "ऑडियो पुस्तक स्थान परिवर्तन जारी..." #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "आरंभ करें" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "शेष" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "कुल" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "अंतिम बार प्रयुक्त" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "प्रकाशित" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "पुस्तक की कुछ या सभी फाइलें प्राप्त करना विफल।" #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "अनुपलब्ध" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "अध्याय लोड करना जारी, कृपया प्रतीक्षा करें..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "पुस्तक अवलोकन खोलें" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Cozy बंद करें" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "GitHub द्वारा सहायता प्राप्त करें" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "डेटाबेस अपडेट करते समय त्रुटि हुई" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "डेटाबेस अपडेट करते समय एक त्रुटि होने के कारण Cozy की आरंभिकरण प्रक्रिया विकृत हो गई है।\n" "अपडेट से पूर्व डेटाबेस के बैकअप का सृजन किया गया था व उसे ही अब पुनः स्थापित कर दिया गया है।\n" "इस समस्या का समाधान होने तक Cozy का 0.9.5 संस्करण ही उपयोग करें।\n" "आप समस्या को GitHub पर रिपोर्ट कर इसके निवारण में सहयोग कर सकते हैं।" #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "रद्द करें" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "ऑडियो पुस्तक हटाएँ" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "क्या आप निश्चित ही चयनित ऑडियो पुस्तक हटाना चाहते हैं?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "यह ऑडियो पुस्तक आपकी डिस्क एवं Cozy पुस्तक संग्रह से हटा दी जाएगी।" #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "उपयोक्ता प्रतिक्रिया" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "आप त्रुटि या निरस्त संबंधी सूचना साझा कर Cozy के सॉफ्टवेयर विकास में योगदान " "कर सकते हैं।" #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "सूचना सहभाजन प्रक्रिया वैकल्पिक व पूर्णतया आपकी निजता का सम्मान करती है। " "आपका निजी डेटा, आयात की गई फाइलें या विशिष्ट पहचान संबंधी सूचना कभी एकत्र " "नहीं होगी।" #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy एक मुक्त-स्रोत सॉफ्टवेयर है व निरीक्षण हेतु उपयोक्ता प्रतिक्रिया स्रोत " "कोड यहाँ उपलब्ध है :" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "स्थान खोजें" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "फाइल नहीं मिली" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "फाइल खोज विफल। क्या आप स्वयं फोल्डर में खोजना चाहते हैं?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "बैकग्राउंड कार्य की प्रगति प्रदर्शित करें" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "संग्रह में खोजें" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "खोज मेन्यू बटन" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "खोज साधन खोलें" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "विकल्प" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "विकल्प मेन्यू बटन" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "विकल्प मेन्यू खोलें" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "ठीक है" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "कुछ फाइलों का आयात विफल" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "इसके कई कारण संभव हैं :\n" "- असमर्थित ऑडियो प्रारूप\n" "- फोल्डर पथ या फाइल नाम में यूटीएफ-8 अक्षर न होना\n" "- अमान्य ऑडियो फाइल\n" "- विकृत फाइल" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "हालिया" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "लेखक सूची" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "लेखक" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "वाचक सूची" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "वाचक" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "पुस्तक सूची" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "लेखक या वाचक दृश्य उपयोग कर अपने संग्रह में मौजूद पुस्तकें देखें।" #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" "प्रक्रिया जारी रखें तब तक Cozy द्वारा पुस्तक संग्रह तैयार करना जारी है..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "आपकी ऑडियो पुस्तकें आयात करें" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy स्वतः ही आपकी ऑडियो पुस्तकों को एक डायरेक्टरी यानि संग्रह में आयात कर " "देता है" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "माउस द्वारा ड्रैग" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "माउस द्वारा ऑडियो पुस्तकें Cozy में ड्रैग करें और वे स्वयं ही आयात हो जाएँगी" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "डायरेक्टरी, नेटवर्क ड्राइव या बाह्य ड्राइव से लोकल ऑडियो पुस्तकें लोड करें।" #: data/ui/main_window.ui:417 msgid "Select" msgstr "चुनें" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "पुनः आरंभ" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "पुनः आरंभ बटन" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "वाचक पुनः आरंभ करें" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "वाचक आरंभ करें" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "आरंभ/रोकने हेतु बटन" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "वाचक आरंभ करें व रोकें" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "आगे" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "आगे करने हेतु बटन" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "वाचक आगे करें" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "वर्तमान में चालू" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "पुस्तक शीर्षक" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "वर्तमान में चालू पुस्तक का शीर्षक" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "खंड नाम" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "वर्तमान खंड का शीर्षक" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "प्रयुक्त समय" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "प्रयुक्त समय" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "वर्तमान खंड हेतु प्रयुक्त समय" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "वर्तमान अध्याय में स्थिति देखें" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "स्थिति परिवर्तन" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "वर्तमान खंड स्थिति, सेकंड में" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "शेष समय" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "शेष समय" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "वर्तमान खंड हेतु शेष समय" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "ध्वनि नियंत्रण" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "वाचक गति" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "निद्रा टाइमर" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "टाइमर मेन्यू बटन" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "निद्रा टाइमर साधन खोलें" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "पुस्तक खोलें" #: data/ui/preferences.ui:55 msgid "General" msgstr "सामान्य" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "स्वरूप" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "उपनाम" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "लेखक व वाचक के अनुचित नाम प्रदर्शित होने पर इसे सक्रिय करें" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "वाचन" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Cozy आरंभ होने पर वर्तमान पुस्तक को 30 सेकंड पूर्व से पुनः आरंभ करें" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "निद्रा टाइमर" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "संचय" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "पुस्तक कवर" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "उपलब्ध होने पर सदैव चित्र (cover.jpg, *.png, ...) उपयोग करें" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "संचय स्थान" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "स्थान जोड़ें" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "स्थान हटाएँ" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "यह संचय स्थान बाह्य/आंतरिक सेट करें।" #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "नवीन ऑडियो पुस्तकों हेतु डिफ़ॉल्ट संचय स्थान के रूप में सेट करें" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "डिफ़ॉल्ट के रूप में सेट करें" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "प्रतिक्रिया" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "उपयोक्ता प्रतिक्रिया" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "खोज" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "खोज पट्टी" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "अपने ऑडियो पुस्तक संग्रह में खोजें" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "आप कौन सी पुस्तक खोज रहे हैं?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "पुस्तक" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "खंड" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "कोई परिणाम नहीं :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "टाइमर अवधि" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "टाइमर अवधि परिवर्तन" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "निद्रा टाइमर हेतु अवधि मिनट में सेट करें" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "वर्तमान अध्याय के उपरांत रोकें" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "सिस्टम ऊर्जा नियंत्रण सक्रिय करें" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "टाइमर समापन उपरांत कार्य।\n" "\"बंद करें\" यानी कंप्यूटर बंद करना (अन्य नाम - ऊर्चा बंद करना)\n" "\"सुप्त करें\" यानी कंप्यूटर सुप्त करना (अन्य नाम - स्थगित करना)।" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "सिस्टम ऊर्जा कार्य\n" "जो निष्पादित होगा" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "सुप्त करें" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "बंद करें" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "संग्रह स्कैन करें (_S)" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "अनुपलब्ध पुस्तकें अदृश्य करें (_H)" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "सेटिंग्स (_P)" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "सहायता (_H)" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "बारे में (_A)" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "बंद करें (_Q)" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "स्वागत है!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "अपनी ऑडियो पुस्तकों जोड़ें व Cozy के उपयोग का आनंद लें।" #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "नया क्या है?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "जारी रखें" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Cozy में नया क्या है?" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "पूर्णतया नवीन रचित व श्रेष्ठतर विश्वसनीय मीडिया आयात साधन।" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "क्या ऑडियो पुस्तकों का आयात विफल रहा? इच्छित फाइलें माउस द्वारा Cozy में " "ड्रैग करें या शीर्षक पट्टी की अनुप्रयोग मेन्यू से ऑडियो पुस्तक डायरेक्टरी " "पुनः स्कैन करें।" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "वर्तमान में समर्थित मीडिया फाइल प्रारूप mp3, m4a, flac, ogg, opus व wav हैं।" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "आगामी अपडेट में और भी सम्मिलित होंगे।" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "संग्रह प्रबंधन हेतु अहम परिवर्तन" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "पूर्व संस्करणों में स्कैन के उपरांत आपके संग्रह में आयात की गई प्रत्येक " "अनुपलब्ध फाइल को हटा दिया जाता था।" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "अब ऑडियो पुस्तकें आपके संग्रह से स्वतः नहीं हटेंगी। इस सुधार से लाभ यह होगा " "कि ऑडियो पुस्तक की फाइल अस्थायी रूप से अनुपलब्ध होने की स्थिति में पुस्तक " "प्रगति प्रभावित नहीं होगी।" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "संग्रह से ऑडियो पुस्तक हटाने हेतु इच्छित पुस्तक पर दायाँ-क्लिक कर संग्रह से " "हटाएँ का विकल्प चुनें।" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "m4b ऑडियो पुस्तकों हेतु सामान्य समर्थन।" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "बहुचर्चित विशेषता : m4b ऑडियो पुस्तक समर्थन! इस संस्करण में m4b फाइलों हेतु " "अध्याय रहित सामान्य समर्थन सम्मिलित है।" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "m4b फाइलें माउस द्वारा Cozy में ड्रैग करें या शीर्षक पट्टी की अनुप्रयोग " "मेन्यू से ऑडियो पुस्तक डायरेक्टरी पुनः स्कैन करें।" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "अध्याय समर्थन भावी अपडेट में सम्मिलित होगा। परियोजना से जुड़े रहें!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "m4b ऑडियो पुस्तकों हेतु अध्याय समर्थन।" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Cozy के इस संस्करण में m4b ऑडियो पुस्तकों हेतु अध्याय समर्थन सम्मिलित है।" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "यदि आपने पहले से ही m4b फाइलें आयात कर ली हैं, तो अनुप्रयोग मेन्यू से अपने " "पुस्तक संग्रह का स्कैन आरंभ करें।" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "इसके उपरांत अध्यायों की पहचान सफल होगी।" cozy-1.3.0/po/hr.po000066400000000000000000000633121457036466300141110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Milo Ivir , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Milo Ivir , 2022\n" "Language-Team: Croatian (https://www.transifex.com/geigi/teams/78138/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\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" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audio knjige" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Kopiranje" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Nije moguće kopirati: mapa s audio knjigama dozvoljava samo čitanje" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Nije moguće kopirati: disk je pun" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Nije moguće kopirati: dozvola je odbijena" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Greška tijekom uvoza novih datoteka" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Poglavlje" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} sat" msgstr[1] "{hours} sata" msgstr[2] "{hours} sati" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuta" msgstr[1] "{minutes} minute" msgstr[2] "{minutes} minuta" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekunda" msgstr[1] "{seconds} sekunde" msgstr[2] "{seconds} sekundi" #: cozy/tools.py:102 msgid "finished" msgstr "završeno" #: cozy/tools.py:126 msgid "never" msgstr "nikada" #: cozy/tools.py:128 msgid "today" msgstr "danas" #: cozy/tools.py:130 msgid "yesterday" msgstr "jučer" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "prije %s dana" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "prije {weeks} tjedan" msgstr[1] "prije {weeks} tjedna" msgstr[2] "prije {weeks} tjedana" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "prije {months} mjesec" msgstr[1] "prije {months} mjeseca" msgstr[2] "prije {months} mjeseci" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "prije {years} godine" msgstr[1] "prije {years} godine" msgstr[2] "prije {years} godina" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Preuzeto" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Preuzmi" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Pokreni ovaj dio" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disk" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Sve datoteke" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Postavi mapu audio knjiga" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} je odspojeno." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Označi kao pročitano" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Otvori u pregledniku datoteka" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Ukloni iz zbirke" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Deaktivirano" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Osnovno izvještavanje o greškama" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Detaljno izvještavanje o greškama" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Detaljno izvještavanje o greškama s greškama uvoza" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Bez izvještavanja o greškama ili rušenju." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "U slučaju greške ili rušenja poslat će se sljedeći podaci:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Vrsta greške" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Redak koda gdje se greška dogodila" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Cozy verzija" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linux distribucija" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Radno okruženje" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Vrsta medijskih datoteka koje Cozy nije mogao uvesti" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Sve" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Prikaži sve knjige" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Skoči na autora " #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Skoči na čitača " #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Pokreni ovu knjigu" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Isključeno" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Eksterna memorija" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Interna memorija" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Aktulaiziranje zbirke audio knjiga" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Kopiranje novih datoteka …" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Mijenjanje mjesta audio knjiga …" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Pokreni" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Preostalo" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Ukupno" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Zadnja reprodukcija" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Izdano" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Neke datoteke ili nijedna datoteka ove knjige se ne mogu pronaći." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "nedostupno" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Učitavaju se poglavlja. Pričekaj …" #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Otvori pregled knjiga" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Zatvori Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Dobij pomoć na GitHubu" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Dogodila se greška tijekom aktualiziranja baze podataka" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Tijekom aktualiziranja baze podataka došlo je do greške i Cozy se neće moći pokrenuti.\n" "Sigurnosna kopija baze podataka stvorena je prije aktualiziranja i sada je obnovljena.\n" "Dok se ovaj problem ne riješi, koristi Cozy verziju 0.9.5.\n" "Ako možeš, pomogni riješiti ovaj problem na GitHubu." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Odustani" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Izbriši audio knjigu" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Stvarno želiš izbrisati odabrane audio knjige?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Audio knjiga će se ukloniti s diska i iz Cozy zbirke." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Povratne informacije korisnika" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "Pomogni poboljšati Cozy prijavljivanjem grešaka i rušenja. " #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Slanje ovih podataka nije obavezno i potpuno je anonimno. Nikad nećemo " "prikupljati osobne podatke, uvezene datoteke niti bilo koje podatke koji bi " "mogli identificirati korisnika." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cosy je program otvorenog koda, a izvorni kod povratnih informacija " "korisnika mogu se pregledati ovdje: " #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Pronađi" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Datoteka nije pronađena" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Nije bilo moguće pronaći ovu datoteku. Želiš li je ručno pronaći?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Prikaži napredak zadataka koji se odvijaju u pozadini" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Pretraži tvoju zbirku" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Gumb za pretragu" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Otvori skočni prozor pretrage" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opcije" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Gumb za opcije" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Otvori skočni prozor opcija" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "U redu" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Neke datoteke nije bilo moguće uvesti" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Mogući razlozi su:\n" "- audio format nije podržan\n" "- putanja ili ime datoteke sadrži znakove koji nisu utf-8\n" "- datoteke nisu ispravne audio datoteke\n" "- datoteke su oštećene" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Nedavni" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Popis autora" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Popis čitača" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Čitač" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Popis knjiga" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Počni istraživati svoju zbirku prebacivanjem na prikaz autora ili čitača." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Pričekaj dok Cozy priprema tvoju zbirku …" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Uvezi svoje audio knjige" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "Cozy automatski uvozi tvoje audio knjige u jednu mapu – tvoju zbirku" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Povuci-i-ispusti" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Povuci audio knjige u Cozy i one će se automatski uvesti" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "Učitaj audio knjige iz mape, mrežne memorije ili eksternog diska" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Odaberi" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Natrag" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Gumb za natrag" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Skoči natrag" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Pokreni reprodukciju" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Gumb za Pokreni/Zaustavi" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Pokreni ili zaustavi reprodukciju" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Naprijed" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Gumb za naprijed" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Skoči naprijed" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Trenutačno se reproducira" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Naslov knjige" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Naslov trenutačno reproducirane knjige" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Naslov dijela" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Naslov trenutačno reproduciranog dijela" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Proteklo vrijeme" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Proteklo vrijeme" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Proteklo vrijeme trenutačnog dijela" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Skoči na mjesto trenutačnog poglavlja" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Klizač položaja" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Mjesto trenutačnog dijela u sekundama" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Preostalo vrijeme" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Preostalo vrijeme" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Preostalo vrijeme trenutačnog dijela" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Upravljanje glasnoćom" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Brzina reprodukcije" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Odbrojavanje do mirovanja" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Gumb za odbrojavanje" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Otvori skočni prozor odbrojavanja" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Otvori knjigu" #: data/ui/preferences.ui:55 msgid "General" msgstr "Opće" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Izgled" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Oznake" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktiviraj ako su autor i čitatelj prikazani na pogrešan način" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Reprodukcija" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Premotaj trenutačnu knjigu 30 sekundi unatrag kad pokreneš Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Odbrojavanje mirovanja" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Spremište" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Ilustracija" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Uvijek koristi slike (cover.jpg, *.png, …) kad su dostupne" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Mjesta spremišta" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Dodaj mjesto" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Ukloni mjesto" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Promijeni ovo mjesto spremišta na interno/vanjsko." #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "Postavi kao standardno mjesto spremišta za nove audio knjige" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Postavi kao standard" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Povratne informacije" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Korisniöke povratne informacije" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Traži" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Polje pretrage" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Pretraži tvoju zbirku audio knjiga" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Koju knjigu tražiš?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Knjiga" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Dio" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Ništa nije pronađeno :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Vrijeme odbrojavanja" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Regler za vrijeme odbrojavanja" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Postavi vrijeme odbrojavanja u minutama" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Prekini nakon trenutačnog poglavlja" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Aktiviraj postavljanje stanja sustava" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Vrsta radnje kad odbrojavanje završi.\n" "„Isključi” će pokušati isključiti sustav\n" "„Mirovanje” će pokušati postaviti sustav u stanje mirovanja." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "Postavljanje stanja sustava" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "mirovanje" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "isključi" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Pretraži zbirku" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Sakrij nedostupne knjige" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "P_ostavke" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "Po_moć" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Informacije" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Zatvori program" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Pozdrav!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Dodaj svoje audio knjige i raskomoti se." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Što je novo?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Nastavi" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Cozy novosti" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "Potpuno reprogramiran i pouzdaniji uvoz medija." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Neke audio datoteke nije bilo moguće uvesti? Povuci i ispusti te datoteke na" " Cozy ili koristi izbornik programa u traci naslova za ponovno pretraživanje" " mapa audio knjiga!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Trenutačno podržane medijske datoteke su mp3, m4a, flac, ogg, opus i wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Više u kasnijem izdanju." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Važna promjena u upravljanju zbirkama" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "U prethodnim verzijama se je svaka uvezena datoteka koja se više nije mogla " "pronaći, uklonila iz zbirke tijekom pretraživanja." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Audio knjige se sada više ne uklanjaju automatski iz zbirke. Time se " "sprečava slučajno gubljenje napretka audio knjige kad se datoteka privremeno" " ne može pronaći." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Za uklanjanje audio knjige iz zbirke, pritisni knjigu desnom tipkom miša i " "odaberi opciju „Ukloni iz zbirke”." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Osnovna podrška za audio knjige u m4b formatu." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Mnogi korisnici su na ovo čekali: Podrška za audio knjige u m4b formatu! Ova" " verzija sadrži osnovnu podršku za datoteke u m4b formatu, bez podrške za " "poglavlja." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Povuci i ispusti m4b datoteke na Cozy ili koristi izbornik programa u traci " "naslova za ponovno pretraživanje mapa audio knjiga." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "Podrška za poglavlja uslijedit će u kasnijem izdanju. Ostani u toku!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Podrška za audio knjige u m4b formatu." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Ova Cozy verzija uvodi podršku za poglavlja za audio knjige u m4b formatu!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Ako već imaš m4b datoteke, pokreni pretraživanje zbirke u izborniku " "programa." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Poglavlja će se onda otkriti." cozy-1.3.0/po/hu.po000066400000000000000000000455311457036466300141170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Benedek Dévényi, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Benedek Dévényi, 2024\n" "Language-Team: Hungarian (https://app.transifex.com/geigi/teams/78138/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "Hangoskönyvek" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Másolás" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "Nem lehet másolni: A hangoskönyv mappa csak olvasható" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "Nem lehet másolni: A lemez megtelt" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "Nem lehet másolni: Engedély megtagadva" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Az új fájlok importálása során hiba történt" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} óra" msgstr[1] "{hours} óra" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} perc" msgstr[1] "{minutes} perc" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} másodperc" msgstr[1] "{seconds} másodperc" #: cozy/tools.py:102 msgid "finished" msgstr "kiolvasva" #: cozy/tools.py:126 msgid "never" msgstr "soha" #: cozy/tools.py:128 msgid "today" msgstr "ma" #: cozy/tools.py:130 msgid "yesterday" msgstr "tegnap" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s napja" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} hete" msgstr[1] "{weeks} hete" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} hónapja" msgstr[1] "{months} hónapja" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} éve" msgstr[1] "{years} éve" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "Letöltve" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "Letöltés" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "Az adatbázis frissítése nem sikerült" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "Cozy bezárása" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "Segítség a GitHubon" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "Törlöd ezt a hangoskönyvet?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "A hangoskönyv el lesz távolítva a könvtáradból, és a lemezről is." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "Mégse" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "Hangoskönyv törlése" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "Lemez" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "Fájl nem található" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Ez a fájl nem található. Szeretnéd megkeresni?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "Megkeresés" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "Hiányzó fájl keresése" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "{ext} fájlok" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "Hangfájlok" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "Ennek több oka lehet:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "A formátum nem támogatott" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "Az elérési út vagy fájlnév tartalmaz nem UTF-8 karaktereket" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "A fájl nem érvényes hangfájl" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "A fájl sérült" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "Egyes fájlokat nem sikerült importálni" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "Ok" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "Patreon támogatók:" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "m4b fejezetek kivitelezése a Mutagenben:" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "Nyílt forráskódú projektek:" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "Dévényi Benedek" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "Megjelölés olvasottként" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "Fájl helyének megnyitása" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "Eltávolítás a könyvtárból" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "Lejátszás" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "Kikapcsolva" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "Alap hibajelentés" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "Részletes hibajelentés" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "Részletes hibajelentés importálási hibákkal" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "Nincs hiba- vagy összeomlásjelentés." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Hiba vagy összeomlás esetén a következő információk kerülnek beküldésre:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "Milyen hiba történt" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "A forráskód azon sorának száma, ahol a hiba történt" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "A Cozy verziója" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "Linux-disztribúció" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "Asztali környezet" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "A Cozy által nem importálni nem tudott fájlok típusa" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Mind" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Összes könyv megjelenítése" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "Ugrás ide: {artist_name}" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "perc" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "Kikapcsolva" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "Hangoskönyvmappa megadása" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "Külső meghajtó" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "Belső meghajtó" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "A hangoskönyvtár frissítése" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "Új fájlok másolása…" #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "Hangoskönyvek helyének megváltoztatása…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "Lejátszás" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Hátravan" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "Összesen" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Legutóbb" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "Published" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "A könyv egyes fájljai nem találhatók." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "Nem elérhető" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "Fejezetek betöltése…" #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "Könyv áttekintésének megnyitása" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "Ugrás erre a fejezetre" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "Visszajelzés" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Segíthetsz a Cozy javításában azzal, hogy hibák és összeomlások esetén " "információkat küldesz be." #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Ezen információk megadása nem kötelező és teljesen anonim. Soha nem gyűjtünk" " személyes adatokat, importált fájlokat vagy bármilyen olyan információt, " "amely alapján beazonosítható lennél." #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "A Cozyt nyilvánosan fejlesztjük, és a visszajelzésekért felelős kód " "megtekinthető itt: " #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "Forráskód " "a GitHubon" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "Mappa kiválasztása" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "Szűrő megnyitása" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "Alkalmazásmenü megnyitása" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "Open the options popover" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "Keresés a könyvtárban" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "Keresés megnyitása" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "Háttérfeladatok haladásának megjelenítése" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "Kezdj gépelni…" #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "Könyvtár _frissítése" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "Nem elérhető könyvek _elrejtése" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "_Beállítások" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "A Cozy _névjegye" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "_Kilépés" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "Ejts fájlokat ide a könyvtáradhoz való hozzáadáshoz" #: data/ui/main_window.ui:48 msgid "Library" msgstr "Könyvtár" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "Korábbi" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "Szerző" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Szerzők listája" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "Előadó" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Előadók listája" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "Könyvek listája" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "Még nincsenek korábbi könyvek" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "Fedezd fel hangoskönyvtáradat a Szerző vagy az Előadó nézetre váltva" #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "Most szól" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "A lejátszásban levő könyv címe" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "A lejátszásban levő fejezet címe" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "Ugrás vissza" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "Lejátszás visszatekerése" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "Jejátszás indítása" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "Jejátszás indítása vagy szüneteltetése" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "Ugrás előre" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "Lejátszás előretekerése" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "Hangerő" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "Jejátszási sebesség" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "Alvásidőzítő" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "Az alvásidőzítő megnyitása" #: data/ui/preferences.ui:27 msgid "General" msgstr "Általános" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Megjelenés" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "Sötét téma" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "Címkék" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "Szerző és előadó megcserélése" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktiváld, ha a szerző és az olvasó fordítva jelennek meg" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "Lejátszás" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "Visszajátszás" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Visszatekerés 30 másodperccel a Cozy indításakor" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "Visszaugrás időtartama" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "Előreugrás időtartama" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Elhalkulás" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "Elhalkulás időtartama" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "Tárhely" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Borítókép" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "Külső képek előnyben részesítése a beágyazott borítóval szemben" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "" "Mindig használjon borítóképeket (cover.jpg, *.png, ...), ha rendelkezésre " "állnak" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "Visszajelzés" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "Keresés a könyvtárban" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "Nincs eredmény" #: data/ui/search_page.ui:33 msgid "Book" msgstr "Könyv" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "Eltelt idő" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "A jelenlegi fejezet eltelt ideje" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "Ugrás a jelenlegi fejezetben" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "Az jelenlegi fejezet pozíciója másodpercben" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "Hátralevő idő" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "A jelenlegi fejezetből hátralevő idő" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "Tárhelyek" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "Beállítás alapértelmezettként" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "Eltávolítás" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Az időzítő hossza" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Az alvásidőzítő időtartamának beállítása percben" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Megállás az jelenlegi fejezet után" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "A rendszer kikapcsolása" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "A lejátszás végén végrehejtandó művelet.\n" "a „leállítás” megkísérli kikapcsolni a rendszert\n" "a „felfüggesztés” megkísérli alvó állapotba tenni a rendszert." #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "Kikapcsolási művelet" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "felfüggesztés" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "leállítás" cozy-1.3.0/po/it.po000066400000000000000000000641471457036466300141230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2021 # albanobattistella , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: albanobattistella , 2022\n" "Language-Team: Italian (https://www.transifex.com/geigi/teams/78138/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audiolibri" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Copia in corso" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Impossibile copiare: la directory degli audiolibri è di sola lettura" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Impossibile copiare: il disco è pieno" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Impossibile copiare: autorizzazione negata" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Errore durante l'importazione di nuovi file" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Capitolo" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} ore" msgstr[1] "{hours} ore" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuti" msgstr[1] "{minutes} minuti" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} secondi" msgstr[1] "{seconds} secondi" #: cozy/tools.py:102 msgid "finished" msgstr "finito" #: cozy/tools.py:126 msgid "never" msgstr "mai" #: cozy/tools.py:128 msgid "today" msgstr "oggi" #: cozy/tools.py:130 msgid "yesterday" msgstr "ieri" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s giorni fa" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} settimane fa" msgstr[1] "{weeks} settimane fa" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} mesi fa" msgstr[1] "{months} mesi fa" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} anni fa" msgstr[1] "{years} anni fa" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Scaricati" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Scarica" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Riproduci questa traccia" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "DIsc" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Tutti i file" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Imposta la cartella degli audiolibri" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} è offline." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Segna come letto" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Apri nell'esploratore file" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Rimuovi dalla biblioteca" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Disabilitato" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Segnalazione di errori di base" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Segnalazione dettagliata degli errori" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Segnalazione dettagliata degli errori con errori di importazione" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Nessun errore o segnalazione di crash." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "Le seguenti informazioni verranno inviate in caso di errore o crash:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Quale tipo di errore si è verificato" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Riga di codice in cui si è verificato un errore" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versione di Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribuzione Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Ambiente desktop" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tipo di file multimediale che Cozy non ha potuto importare" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Tutti" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Mostra tutti i libri" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Vai all'autore" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Vai al lettore" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Riproduci questo libro" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Off" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Disco esterno" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Disco interno" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Aggiorna raccolta di audiolibri " #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Copia di nuovi file..." #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Cambiando la posizione dell'audiolibro…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Avvia" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Rimanente" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Totale" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Ultimo riprodotto" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Pubblicato" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Impossibile trovare alcuni o tutti i file di questo libro." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "non disponibile" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Caricamento capitoli, attendere prego..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Apri i dettagli del libro" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Chiudi Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Ricevi aiuto su GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Si è verificato un errore durante l'aggiornamento del database" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Durante un aggiornamento del database si è verificato un errore e Cosy non sarà in grado di avviarsi.\n" "Un backup del database è stato creato prima dell'aggiornamento ed è stato ripristinato ora.\n" "Fino a quando questo problema non viene risolto, utilizzare la versione 0.9.5 di Cozy.\n" "Puoi aiutare a risolvere questo problema segnalando un problema su GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Annulla" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Elimina Audiolibro" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Sei sicuro di voler eliminare l'audiolibro selezionato?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "L'audiolibro verrà rimosso dal tuo disco e dalla libreria di Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Feedback degli utenti" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Puoi contribuire a migliorare Cozy fornendo informazioni in caso di errori e" " arresti anomali." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Il conferimento di queste informazioni è facoltativo e completamente " "anonimo. Non raccoglieremo mai dati personali, file importati o informazioni" " che potrebbero identificarti." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy è open source e il codice sorgente e feedback degli utenti può essere " "controllato qui:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Individua" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "File non trovato" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Questo file non può essere trovato. Vuoi cercarlo manualmente?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Visualizza l'avanzamento dell'attività in background" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Cerca nella tua libreria" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Pulsante del menu ricerca" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Apri la finestra di ricerca" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opzioni" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Pulsante del menu opzioni" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Apri la finestra delle opzioni" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Alcuni file non possono essere importati" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Ciò può avere diversi motivi:\n" "- Il formato audio non è supportato\n" "- Il percorso o il nome file contiene caratteri non utf-8\n" "- I file non sono file audio validi\n" "- I file sono corrotti" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Recente" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Elenco degli autori" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autore" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Elenco dei lettori" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lettore" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Elenco dei libri" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Inizia a esplorare la tua libreria passando alla visualizzazione Autore o " "Lettore." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Resta sintonizzato mentre Cosy prepara la tua libreria..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importa i tuoi audiolibri" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importa automaticamente i tuoi audiolibri in una cartella - la tua " "libreria" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Drag & Drop" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Trascina i tuoi audiolibri su cozy per importarli automaticamente" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Carica audiolibri da una directory, un'unità di rete o un disco esterno" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Seleziona" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Riavvolgi" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Pulsante Riavvolgi" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Riavvolgi la riproduzione" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Inizia a riprodurre" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Pulsante Play/Pausa" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Inizia o metti in pausa la riproduzione" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Avanti" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Pulsante Avanti" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Riproduzione in Avanti" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "In esecuzione" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Titolo del libro" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Titolo del libro in esecuzione" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nome della traccia" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Titolo della traccia in esecuzione" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Tempo trascorso" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tempo trascorso" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Tempo trascorso della traccia attuale" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Passa alla posizione nel capitolo corrente" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Cursore della posizione" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posizione della traccia attuale in secondi" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tempo rimanente" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tempo rimanente" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Tempo rimanente della traccia attuale" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Controlla il volume" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Velocità di riproduzione" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Timer" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Pulsante del menu timer" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Apri la finestra del timer" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Apri libro" #: data/ui/preferences.ui:55 msgid "General" msgstr "Generali" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Aspetto" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "tag" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Attiva se autore e lettore vengono visualizzati nel modo sbagliato" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Riproduzione" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Riavvolgi 30 secondi del libro corrente all'avvio di Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Timer di spegnimento" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Archiviazione" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Copertina" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Usa sempre le immagini (cover.jpg, *.png, …) quando disponibili" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Posizioni di archiviazione" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Aggiungi una posizione" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Rimuovi una posizione" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Cambia questa posizione di archiviazione come interna o esterna" #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "" "Imposta come posizione di archiviazione predefinita per i nuovi audiolibri" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Imposta come predefinito" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Feedback" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Feedback dell'utente" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Cerca" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Casella di ricerca" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Cerca nella tua libreria degli audiolibri" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Quale libro stai cercando?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Libro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Traccia" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Non trovato :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Durata del timer" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Cursore del timer" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Imposta la durata del timer in minuti" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Ferma dopo il capitolo corrente" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Abilita il controllo dell'alimentazione del sistema" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tipo di azione al termine del timer.\n" "\"spegnimento\" tenterà di spegnere il sistema (noto anche come power off)\n" "\"suspendi\" tenterà di sospendere il tuo sistema (noto anche come sleep)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Azione di alimentazione del sistema\n" "da eseguire" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "sospendere" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "Spegnere" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Scansiona Libreria" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Nascondi libri non disponibili" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferenze" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Aiuto" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Info su" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Esci" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Benvenuto!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Aggiungi i tuoi audiolibri e mettiamoci comodi." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Cosa c'è di nuovo?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Continua" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Cosa c'è di nuovo in Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Un importatore multimediale completamente riscritto e molto più affidabile." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Hai riscontrato file audio che non possono essere importati? Trascina e " "rilascia quei file su Cozy o usa il menu dell'applicazione nella barra del " "titolo per ripetere la scansione delle directory degli audiolibri!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "I file multimediali supportati attualmente sono mp3, m4a, flac, ogg, opus e " "wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Più a venire in un aggiornamento successivo." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Un cambiamento importante nella gestione della libreria" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "In precedenza, ogni file importato nella libreria ma che non è stato più " "trovato è stato rimosso dalla libreria durante una scansione." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Ora gli audiolibri non vengono più rimossi automaticamente dalla libreria. " "Ciò impedisce di perdere accidentalmente l'avanzamento di un audiolibro " "quando un file non può essere trovato temporaneamente." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Per rimuovere un audiolibro dalla libreria, fai clic con il pulsante destro " "del mouse su di esso e scegli l'opzione rimuovi dalla libreria." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Supporto di base per audiolibri m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Molti di voi lo stavano aspettando: supporto per audiolibri m4b! Questa " "versione offre il supporto di base per i file m4b senza supporto del " "capitolo." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Trascina e rilascia i tuoi file m4b su Cozy o usa il menu dell'applicazione " "nella barra del titolo per ripetere la scansione delle directory degli " "audiolibri." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "Il supporto del capitolo seguirà in un aggiornamento successivo. Rimanete " "sintonizzati!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Supporto dei capitoli per gli audiolibri m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Questa versione di Cozy offre il supporto dei capitoli per gli audiolibri " "m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Se hai già dei file m4b importati, dovrai avviare una scansione della tua " "libreria dal menu dell'app." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "I capitoli verranno quindi rilevati." cozy-1.3.0/po/meson.build000066400000000000000000000002361457036466300152760ustar00rootroot00000000000000i18n.gettext(meson.project_name(), args: [ '--directory=' + meson.current_source_dir(), '--from-code=UTF-8' ], preset: 'glib' ) subdir('extra')cozy-1.3.0/po/ms_MY.po000066400000000000000000000621701457036466300145250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # abuyop , 2021 # Julian Geywitz , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Julian Geywitz , 2021\n" "Language-Team: Malay (Malaysia) (https://www.transifex.com/geigi/teams/78138/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Menyalin" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Mati" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} jam" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minit" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} saat" #: cozy/tools.py:102 msgid "finished" msgstr "selesai" #: cozy/tools.py:126 msgid "never" msgstr "tidak sesekali" #: cozy/tools.py:128 msgid "today" msgstr "hari ini" #: cozy/tools.py:130 msgid "yesterday" msgstr "semalam" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s hari yang lalu" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} minggu yang lalu" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} bulan yang lalu" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} tahun yang lalu" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Buku audio" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Baca buku ini" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Dimuat Turun" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Muat Turun" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Buka gambaran keseluruhan buku" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Tanda sebagai dibaca" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Buka dalam pelayar fail" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Buang dari pustaka" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "Cakera" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Semua fail" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "Maklum Balas" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Baca bahagian ini" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} di luar talian." #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Dilumpuhkan" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Pelaporan ralat asas" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Pelaporan ralat terperinci" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "Pelaporan ralat terperinci dengan ralat-ralat import" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Tiada pelaporan ralat atau kerosakan." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Maklumat berikut akan dihantar sekiranya terdapat satu ralat atau kerosakan:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Jenis ralat yang berlaku" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Baris kod yang menyebabkan ralat berlaku" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versi Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribusi Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Persekitaran atas meja" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Jenis fail media yang gagal diimport oleh Cozy" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Semua" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Papar semua buku" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Lompat ke pengarang" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Lompat ke pembaca" #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Mengimport Buku Audio" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "Menyalin fail-fail baharu..." #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "Mengubah lokasi buku audio..." #: cozy/model/track.py:38 msgid "Chapter" msgstr "Bab" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Tidak dapat salin: Direktori buku audio adalah baca sahaja" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Tidak dapat salin: Cakera penuh" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Tidak dapat salin: Keizinan dinafikan" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Berbaki" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Jumlah" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Terakhir dimainkan" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Diterbitkan" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "Beberapa atau semua fail bagi buku ini tidak ditemui." #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "tidak tersedia" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "muka0" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "Maklum balas pengguna" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Anda boleh bantu menambah baik Cozy dengan menyumbang maklumat sekiranya " "berlaku ralat dan kerosakan." #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Penyumbangan maklumat ini adalah pilihan dan sepenuhnya awanama. Kami tidak " "sesekali mengutip data peribadi, fail atau apa jua maklumat yang diimport " "yang boleh menyebabkan identiti diri anda terdedah." #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy adalah bersumber terbuka dan kod sumber maklum balas pengguna boleh " "perolehi di sini:" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Batal" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Cari" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Fail tidak ditemui" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Fail ini tidak ditemui. Anda mahu cari ia secara manual?" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Sesetengah fail tidak dapat diimport" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Ia disebabkan oleh:\n" "- Format audio tidak disokong\n" "- Laluan atau nama fail mengandungi aksara bukan utf-8\n" "- Fail bukan fail audio yang sah\n" "- Fail telah rosak" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "Baru-baru Ini" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Senarai pengarang" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Pengarang" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Senarai pembaca" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Pembaca" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Senarai buku" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Tunggu sebentar ketika Cozy menyediakan pustaka anda..." #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" "Mula menjelajah pustaka anda dengan bertukar ke paparan Pengarang atau " "Pembaca di atas." #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Import Buku Audio anda" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy mengimport secara automatik buku audio anda ke dalam satu direktori - " "pustaka anda" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Import secara automatik buku audio ketika permulaan" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "Peralihan auto imbas" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "Seret & Lepas" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Seret buku audio anda ke dalam cozy dan ia akan diimport secara automatik" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Lokasi buku audio anda" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Tetapkan Direktori Buku Audio" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" "Muat buku audio dari sebuah direktori, pacu rangkaian atau cakera luar." #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "Anda boleh menambah lagi lokasi storan kemudian melalui tetapan" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Gelintar" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Kotak gelintar" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Gelintar pustaka buku audio anda" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Buku apakah yang mahu dicari?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Buku" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Bahagian" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Tiada apa-apa ditemui :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Am" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Mod Gelap" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "Palang Tajuk" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "Papar keseluruhan buku selain dari bab semasa" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "Penampilan" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "Tangguh sistem dengan pemasa" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "Main semula 30 saat" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "Imbas media secara automatik" #: data/ui/settings.ui:604 msgid "Tags" msgstr "Tag" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "SIlih pengarang dengan pembaca" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" "Aktifkan ini jika kedudukan pengarang dan pembaca dipapar secara salah" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "tukar tugasan pengarang dengan pembaca" #: data/ui/settings.ui:743 msgid "Playback" msgstr "Main balik" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "Tempoh mandir" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "Tempoh maju" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "Pemasa tidur" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "Resap Lenyap" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "Tempoh resap lenyap" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "Kelakuan" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "Kerja Seni" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "Utamakan imej luar berbanding kulit terbenam" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "Guna imej (cover.jpg, *.png, …) bila ada" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "Lokasi buku audio" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "Lokasi storan" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "Tambah lokasi" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "Buang lokasi" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "Togol lokasi storan ini sama ada dalaman/luaran." #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "Tetapkan sebagai lokasi storan lalai untuk buku audio baharu" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "Abai senarai" #: data/ui/settings.ui:1576 msgid "Path" msgstr "Laluan" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "Ikut pautan simbolik" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "Storan" #: data/ui/settings.ui:1715 msgid "Database" msgstr "Pangkalan Data" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "Paksa segar semula pangkalan data" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "Tindakan ini akan memaksa kemas kini metadata bagi semua buku import" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "Paksa segar semula" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "Lanjutan" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Tempoh pemasa" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Pelungsur tempoh pemasa" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Tetapkan tempoh pemasa tidur dalam minit" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Henti selepas bab semasa" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Dayakan kawalan kuasa sistem" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Jenis tindakan ketika pemasa selesai.\n" "\"matikan\" akan cuba mematikan sistem anda (juga dikenali sebagai matikan kuasa)\n" "\"tangguh\" akan cuba menangguh sistem anda (juga dikenali sebagai tidur)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Tindakan kuasa sistem\n" "yang mahu dilakukan" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "tangguh" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "matikan" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Imbas Pustaka" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Sembunyi buku-buku yang tiada" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Keutamaan" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Bantuan" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Perihal" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Keluar" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "Yang terbaharu?" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "Teruskan" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "Yang terbaharu dalam Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Sepenuhnya ditulis semula dengan pengimport media yang lebih dipercayai." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Adakah anda mengalami situasi fail-fail audio gagal diimport? Seret dan " "Lepas fail-fail tersebut ke dalam Cozy atau guna menu aplikasi dalam palang " "tajuk untuk mengimbas semula direktori-direktori buku audio anda!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Fail-fail media yang kini disokong adalah mp3, m4a, flac, ogg, opus dan wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Ada banyak lagi dalam kemas kini akan datang." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Sokongan asas untuk buku audio m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Ramai yang menunggu fitur ini: Sokongan buku audio m4b! Versi ini " "memfiturkan sokongan asas untuk fail-fail m4b tanpa sokongan bab." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Seret dan Lepas fail-fail m4b anda ke dalam Cozy atau guna menu aplikasi " "dalam palang tajuk untuk mengimbas semula direktori-direktori buku audio." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "Sokongan bab akan ada dalam kemas kini akan datang. Harap bersabar!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Sokongan bab untuk buku audio m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Versi Cozy ini memfiturkan sokongan bab untuk buku audio m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Jika anda sudah mengimport fail-fail m4b hanya perlu mula mengimbas pustaka " "anda melalui menu apl." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Bab kemudiannya akan dikesan." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Satu perubahan penting dalam pengurusan pustaka" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Sebelum ini setiap fail yang diimport ke dalam pustaka anda tetapi gagal " "ditemui kerana telah dibuang daripada pustaka ketika pengimbasan berlaku." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Kini buku audio tidak dibuang daripada pustaka anda secara automatik. " "Tindakan ini dapat menghalang kehilangan kemajuan buku audio secara tidak " "sengaja ketika sebuah fail tidak ditemui buat sementara." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Untuk membuang satu buku audio daripada pustaka hanya klik-kanan pada buku " "itu dan klik pilihan buang daripada pustaka." #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Masa berlalu" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Masa berlalu" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Masa berlalu bagi bahagian semasa" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Lompat ke kedudukan dalam bab semasa" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Pelungsur kedudukan" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Kedudukan bahagian semasa dalam saat" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Masa berbaki" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Masa berbaki" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Masa berbaki bagi bahagian semasa" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "Mandir" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "Butang mandir" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "Main balik mandir" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "Mula main balik" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "Butang Main/Jeda" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "Mula atau jeda main balik" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "Maju" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "Butang maju" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "Main balik maju" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "Amaran" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "Kini dimainkan" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "Tajuk Buku" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "Tajuk buku yang sedang dimainkan" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "Nama bahagian" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "Tajuk bahagian yang sedang dimainkan" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "Sedang berusaha..." #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "Kini dijalankan" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "Kawalan suara" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "Kelajuan main balik" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "Butang menu pemasa" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "Buka tetingkap timbul pemasa tidur" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Gelintar pustaka anda" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "Butang menu gelintar" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "Buka tetingkap timbul gelintar" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "Pilihan" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "Butang menu pilihan" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "Buka tetingkap menu pilihan" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Padam Buku Audio" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Anda pasti mahu memadam buku audio terpilih?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Buku audio akan dibuang daripada cakera dan pustaka Cozy anda." #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Tutup Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "Mendapatkan bantuan Github" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Satu ralat berlaku ketika mengemas kini pangkalan data" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Ketika kemas kini pangkalan data, satu ralat berlaku dan menyebabkan Cozy gagal dimulakan.\n" "Ada satu sandar pangkalan data telah dicipta sebelum kemas kini ini dan sekarang dipulihkan menggunakannya.\n" "Sehingga isu ini diselesaikan, sila guna versi Cozy 0.9.5.\n" "Anda boleh membantu kami dengan melaporkan isu ini di Github." cozy-1.3.0/po/nl.po000066400000000000000000000631701457036466300141130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2021 # Heimen Stoffels , 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Heimen Stoffels , 2022\n" "Language-Team: Dutch (https://www.transifex.com/geigi/teams/78138/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Luisterboeken" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Bezig met kopiëren…" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Het kopiëren is mislukt: de luisterboekmap is alleen-lezen" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Het kopiëren is mislukt: geen vrije ruimte meer op de schijf" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Het kopiëren is mislukt: de toegang is geweigerd" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Het importeren van nieuwe bestanden is mislukt" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Hoofdstuk" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} uur" msgstr[1] "{hours} uur" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuut" msgstr[1] "{minutes} minuten" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} seconde" msgstr[1] "{seconds} seconden" #: cozy/tools.py:102 msgid "finished" msgstr "afgerond" #: cozy/tools.py:126 msgid "never" msgstr "nooit" #: cozy/tools.py:128 msgid "today" msgstr "vandaag" #: cozy/tools.py:130 msgid "yesterday" msgstr "gisteren" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dagen geleden" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} week geleden" msgstr[1] "{weeks} weken geleden" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} maand geleden" msgstr[1] "{months} maanden geleden" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} jaar geleden" msgstr[1] "{years} jaar geleden" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Gedownload" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Downloaden" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Onderdeel beluisteren" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Schijf" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Alle bestanden" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Luisterboekmap instellen" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} is niet beschikbaar." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Markeren als gelezen" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Openen in bestandsbeheerder" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Verwijderen uit bibliotheek" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Uitgeschakeld" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Algemene foutmeldingsverslagen" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Uitgebreide foutmeldingsverslagen" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Uitgebreide foutmeldingsverslagen, inclusief importfouten" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Geen foutmeldings- of crashverslagen" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "" "De volgende informatie wordt verstuurd als er een fout of crash optreedt:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Welk soort probleem er optrad" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "De regel met code waar het probleem zich bevindt" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Cozy's versie" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linux-distributie" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Werkomgeving" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "De soorten bestanden die Cozy niet kon importeren" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Alles" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Alle boeken tonen" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Snel naar auteur" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Snel naar voorlezer" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Boek beluisteren" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min." #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Uit" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Externe schijf" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Interne schijf" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Bezig met herladen van verzameling…" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Bezig met kopiëren van nieuwe bestanden…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Bezig met wijzigen van luisterboeklocatie…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Beluisteren" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Resterend" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Totaal" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Laatst beluisterd" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Gepubliceerd" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Het boek, of enkele bestanden daarvan, is niet aangetroffen." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "niet beschikbaar" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Bezig met laden van hoofdstukken…" #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Boekoverzicht openen" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Cozy sluiten" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Vraag om hulp op Github" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Er is een fout opgetreden tijdens het bijwerken van de databank" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Er is een fout opgetreden tijdens het bijwerken van de databank, waardoor Cozy niet kan worden gestart.\n" "Er is een back-up gemaakt van de databankversie van vóór de update.\n" "Gebruik Cozy 0.9.5 totdat dit probleem is opgelost.\n" "Meld dit probleem om te helpen het op te lossen." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Annuleren" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Luisterboek verwijderen" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Weet je zeker dat je het geselecteerde luisterboek wilt verwijderen?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" "Het luisterboek wordt zowel uit je bibliotheek als van je schijf verwijderd." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Gebruikersfeedback" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Je kunt helpen Cozy te verbeteren door fout- en crashinformatie te " "versturen." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Het delen van deze informatie is optioneel en volledig anoniem. We " "verzamelen geen persoonlijke gegevens, bestanden die je importeert of andere" " informatie die naar jou te herleiden is." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy is open source en de code omtrent gebruikersfeedback is hier te vinden:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Zoeken" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Bestand niet aangetroffen" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Dit bestand is niet aangetroffen. Wil je er handmatig naar zoeken?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Voortgang van achtergrondtaak tonen" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Bibliotheek doorzoeken" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Zoek-menuknop" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Open het zoekpaneel" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opties" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Opties-menuknop" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Open het optiespaneel" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Oké" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Enkele bestanden kunnen niet worden geïmporteerd" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Hier kunnen meerdere oorzaken voor zijn:\n" "- De audio-indeling wordt niet ondersteund\n" "- De paden en/of bestandsnamen bevatten tekens die geen gebruikmaken van de utf-8-tekenset\n" "- Het zijn geen geldige audiobestanden\n" "- De bestanden zijn beschadigd" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Onlangs beluisterd" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lijst met auteurs" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Auteur" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lijst met voorlezers" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Voorlezer" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lijst met boeken" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Verken je bibliotheek door te kiezen voor de auteur- of voorleesweergave." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Bezig met voorbereiden van je bibliotheek…" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importeer je luisterboeken" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importeert je luisterboeken automatisch naar één map: je bibliotheek" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Slepen-en-neerzetten" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Sleep je luisterboeken naar Cozy om ze te importeren" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "Laad luisterboeken uit een map of van een externe of netwerkschijf." #: data/ui/main_window.ui:417 msgid "Select" msgstr "Kiezen" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Terugspoelen" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Terugspoelknop" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Terugspoelen" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Beluisteren" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Beluister-/Pauzeerknop" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Start of pauzeer het beluisteren" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Vooruitspoelen" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Vooruitspoelknop" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Vooruitspoelen" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Je luistert naar" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Boektitel" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "De titel van het boek waar je momenteel naar luistert" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Hoofdstuknaam" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "De titel van het hoofdstuk waar je momenteel naar luistert" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Verstreken tijd" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Verstreken tijd" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "De verstreken tijd van het huidige hoofdstuk" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Spoel door naar positie in huidige hoofdstuk" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Positiebalk" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Positie van het huidige hoofdstuk, in seconden" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Resterende tijd" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Resterende tijd" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "De resterende tijd van het huidige hoofdstuk" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Volumeregeling" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Voorleessnelheid" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Tijdklok" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Tijdklok-menuknop" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Open het tijdklokpaneel" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Boek openen" #: data/ui/preferences.ui:55 msgid "General" msgstr "Algemeen" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Uiterlijk" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Labels" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Schakel in als de auteur en voorlezer in de verkeerde volgorde staan" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Beluisteren" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Spoel 30 seconden terug na het starten van Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Tijdklok" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Opslag" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Omslag" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Gebruik afbeeldingen (cover.jpg, *.png, …) indien beschikbaar" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Opslaglocaties" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Locatie toevoegen" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Locatie verwijderen" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Opslaglocatie instellen als intern of extern" #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "Instellen als standaard opslaglocatie voor nieuwe luisterboeken" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Instellen als standaard" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Feedback" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Gebruikersfeedback" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Zoeken" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Zoekvak" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Bibliotheek doorzoeken" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Naar welk boek ben je op zoek?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Boek" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Deel" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Niks gevonden :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Tijdklokduur" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Tijdklokduur-schuifbalk" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "De tijdklokduur, in minuten" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Stoppen na huidige hoofdstuk" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Energiebeheer inschakelen" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "De uit te voeren actie na het verstrijken van de tijdklok.\n" "'Afsluiten' tracht de computer af te sluiten ('uitschakelen')\n" "'Pauzestand' tracht de computer in de pauzestand te zetten ('slaapstand')" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Uit te voeren\n" "actie:" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "Pauzestand" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "Afsluiten" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Zoeken naar nieuwe boeken" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "Niet-beschikbare boeken _verbergen" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Voorkeuren" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Hulp" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Over" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Afsluiten" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Welkom!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Voeg luisterboeken toe en leun achterover." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Wijzigingslog" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Doorgaan" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Wijzigingslog" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Het media-importgedeelte is volledig opnieuw ontworpen en daardoor " "betrouwbaarder." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Heb je wel eens meegemaakt dat audiobestanden niet konden worden " "geïmporteerd? Sleep ze naar het Cozy-venster of doorzoek je mappen opnieuw " "middels het menu!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Momenteel worden de volgende mediabestanden ondersteund: mp3, m4a, flac, " "ogg, opus en wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Binnenkort volgt ondersteuning voor meer formaten." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Een belangrijke verandering omtrent bibliotheekbeheer" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Voorheen werd elk geïmporteerd bestand dat niet was aangetroffen verwijderd " "tijdens het doorzoeken." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Voortaan worden luisterboeken niet meer verwijderd, wat voorkomt dat je de " "voortgang kwijtraakt als een bestand tijdelijk niet kan worden gevonden." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Een luisterboek kan worden verwijderd door er met de rechtermuisknop op te " "klikken en de verwijderoptie te kiezen." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Basisondersteuning voor m4b-luisterboeken." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Velen van jullie hebben er op gewacht: ondersteuning voor m4b-luisterboeken." " En nu is het zover: deze versie ondersteunt m4b-bestanden, maar zonder " "hoofdstukken." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Sleep je m4b-bestanden naar het Cozy-venster of doorzoek je mappen opnieuw " "middels het menu." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "Hoofdstukondersteuning volgt binnenkort. Nog even geduld!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Hoofdstukondersteuning in m4b-luisterboeken." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Deze versie van Cozy ondersteunt hoofdstukken in m4b-luisterboeken!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Als je al m4b-bestanden geïmporteerd hebt, dan moet je ze nogmaals " "importeren." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "De hoofdstukken worden dan gedetecteerd." cozy-1.3.0/po/no.po000066400000000000000000000520561457036466300141170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Marcus Myge , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Marcus Myge , 2021\n" "Language-Team: Norwegian (https://www.transifex.com/geigi/teams/78138/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Kopierer" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Av" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} time" msgstr[1] "{hours} timer" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minutt" msgstr[1] "{minutes} minutter" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekund" msgstr[1] "{seconds} sekunder" #: cozy/tools.py:102 msgid "finished" msgstr "ferdig" #: cozy/tools.py:126 msgid "never" msgstr "aldri" #: cozy/tools.py:128 msgid "today" msgstr "i dag" #: cozy/tools.py:130 msgid "yesterday" msgstr "i går" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dager siden" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeeks} uke siden" msgstr[1] "{weeks} uker siden" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} måned siden" msgstr[1] "{months} måneder siden" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} år siden" msgstr[1] "{years} år siden" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Lydbøker" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Spill av denne boken" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Lastet ned" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Last ned" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Åpne book oversikt" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Marker som lest" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Åpne i filutforsker" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Fjern fra bibliotek" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "Disk" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Alle filer" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "Tilbakemelding" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Spill av denne delen" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} er ikke tilgjengelig." #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Deaktivert" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Grunnleggende feilrapportering" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Detaljert feilrapportering" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "Detaljert feilrapportering med importfeil" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Ingen feilrapportering" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Følgende informasjon blir sendt hvis Cozy en feil eller kræsj oppstår:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Hvilken type feil som oppsto" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Hvilken linje i koden feilen oppsto" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versjonnummeret til Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linux distrubusjon" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Skrivebordsmiljø" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Medietype Cozy ikke kunne importere" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Alle" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Vis alle bøker" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Hopp til forfatter" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Hopp til forteller" #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Importerer lydbøker" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "Kopierer nye filer..." #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "Endrer lydbokplassering..." #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Gjenstående" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Totalt" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Sist spillt" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Utgitt" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "Noen eller ingen av denne bokens filer ble funnet." #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "utilgjengelig" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "Tilbakemelding" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "Du kan hjelpe og foredre Cozy med å dele feilinformasjon." #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Å dele denne informasjonen er frivillig og helt anonym. Vi vil aldri samle " "personlig data, filene du importerer, eller noe annen informasjon som kan " "brukes til å identifisere deg." #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy har åpen kildekode. Koden og tilbakemeldinger er tilgjengelig her:" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Avbryt" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Finn" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Filen ble ikke funnet" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Denne filen ble ikke funnet. Vil du lokalisere den manuelt?" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "OK" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Noen filer kunne ikke bli lagt til." #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Dette kan være av flere grunner:\n" "- Lydformatet er ikke støttet\n" "- Stien eller filnavnet inneholder ikke-UTF-8 tegn\n" "- Filen(e) er ikke gyldige lydfiler\n" "- Filen(e) er korrupte" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "Nylige" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Liste over forfattere" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Forfatter" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Liste over fortellere" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Forteller" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Liste over bøker" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Vent mens Cozy forbereder biblioteket ditt..." #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" "Begynn å utforske biblioteket ditt ved å bytte til forfatter- eller " "fortellervisning." #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Importer lydbøkene dine" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy importerer automatisk lydbøkene dine i en mappe - biblioteket ditt" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Importer automatisk nye lydbøker ved oppstart" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "Autoskann bryter" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "Dra & Slipp" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Dra lydbøkene dine inn i Cozy for å importere dem automatisk" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Plasseringen til lydbøkene dine" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Velg lydbokmappe" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "Last inn lydbøker fra en mappe, nettverksenhet, eller en eksten disk." #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "Du kan legge til flere lagringsplasseringer i innstillingene senere" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Søk" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Søkeboks" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Søk i lydbokbiblioteket ditt" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Hviken bok leter du etter?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Bok" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Del" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Ingen resultater :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Generellt" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Mørkt tema" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "" #: data/ui/settings.ui:604 msgid "Tags" msgstr "Tagger" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "Bytt forfatter og forteller" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "" #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "" #: data/ui/settings.ui:1715 msgid "Database" msgstr "" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Søk i biblioteket ditt" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Slett lydbok" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Er du sikker på at du vil slette denne lydboken?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Lydboken vil bli fjernet fra disken og fra Cozy-biblioteket." #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/oc.po000066400000000000000000000642241457036466300141040ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Quentin PAGÈS, 2021 # Nicolas MIARD, 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-08-09 20:31+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Nicolas MIARD, 2023\n" "Language-Team: Occitan (post 1500) (https://app.transifex.com/geigi/teams/78138/oc/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: oc\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: cozy/application.py:106 msgid "Audiobooks" msgstr "Libres àudio" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "A Copiar" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Còpia impossibla : lo repertòri de Libres àudio es en lectura sola" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Còpia impossibla : disc plen" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Còpia impossibla : autorizacion refusada" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Error en important los fichièrs novèls" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Capitol" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} ora" msgstr[1] "{hours} oras" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuta" msgstr[1] "{minutes} minutas" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} segonda" msgstr[1] "{seconds} segonda" #: cozy/tools.py:102 msgid "finished" msgstr "terminat" #: cozy/tools.py:126 msgid "never" msgstr "jamai" #: cozy/tools.py:128 msgid "today" msgstr "uèi" #: cozy/tools.py:130 msgid "yesterday" msgstr "ièr" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "fa %s jorns" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "fa {weeks} setmana" msgstr[1] "fa {weeks} setmanas" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "fa {months} mes" msgstr[1] "fa {months} meses" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "fa {years} ans" msgstr[1] "fa {years} an" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Telecargat" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Telecargar" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Legir aquesta part" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disc" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Totes los fichièrs" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Causir lo repertòri de libres àudio" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} es fòra linha." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marcar coma legit" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Dobrir dins lo navegador" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Suprimir de la bibliotèca" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Desactivat" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Rapòrt d'error basic" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Rapòrt d'error detalhat" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Rapòrt d'error detalhat amb errors d'importacion" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Pas d'error o rapòrt d'incident" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "L'informacion seguent serà mandada en cas d'error o d'incident :" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Quin tipe d'error se produsiguèt" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Linha de còdi que l'error se produsiguèt" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Version de Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribucion Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Environa de burèu" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tipe de fichièrs media que Cozy posquèt pas importar" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Totes" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Afichar totes los libres" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Sautar cap a l'autor" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Sautar cap al legeire" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Legir aqueste libre" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Desactivada" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:380 msgid "External drive" msgstr "Disc extèrn" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Disc intèrn" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "A refrescar la colleccion de livres àudios" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "A copiar de fichièrs novèls" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "A cambiar la localizacion del libre àudio..." #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Legir" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restant" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Darrièra lectura" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Publicat" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "D'unes or totes los fihièrs se poscan pas trobar." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "indisponible" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "A cargar los capitols, mercé d'esperar..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Dobrir l'apercebut del libre" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Tampar Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Recebre d'ajuda sus GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Una error se produsiguèt pendent la mesa a jorn de la basa de donadas" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Una error se produsiguèt pendent la mesa jorn de la basa de donada e Cozy podrà pas se tornar dubrir.\n" "Una salvagarda de la basa de donada foguèt creada abans la mesa jorn e foguèt restorada tre ara.\n" "Tan que qu'aqueste problèma es pas reglat, mercé d'utilizar la version 0.9.5 de Cozy.\n" "Podètz ajudar de resolvre aqueste problèm en la raportant sus GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Anullar" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Escafar Libre àudio" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Sètz segur de voler escafar lo libre seleccionat ?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Aqueste libre serà escafat del vòstre disc e de la bibliotèca de Cozy" #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:458 msgid "User feedback" msgstr "Retorn de l'utilizaire" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Podètz ajudar a melhorar Cozy en partejant d'informacion en cas d'errors o " "d'incidents." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Partejar aquesta informacion es opcional e complètament anonim. Amassarem " "pas jamai la donadas personals, los fichièrs qu'importatz o cap informacion " "que vos poiriá identificar." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy es de sorças dobertas e lo còdi sorça dels retorns d'utilizaires se " "pòt inspectar aquí : " #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Localizar" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Fichièr pas trobat" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" "Aquest fichièr se posquèt pas trobar. Lo volètz localizar manualament ?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Afichar la progression de la tasca de fond" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Cercar dins vòstra bibliotèca" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Boton del menut de cerca" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Dobrir la fenèstra pòp de cercar" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opcions" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Boton del menut d'opcions" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Dobrir la fenèstra pòp de las opcions" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "D'unes fichièrs se posquèron importar" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Recents" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "TIèra dels autors" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista de lectors" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lector" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "List de libres" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Començats d'explorar vòstra bibliotèca en alternant entre las vistas Autors " "e Legeires" #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Demoratz brancats pendent que Cozy es a aprestar vòstra bibliotèca..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importatz vòstres libres àudio" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy impòrta automaticament vòstres libres àudo dins un dorsièr - vòstra " "bibliotèca" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Lisar & depausar" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Lisatz vòstres libres àudio dins Cozy e seràn automaticament importats" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Cargatz libres àudio dempuèi un dorsièr, un disc de ret o un disc extèrn" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Seleccionar" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Recular" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Boton Recular" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Lectura del retorn endarrèr" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Avia la lectura" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Boton Lectura/Pausa" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Començar o pausar la lectura" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "En avant" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Boton En avant" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Lectura de l'en avant" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "En cors de lectura" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Títol del libre" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Títol de libre en cors de lectura" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nom de la partida" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Nom de la partida en cors de lectura" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Temps escolat" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Temps escolat" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Temps escolat" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Anar directament a la posicion correnta del capitol" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Lissièra de posicion" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posicion de la partida correnta en segondas" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Temps restant" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Temps restant" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Temps restant dins la partida corrent" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Contraròtle de volum" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Velocitat de lectura" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Minutará" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Boton del menut de minutará" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Dobrir la fenèstra pop de la minutará" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Dobrir lo libre" #: data/ui/preferences.ui:55 msgid "General" msgstr "General" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Aparéncia" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Etiquetas" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Activar se l'autor e lo legeire son afichats dins marrit biais." #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Lectura" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Recular de 30s dins lo libre corrent al moment de dobrir Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Minutará" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Estockage" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Òbra" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "" "Totjorn utilizar d'imatges (cover.jpg, *.png, …) quand son disponibles" #: data/ui/preferences.ui:247 data/ui/preferences.ui:253 msgid "Storage locations" msgstr "Emplaçament d'estockage" #: data/ui/preferences.ui:312 msgid "Add location" msgstr "Apondre un emplaçament" #: data/ui/preferences.ui:338 msgid "Remove location" msgstr "Suprimir l’emplaçament" #: data/ui/preferences.ui:376 msgid "Toggle this storage location to be internal/external." msgstr "Alternar aqueste emplaçament d'estockage coma intèrn/extèrn." #: data/ui/preferences.ui:405 msgid "Set as default storage location for new audiobooks" msgstr "Definir coma emplaçament per defaut per los libres àudio novèls" #: data/ui/preferences.ui:409 msgid "Set as default" msgstr "Definir per defaut" #: data/ui/preferences.ui:453 msgid "Feedback" msgstr "Comentaris" #: data/ui/preferences.ui:463 msgid "User Feedback" msgstr "Retorns dels utilizaires" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Recercar" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Fenèstra de recèrca" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Cercar dins vòstra bibliotèca" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Quin libre cercatz ?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Libre" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Partida" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Pas res de trobat :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Durada de la minutariá." #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Lissièra de durada de la minutariá" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Reglar la minutariá en minutas" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Arrestar aprèp lo capitol corrent" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Activar lo contraròtle de l'alimentacion del sistèma" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tipe d'accion quand la minutariá s'acaba.\n" "\"Atudar\" ensajarà d'atudar vòstre sistèma\n" "\"Metre en velha\" ensajarà de metre vòstre sistèma en velha." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "Accion de gestion de l'alimentacion de far" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "metre en velha" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "atudar" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Percorrer la bibliotèca" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Amagar los libres pas disponibles" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferéncias" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Ajda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_A prepaus" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Quitar" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Benvenguda !" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Apondètz vòstre libres àudio es installatz vos plan !" #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Qué de nòu ?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Contunhar" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Qué de nòu dins Cozy ?" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "Un importador de medio complètament rescrich e fòrt mai fisable." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "De fichièrs àudio posquèron pas èsser importats ? Lisatz-depausatz aquestes " "fichièrs sus Cozy o utilizatz lo menut de l'aplicacion dins la barra de " "títol per analisar tornarmai vòstres repertòris de libres audio !" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Los fichièrs media correntament suportats son los mp3. m4a, flac, ogg, opus " "e wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Mai de causas dins las mesas a jorn a venir." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Un cambiament important dins la gestion de la bibliotèca" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Aperabans, totes los fichièrs importats dins vòstra bibliotèca mas que " "podián pas mai èsser trobats èran suprimits de la bibliotèca pendent una " "analisi." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "D'ara enlà, los libres audio son pas mai retirats automaticament de vòstra " "bibliotèca. Aquò evita de pèrdre accidentalament la progression d'un libre " "audio quand un fichièr es temporàriament introbable." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Per suprimir un libre audio de la bibliotèca, basta de clicar dessús amb lo " "boton drech de la mirga e de causir l'opcion \"Suprimir de bibliotèca\"." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Sopòrt basic dels libres m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Fòrça d'entre vosautres esperavan : La presa ne carga dels libres audio m4b " "! Aquesta version prepausa un supòrt de basa pels fichièrs m4b, sens supòrt " "de capítol." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Lisatz-depausatz vòstres fichièrs m4b sus Cozy o utilizatz lo menut de " "l'aplicacion dins la barra de títol per escanerizar tornarmai vòstres " "repertòris de libres audio." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "Lo supòrt dels capitols serà integrat dins un mesa jorn venenta. De seguir !" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Supòrt dels capitols per los libres m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Aquesta version de Cozy supòrta los capitols dins lo libres m4b !" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "S'avètz ja importats de fichièrs m4b, devetz començar d'escanerizar vòstra " "bibliotèca dempuèi lo menut de l'aplicacion." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Los capitols seràn escafats" cozy-1.3.0/po/pl.po000066400000000000000000000653451457036466300141230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Piotr Górski , 2021 # Sebosun , 2021 # Julian Geywitz , 2021 # translatornator , 2021 # Bartosz Nogajczyk, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-04 16:30+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Bartosz Nogajczyk, 2022\n" "Language-Team: Polish (https://www.transifex.com/geigi/teams/78138/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audiobooki" #: cozy/control/offline_cache.py:200 msgid "Copying" msgstr "Kopiowanie" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" "Nie można skopiować: Katalog audiobooków jest ustawiony tylko do odczytu" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Nie można skopiować: Dysk jest pełen" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Nie można skopiować: Brak uprawnień" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Błąd podczas importowania nowych plików" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Rozdział" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} godzina" msgstr[1] "{hours} godziny" msgstr[2] "{hours} godzin" msgstr[3] "{hours} godziny" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuta" msgstr[1] "{minutes} minuty" msgstr[2] "{minutes} minut" msgstr[3] "{minutes} minuty" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekunda" msgstr[1] "{seconds} sekundy" msgstr[2] "{seconds} sekund" msgstr[3] "{seconds} sekundy" #: cozy/tools.py:102 msgid "finished" msgstr "zakończono" #: cozy/tools.py:126 msgid "never" msgstr "nigdy" #: cozy/tools.py:128 msgid "today" msgstr "dzisiaj" #: cozy/tools.py:130 msgid "yesterday" msgstr "wczoraj" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dni temu " #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} tydzień" msgstr[1] "{weeks} tygodnie" msgstr[2] "{weeks} tygodni" msgstr[3] "{weeks} tygodnia" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} miesiąc" msgstr[1] "{months} miesiące" msgstr[2] "{months} miesięcy" msgstr[3] "{months} miesiąca" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} rok" msgstr[1] "{years} lata" msgstr[2] "{years} lat" msgstr[3] "{years} roku" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Pobrane" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Pobierz" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Odtwórz tę część" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Dysk" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Wszystkie pliki" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Ustaw katalog audiobooków" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} jest offline" #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Oznacz jako przeczytane" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Otwórz w przeglądarce plików" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Usuń z bilbioteki" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Nieaktywne " #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Podstawowe zgłaszanie błędów" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Szczegółowe zgłaszanie błędów" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Szczegółowe zgłaszanie błędów wraz z błędami importu" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Brak zgłaszania błędów oraz crashów." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "Następujące informacje będą wysłane w przypadku błędu lub crashu:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Jaki rodzaj błędu wystąpił " #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Wiersz kodu, w którym wystąpił błąd " #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Wersja Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Dystrybucja Linuxa" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Środowisko graficzne" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Typy plików których nie udało się zaimportować programowi Cozy" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Wszystkie" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Wyświetl wszystkie książki" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Przejdź do autora" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Przejdź do lektora" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Odtwórz tę książkę" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Wył." #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 msgid "External drive" msgstr "Dysk zewnętrzny" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Dysk wewnętrzny" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Odświeżanie kolekcji audiobooków" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Kopiowanie nowych plików..." #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Zmiana położenia audiobooka…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Odtwórz" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Pozostało" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Razem" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Ostatnio odtwarzane" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Opublikowano" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Kilka lub wszystkie pliki w tej książce nie mogą być znalezione. " #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "niedostępne" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Ładownie rozdziałów, proszę czekać..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Otwórz ogólny opis książki" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Zamknij Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Uzyskaj pomoc na stronie GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Wystąpił błąd podczas aktualizacji bazy danych" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Podczas aktualizacji bazy danych wystąpił błąd i program Cozy nie będzie mógł się uruchomić.\n" "Kopia zapasowa bazy danych została utworzona przed aktualizacją i została teraz przywrócona.\n" "Do czasu rozwiązania tego problemu prosimy używać Cozy w wersji 0.9.5.\n" "Możesz pomóc w rozwiązaniu tego problemu zgłaszając problem na GitHubie." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Anuluj" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Usuń Audiobooka" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Jesteś pewien, że chcesz usunąć wybranego audiobooka? " #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Audiobook zostanie usunięty z twojego dysku oraz z biblioteki Cozy. " #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 msgid "User feedback" msgstr "Opinie użytkowników " #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Możesz pomóc ulepszyć Cozy poprzez dostarczanie informacji w przypadku " "błędów lub awarii. " #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Dostarczanie tychże informacji jest nieobowiązkowe i całkowicie anonimowe. " "Nigdy nie będziemy gromadzić danych osobowych, importowanych plików lub " "jakichkolwiek innych informacji które mogłyby Cię zidentyfikować. " #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy jest projektem opensource, a kod źródłowy używany do przetwarzania " "opinii można zobaczyć tutaj: " #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Położenie" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Pliku nie znaleziono" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Nie można odnaleźć pliku. Czy chcesz wskazać jego położenie?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Wyświetlanie postępu zadania w tle" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Szukaj w bibliotece" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Przycisk menu szukania" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Otwórz okienko szukania" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opcje" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Przycisk menu opcji" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Otwórz okienko opcji" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "OK" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Niektóre pliki nie mogły być zaimportowane" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Przyczyn może być wiele\n" "- Format pliku nie jest obsługiwany\n" "- Ścieżka lub nazwa pliku zawiera znaki inne niż utf-8 \n" "- Plik(i) nie są prawidłowymi plikami audio\n" "- Plik(i) są uszkodzone" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Ostatnio" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lista autorów" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista lektorów" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Lektor" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lista książek" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Rozpocznij odkrywanie swojej biblioteki, przełączając się do widoku Autor " "lub Czytelnik." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Poczekaj aż Cozy nie przygotuje twojej biblioteki..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importuj audiobooki" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy automatycznie importuje audiobooki z jednego katalogu - twojej " "bilbioteki" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Przeciągnij i upuść" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Przeciągnij audiobooki do cozy a zostaną automatycznie zaimportowane" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Ładowanie audiobooków z katalogu, dysku sieciowego lub dysku zewnętrznego" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Wybierz" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Przewijanie do tyłu" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Przycisk przewijania" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Odtwarzanie wstecz" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Rozpocznij odtwarzanie" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Przycisk Odtwarzania/Wstrzymania" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Rozpocznij lub wstrzymaj odtwarzanie" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Dalej" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Przycisk do przodu" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Odtwarzanie do przodu" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Aktualnie odtwarzane" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Tytuł książki" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Tytuł aktualnie odtwarzanej ksiązki" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nazwa częsci" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Tytuł aktualnie odtwarzanej części" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Pozostało" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Upłyneło" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Czas aktualnej części, który upłynął" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Przejdź do pozycji w bieżącym rozdziale" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Suwak pozycji" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Pozycja aktualnej części w sekundach" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Pozostały czas" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Czasu pozostało" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Pozostały czas aktualnej części" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Poziom głośności" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Prędkość odtwarzania" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Minutnik uśpienia" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Przycisk menu minutnika" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Otwórz okienko minutnika uśpienia" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Otwórz książkę" #: data/ui/preferences.ui:55 msgid "General" msgstr "Ogólne" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Wygląd" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Tagi" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktywuj, jeśli autor i czytelnik są wyświetlani w niewłaściwy sposób" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Odtwarzanie" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "" "Przewijanie bieżącej książki 30 sekund do tyłu podczas uruchamiania " "aplikacji Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Wyłącznik czasowy" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Magazyn" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Oprawa graficzna" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Zawsze używaj obrazów (cover.jpg, *.png, ...), jeśli są dostępne" #: data/ui/preferences.ui:247 msgid "Storage locations" msgstr "Położenia plików" #: data/ui/preferences.ui:309 msgid "Add location" msgstr "Dodaj położenie" #: data/ui/preferences.ui:335 msgid "Remove location" msgstr "Usuń położenie" #: data/ui/preferences.ui:373 msgid "Toggle this storage location to be internal/external." msgstr "Przełącz to położenie plików na wewnętrzne/zewnętrzne" #: data/ui/preferences.ui:402 msgid "Set as default storage location for new audiobooks" msgstr "Ustaw jako domyślne położenie plików dla nowych audiobooków" #: data/ui/preferences.ui:406 msgid "Set as default" msgstr "Ustaw jako domyślny" #: data/ui/preferences.ui:450 msgid "Feedback" msgstr "Opinie" #: data/ui/preferences.ui:460 msgid "User Feedback" msgstr "Opinie użytkowników" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Szukaj" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Pole wyszukiwania" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Przeszukaj bibliotekę audiobooków" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Której książki szukasz?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Książka" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Część" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Nic nie znaleziono :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Czas minutnika" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Suwak czasu minutnika" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Ustaw czas minutnika uśpienia" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Zatrzymaj po tym rozdziale" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Włącz kontrolę zasilania systemu" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Typ działania po zakończeniu timera.\n" "\"zamknij\" będzie próbował wyłączyć system (znany również jako wyłączenie zasilania)\n" "\"wstrzymaj\" spowoduje zawieszenie systemu (znane również jako uśpienie)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Działanie zasilania systemu\n" "do wykonania" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "zawieś" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "wyłącz" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Skanuj Katalog" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Ukryj niedostępne książki" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Ustawienia" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Pomoc" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Informacje" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Wyjście" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Witaj!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Dodaj swoje audiobooki i poczujmy się przytulniej." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Co nowego?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Kontynuuj" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Co nowego?" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Całkowicie przepisany oraz o wiele bardziej niezawodny importer mediów. " #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Napotkałeś pliki audio, których nie można zaimportować? Przeciągnij i upuść " "te pliki do Cozy albo użyj menu aplikacji na pasku tytułowym, aby ponownie " "przeskanować katalogi audiobooków! " #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Obecnie obsługiwane pliki multimedialne to mp3, m4a, flac, ogg, opus oraz wav.\n" " " #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Więcej w późniejszej aktualizacji" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Ważna zmiana w zarządzaniu biblioteką" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Poprzednio każdy plik, który został zaimportowany do biblioteki, ale nie " "mógł być już znaleziony, był usuwany z biblioteki podczas skanowania." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Teraz audiobooki nie są już automatycznie usuwane z Twojej biblioteki. " "Zapobiega to przypadkowej utracie postępów w odtwarzaniu audiobooków, gdy " "plik nie może zostać tymczasowo odnaleziony." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Aby usunąć audiobooka z biblioteki, wystarczy kliknąć na niego prawym " "przyciskiem myszy i wybrać opcję Usuń z biblioteki." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Podstawowe wsparcie dla audiobooków formatu m4b. " #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Wielu z Was na to czekało: Wsparcie dla audiobooków w formacie m4b! Ta " "wersja posiada podstawowe wsparcie dla plików m4b bez obsługi rozdziałów." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Przeciągnij i upuść swoje pliki m4b do Cozy lub użyj menu aplikacji na pasku" " tytułowym, aby ponownie przeszukać katalogi audiobooków." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "Obsługa rozdziałów będzie dostępna w późniejszej aktualizacji. Bądźcie " "czujni!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Obsługa rozdziałów dla audiobooków w formacie m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" "Ta wersja Cozy posiada obsługę rozdziałów dla audiobooków w formacie m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Jeśli masz już zaimportowane pliki w formacie m4b, musisz rozpocząć " "skanowanie swojej biblioteki z menu aplikacji." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Rozdziały zostaną wtedy wykryte." cozy-1.3.0/po/pt.po000066400000000000000000000547561457036466300141370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2019 # André Barata , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: André Barata , 2021\n" "Language-Team: Portuguese (https://www.transifex.com/geigi/teams/78138/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "A Copiar" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Desligar" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} hora" msgstr[1] "{hours} horas" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuto" msgstr[1] "{minutes} minutos" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} segundo" msgstr[1] "{seconds} segundos" #: cozy/tools.py:102 msgid "finished" msgstr "terminado" #: cozy/tools.py:126 msgid "never" msgstr "nunca" #: cozy/tools.py:128 msgid "today" msgstr "hoje" #: cozy/tools.py:130 msgid "yesterday" msgstr "ontem" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dias atrás" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} semana" msgstr[1] "{weeks} semanas" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} mês" msgstr[1] "{months} meses" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} ano atrás" msgstr[1] "{years} anos atrás" #: cozy/application.py:101 msgid "Audiobooks" msgstr "Audiolivro" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Ouvir este livro" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Descarregado" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Descarregar" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Ver capítulos do livro" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Marcar como lido" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Abrir no explorador de ficheiros" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Remover da biblioteca" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "Disco" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Todos os ficheiros" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Ouvir esta parte" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} está desligado." #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Todos" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Mostrar todos os livros" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Ir para o autor " #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Ir para o narrador " #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "A importar o Audiolivro" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "" #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "A alterar a localização do Audiolivro..." #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Restante" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Último tocado" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Publicado" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "" #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Cancelar" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Localizar" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Ficheiro não encontrado" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" "Este ficheiro não pode ser localizado. Você quer localiza-lo manualmente?" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Alguns ficheiros não puderam ser importados" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Isto pode ter múltiplas razões:\n" "- O formato áudio não é suportado\n" "- O caminho ou o nome contém caracteres não utf-8\n" "- Ficheiro de áudio não é válido\n" "- Ficheiro corrupto" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "Recente" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Lista de autores" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Lista de narradores" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Narrador" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Lista de livros" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" "Comece a explorar a sua biblioteca ao trocar para a vista de Autor ou " "Narrador em cima." #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Importe os seus Audiolivros" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "O Cozy importa automaticamente os seus Audiolivros numa única diretoria -a " "sua biblioteca" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Importar automaticamente novos audiolivros ao iniciar" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "Interruptor de pesquisa automático" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "Arrastar & Soltar" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Arraste os seus audiolivros para dentro do cozy que eles serão " "automaticamente importados" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Local de seus audiolivros" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Defina uma Diretoria para os Audiolivros" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" "Carregue os audiolivros de uma diretoria, disco de rede ou disco externo." #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "Pode adicionar mais locais de armazenamento mais tarde nas definições" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Procurar" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Caixa de procura" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Procurar o seu audiolivro na biblioteca" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Qual é o livro que está à procura?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Livro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Parte" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Nada encontrado :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Geral" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Modo Escuro" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "Barra de Título" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "Visualizar o livro inteiro em vez do capítulo atual" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "Aparência" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "Suspender o sistema ao final do temporizador" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "Repetir 30 segundos" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "Procura automática de midia" #: data/ui/settings.ui:604 msgid "Tags" msgstr "Rótulo" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "Substituir autor e narrador" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "Ative isto se o autor e narrador estão exibidos da maneira errada" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "Altere a designação do autor e narrador" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "Temporizador de dormir" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "Desaparecer" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "Tempo de duração do desaparecer" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "Comportamento" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "Ilustração" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "Preferir imagens externas a capas embutidas" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "Usar imagens (capa.jpg, *.png, …) quando disponíveis" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "Localização dos Audiolivros" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "Locais de armazenamento" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "Adicionar localização" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "Remover localização" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "Alterne esta localização de armazenamento para ser interna/externa." #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "" "Defina como localização de armazenamento padrão para todos os novos " "audiolivros" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "Caminho" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "Seguir links simbólicos" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "Armazenamento" #: data/ui/settings.ui:1715 msgid "Database" msgstr "Base de Dados" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "Forçar atualização da base de dados" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "" "Isto vai forçar a atualização da meta data de todos os livros importados" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "Forçar atualização" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "Avançado" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Duração do temporizador" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Controlo deslizante de duração do temporizador" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Defina a duração do temporizador em minutos" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Parar depois do capítulo atual" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Ligar o controlo de energia do sistema" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "O tipo de ação quando o temporizador termina\n" "\"desligar\" vai tentar desligar o seu sistema (também conhecido como \"desligar energia\")\n" "\"suspender\" vai tentar suspender o seu sistema (também conhecido como \"dormir\")." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Ação de energia do sistema\n" "a executar" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "suspender" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "desligar" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Esconder livros indisponíveis" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferências" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Ajuda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_Sobre" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Sair" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Tempo decorrido" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tempo decorrido" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Tempo decorrido da parte atual" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Saltar para posição no capítulo atual" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Posicionar o controlo deslizante" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posição da parte atual em segundos" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tempo restante" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tempo restante" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Tempo restante da parte atual" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "Botão de retroceder" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "Iniciar reprodução" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "Botão de Iniciar/Parar" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "Inicie ou pare uma reprodução" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "Avisos" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "Ouvindo atualmente" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "Título do livro" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "Título do livro em reprodução" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "Nome da parte" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "Título da parte em reprodução" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "A trabalhar…" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "A trabalhar atualmente" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "Controle de volume" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "Velocidade de reprodução" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "Botão de menu do temporizador" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "Abrir o popover do temporizador" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Procurar na sua biblioteca" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "Menu de procura" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "Abrir o popover de procura" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "Opções" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "Botão de menu de opções" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "Abrir o popover de opções" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/pt_BR.po000066400000000000000000000650661457036466300145160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Cleiton Floss , 2021 # Gustavo Costa , 2021 # Julian Geywitz , 2021 # Rafael Fontenelle , 2021 # Marcio Led, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-08-09 20:31+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Marcio Led, 2022\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/geigi/teams/78138/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: cozy/application.py:106 msgid "Audiobooks" msgstr "Audiolivros" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Copiando" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "Não foi possível copiar: O diretório de audiolivros é somente leitura" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Não foi possível copiar: O disco está cheio" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Não foi possível copiar: Permissão negada" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Erro ao importar novos arquivos" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Capítulo" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} hora" msgstr[1] "{hours} horas" msgstr[2] "{hours} horas" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minuto" msgstr[1] "{minutes} minutos" msgstr[2] "{minutes} minutos" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} segundo" msgstr[1] "{seconds} segundos" msgstr[2] "{seconds} segundos" #: cozy/tools.py:102 msgid "finished" msgstr "finalizado" #: cozy/tools.py:126 msgid "never" msgstr "nunca" #: cozy/tools.py:128 msgid "today" msgstr "hoje" #: cozy/tools.py:130 msgid "yesterday" msgstr "ontem" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dias atrás" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} semana atrás" msgstr[1] "{weeks} semanas atrás" msgstr[2] "{weeks} semanas atrás" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} mês atrás" msgstr[1] "{months} meses atrás" msgstr[2] "{months} meses atrás" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} ano atrás" msgstr[1] "{years} anos atrás" msgstr[2] "{years} anos atrás" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Baixado" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Baixar" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Reproduzir este trecho" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Disco" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Todos os arquivos" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Definir diretório dos audiolivros" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} está desconectado." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Marcar como lido" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Abrir no navegador de arquivos" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Remover da biblioteca" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Desabilitado" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Relatório básico de erros" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Relatório detalhado de erros" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Relatório de erro detalhado com erros de importação" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Nenhum relatório de erro ou falha." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "" "As seguintes informações serão enviadas em caso de erro ou travamento:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Que tipo de erro ocorreu" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Linha de código onde ocorreu um erro" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Versão do Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Distribuição Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Ambiente de desktop" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Tipo de mídia de arquivos que o Cozy não conseguiu importar" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Todos" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Exibir todos os livros" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Ir para o autor" #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Ir para o narrador" #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Reproduzir este livro" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Desativado" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:380 msgid "External drive" msgstr "Dispositivo externo" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Dispositivo interno" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Atualizando coleção de audiolivros" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Copiando novos arquivos…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Alterando localização do audiolivro…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Reproduzir" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Restante" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Total" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Última reprodução" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Publicadas" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Alguns ou todos os arquivos deste livro não podem ser encontrados." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "indisponível" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Carregando capítulos, por favor aguarde..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Visão geral do livro" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Fechar Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Conseguir ajuda no Github" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Ocorreu um erro ao atualizar o banco de dados" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Durante uma atualização do banco de dados, ocorreu um erro e o Cozy não será capaz de inicializar.\n" "Um backup do banco de dados foi criado antes da atualização e foi restaurado agora.\n" "Até que esse problema seja resolvido, use a versão 0.9.5 do Cozy.\n" "Você pode ajudar a resolver esse problema relatando-o no GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Cancelar" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Excluir audiolivro" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Tem certeza de que deseja excluir o audiolivro selecionado?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "O audiolivro será removido do seu disco e da biblioteca do Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:458 msgid "User feedback" msgstr "Feedback do usuário" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Você pode ajudar a melhorar o Cozy, contribuindo com informações em caso de " "erros e falhas." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Contribuir com essas informações é opcional e totalmente anônimo. Nunca " "coletaremos dados pessoais, arquivos importados ou qualquer informação que " "possa identificá-lo." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy é um código aberto e o código-fonte do feedback do usuário pode ser " "inspecionado aqui:" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Localizar" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Arquivo não encontrado" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "" "Este arquivo não pôde ser encontrado. Você quer localizá-lo manualmente?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Exibir o progresso de tarefa em plano de fundo" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Buscar na sua biblioteca" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Botão de menu da busca" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Abrir o popover da busca" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Opções" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Botão de menu das opções" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Abrir o popover das opções" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Ok" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Alguns arquivos não puderam ser importados" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Isso pode ser devido a várias razões:\n" "- O formato do áudio não é suportado\n" "- O caminho do arquivo contém caracteres fora do padrão UTF-8\n" "- O(s) arquivo(s) não é/são válido(s)\n" "- O(s) arquivo(s) está/estão corrompido(s)" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Recente" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Lista de autores" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Autor" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Lista de narradores" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Narrador" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Lista de livros" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Comece a explorar sua biblioteca mudando para a visualização Autor ou " "Narrador." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Fique ligado enquanto Cozy prepara sua biblioteca..." #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Importe seus audiolivros" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy automaticamente importa seus audiolivros em um diretório - sua " "biblioteca" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Arrastar & soltar" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Arraste seus audiolivros para o Cozy e eles serão importados automaticamente" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "" "Carregue audiolivros de um diretório, unidade de rede ou disco externo" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Selecionar" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Retroceder" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Botão de retroceder" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Retroceder reprodução" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Iniciar reprodução" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Botão de reproduzir/pausa" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Iniciar ou pausar a reprodução" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Avançar" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Botão de avançar" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Avançar reprodução" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Atualmente reproduzindo" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Título do livro" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Título do livro atualmente em reprodução" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Nome do trecho" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Título do trecho atualmente em reprodução" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Tempo passado" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Tempo passado" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Tempo passado do trecho atual" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Pular para a posição no capítulo atual" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Deslize de posição" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Posição do trecho atual em segundos" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Tempo restante" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Tempo restante" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Tempo restante do trecho atual" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Controle de volume" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Velocidade da reprodução" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Temporizador" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Botão de menu do temporizador" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Abrir o popover do temporizador" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Abrir livro" #: data/ui/preferences.ui:55 msgid "General" msgstr "Geral" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Aparência" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Etiquetas" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Ative caso autor e narrador aparecem de maneira errada" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Reprodução" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Voltar 30 segundos do livro atual ao iniciar o Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Soneca" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Armazenamento" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Arte da capa" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Sempre usar imagens (capa.jpg, *.png, ...) quando disponíveis" #: data/ui/preferences.ui:247 data/ui/preferences.ui:253 msgid "Storage locations" msgstr "Locais de armazenamento" #: data/ui/preferences.ui:312 msgid "Add location" msgstr "Adicionar um local" #: data/ui/preferences.ui:338 msgid "Remove location" msgstr "Remover um local" #: data/ui/preferences.ui:376 msgid "Toggle this storage location to be internal/external." msgstr "Alternar este local de armazenamento para ser interno/externo." #: data/ui/preferences.ui:405 msgid "Set as default storage location for new audiobooks" msgstr "Definir como local de armazenamento padrão para novos audiolivros" #: data/ui/preferences.ui:409 msgid "Set as default" msgstr "Definir como padrão" #: data/ui/preferences.ui:453 msgid "Feedback" msgstr "Feedback" #: data/ui/preferences.ui:463 msgid "User Feedback" msgstr "Feedback do usuário" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Busca" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Caixa de busca" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Buscar na sua biblioteca de audiolivros" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Qual livro você está procurando?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Livro" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Trecho" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Nada encontrado :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Duração do temporizador" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Deslize do temporizador" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Definir a duração do temporizador em minutos" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Parar depois do capítulo atual" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Habilitar controle de energia do sistema" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Tipo de ação quando o temporizador termina.\n" "\"shutdown\" tentará desligar o seu sistema (também conhecido como power off)\n" "\"suspend\" tentará suspender seu sistema (também conhecido como hibernação)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Ação de energia do\n" "sistema para executar" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "suspender" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "desligar" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Procurar na biblioteca" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Ocultar livros indisponíveis" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Preferências" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Ajuda" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "S_obre" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Sair" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Seja bem-vindo!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Adicione seus audiolivros e aconchegue-se com o Cozy." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "O que há de novo?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Continuar" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "O que há de novo no Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "Um importador de mídia totalmente reescrito e muito mais confiável." #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Você passou pela situação de ter arquivos de áudio que não puderam ser " "importados? Arraste e solte esses arquivos no Cozy ou use o menu de " "aplicativos na barra de título para varrer novamente os diretórios de seus " "audiolivros!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "Os arquivos de mídia suportados atualmente são mp3, m4a, flac, ogg, opus e " "wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Mais para vir em uma atualização futura." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Uma alteração importante no gerenciador de biblioteca." #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Anteriormente, todos os arquivos que tinham sido importados para sua " "biblioteca, mas que não foram encontrados mais posteriormente, eram " "removidos da biblioteca durante uma varredura." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Agora os audiolivros não são mais removidos automaticamente da sua " "biblioteca. Isso evita a perda acidental do andamento de um audiolivro " "quando um arquivo não pode ser encontrado temporariamente." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Para remover um audiolivro da biblioteca, basta clicar com o botão direito " "sobre ele e escolher a opção de remover da biblioteca." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Suporte básico para audiolivros m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "Muitos de vocês estavam esperando por isso: suporte para audiolivros m4b! " "Esta versão oferece suporte básico para arquivos m4b sem suporte a capítulo." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Arraste e solte seus arquivos m4b no Cozy ou use o menu do aplicativo na " "barra de título para varrer novamente os diretórios de seus audiolivros." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" "O suporte do capítulo virá em uma atualização posterior. Fique atento!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Suporte de capítulo de audiolivros m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Esta versão do Cozy oferece suporte a capítulos para audiolivros m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Se você já tem arquivos m4b importados, você precisará iniciar uma varredura" " de sua biblioteca a partir do menu do aplicativo." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "Os capítulos serão então detectados." cozy-1.3.0/po/ru.po000066400000000000000000000772541457036466300141400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Lapunov Yegor , 2020 # Nikolai Oplachko , 2020 # Caarmi, 2021 # Dellon Zerus , 2021 # Jan Lyakhovsky , 2021 # Julian Geywitz , 2021 # Camellan , 2021 # h h , 2021 # Aleksey Aleksey , 2021 # Виктор, 2022 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-08-09 20:31+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Виктор, 2022\n" "Language-Team: Russian (https://www.transifex.com/geigi/teams/78138/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: cozy/application.py:106 msgid "Audiobooks" msgstr "Аудиокниги" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Копирование" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" "Не удалось скопировать: папка с аудиокнигами доступна только для чтения" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "Не удалось скопировать: диск переполнен" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "Не удалось скопировать: в доступе отказано" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Ошибка при импортировании новых файлов" #: cozy/model/track.py:38 msgid "Chapter" msgstr "Глава" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} час" msgstr[1] "{hours} часов" msgstr[2] "{hours} часов" msgstr[3] "{hours} часов" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} минута" msgstr[1] "{minutes} минут" msgstr[2] "{minutes} минут" msgstr[3] "{minutes} минут" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} секунда" msgstr[1] "{seconds} секунд" msgstr[2] "{seconds} секунд" msgstr[3] "{seconds} секунд" #: cozy/tools.py:102 msgid "finished" msgstr "завершено" #: cozy/tools.py:126 msgid "never" msgstr "никогда" #: cozy/tools.py:128 msgid "today" msgstr "сегодня" #: cozy/tools.py:130 msgid "yesterday" msgstr "вчера" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s дней(я) назад" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} неделя назад" msgstr[1] "{weeks} недели назад" msgstr[2] "{weeks} недель назад" msgstr[3] "{weeks} недель назад" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} месяц назад" msgstr[1] "{months} месяцев назад" msgstr[2] "{months} месяцев назад" msgstr[3] "{months} месяцев назад" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} год назад" msgstr[1] "{years} года назад" msgstr[2] "{years} лет назад" msgstr[3] "{years} лет назад" #: cozy/ui/book_detail_view.py:313 msgid "Downloaded" msgstr "Загружено" #: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 msgid "Download" msgstr "Загрузить" #: cozy/ui/chapter_element.py:27 msgid "Play this part" msgstr "Слушать эту часть" #: cozy/ui/disk_element.py:27 msgid "Disc" msgstr "Диск" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Все файлы" #: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 msgid "Set Audiobooks Directory" msgstr "Указать каталог аудиокниг" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} в автономном режиме." #: cozy/ui/widgets/book_element.py:52 msgid "Mark as read" msgstr "Отметить как прочитанное" #: cozy/ui/widgets/book_element.py:55 msgid "Open in file browser" msgstr "Открыть в файловом менеджере" #: cozy/ui/widgets/book_element.py:58 msgid "Remove from library" msgstr "Удалить из библиотеки" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "Отключено" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "Докладывать об основных ошибках" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "Детально докладывать об ошибках" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 msgid "Detailed error reporting with import errors" msgstr "Детально докладывать об ошибках, включая ошибки во время импортации" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "Не докладывать об ошибках и сбоях." #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 msgid "The following information will be sent in case of an error or crash:" msgstr "Данная информация будет отправлена в случае сбоя или ошибки:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "Вид произошедшей ошибки" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "Линия на которой произошла ошибка" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Версия Cozy" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Дистрибутив Linux" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "Среда рабочего стола" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Формат файлов, которые Cozy не смог импортировать" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:54 #: cozy/view_model/library_view_model.py:160 msgid "All" msgstr "Все" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Отобразить все книги" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Перейти к автору " #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Перейти к диктору " #: cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Слушать эту аудиокнигу" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "мин" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Отключено" #: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:380 msgid "External drive" msgstr "Внешний диск" #: cozy/ui/widgets/storage_list_box_row.py:73 msgid "Internal drive" msgstr "Внутрення память" #: cozy/view_model/headerbar_view_model.py:91 msgid "Refreshing audio book collection" msgstr "Обновление коллекции аудиокниг" #: cozy/view_model/headerbar_view_model.py:100 #: cozy/view_model/headerbar_view_model.py:116 msgid "Copying new files…" msgstr "Копирование новых файлов…" #: cozy/view_model/headerbar_view_model.py:107 msgid "Changing audio book location…" msgstr "Изменение каталога аудиокниг…" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/album_element.ui:104 msgid "Play" msgstr "Воспроизвести" #: data/ui/book_detail.ui:219 msgid "Remaining" msgstr "Оставшиеся" #: data/ui/book_detail.ui:274 msgid "Total" msgstr "Общие" #: data/ui/book_detail.ui:290 msgid "Last played" msgstr "Последний раз воспроизводилось" #: data/ui/book_detail.ui:306 msgid "Published" msgstr "Опубликовано" #: data/ui/book_detail.ui:341 msgid "Some or all files of this book cannot be found." msgstr "Не удалось найти один или из более файлов этой книги." #: data/ui/book_detail.ui:364 msgid "unavailable" msgstr "не доступно" #: data/ui/book_detail.ui:533 msgid "Loading chapters, please wait..." msgstr "Загрузка глав, пожалуйста, подождите..." #: data/ui/book_element.ui:36 msgid "Open book overview" msgstr "Открыть обзор книги" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "Закрыть Cozy" #: data/ui/db_migration_failed.ui:47 msgid "Receive help on GitHub" msgstr "Получить помощь на GitHub" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "Произошла ошибка во время обновления базы данных" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Во время обновления базы данных произошла ошибка, и Cozy не сможет запуститься.\n" "Перед обновлением была создана резервная копия базы данных и сейчас она восстановлена.\n" "Пока эта проблема не будет решена, используйте версию Cozy 0.9.5.\n" "Вы можете помочь решить эту проблему, сообщив о проблеме на GitHub." #: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 msgid "Cancel" msgstr "Отмена" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "Удалить аудиокнигу" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "Вы уверены что хотите удалить выбраную аудиокнигу?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Аудиокнига будет удалена с вашего диска и из библиотеки Cozy." #: data/ui/error_reporting.ui:29 data/ui/preferences.ui:458 msgid "User feedback" msgstr "Пользовательские отзывы" #: data/ui/error_reporting.ui:98 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Вы можете помочь Cozy, отправляя информацию в случае ошибок или сбоев." #: data/ui/error_reporting.ui:112 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Отправление этой информации необязательно, и совершенно анонимно. Мы не " "никогда не используем информацию о вас, о ваших файлах, или о ваших личных " "данных." #: data/ui/error_reporting.ui:127 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy является программой с открытым исходным кодом, а отзывы пользователей " "можно найти здесь: " #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Расположение" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Файл не найден" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Файл не найден. Вы хотите найти его самостоятельно?" #: data/ui/headerbar.ui:56 msgid "Display background task progress" msgstr "Отображение выполнения фоновой задачи" #: data/ui/headerbar.ui:70 msgid "Search your library" msgstr "Поиск в вашей аудиобиблиотеке" #: data/ui/headerbar.ui:80 msgid "Search menu button" msgstr "Кнопка меню поиска" #: data/ui/headerbar.ui:81 msgid "Open the search popover" msgstr "Откройте поисковый запрос" #: data/ui/headerbar.ui:96 msgid "Options" msgstr "Настройки" #: data/ui/headerbar.ui:107 msgid "Options menu button" msgstr "Кнопка меню настроек" #: data/ui/headerbar.ui:108 msgid "Open the options popover" msgstr "Открыть окно настроек" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Да" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Некоторые файлы не могут быть импортированы" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "Это может иметь следующие причины:\n" "- Аудиоформат не поддерживается\n" "- Путь или имя файла содержит символы не из utf-8\n" "- Файл(ы) не являются валидными аудиофайлами\n" "- Файл(ы) повреждены" #: data/ui/main_window.ui:68 msgid "Recent" msgstr "Предыдущие" #: data/ui/main_window.ui:90 msgid "List of authors" msgstr "Список авторов" #: data/ui/main_window.ui:106 data/ui/main_window.ui:250 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Автор" #: data/ui/main_window.ui:128 msgid "List of readers" msgstr "Список дикторов" #: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Диктор" #: data/ui/main_window.ui:189 msgid "List of books" msgstr "Список книг" #: data/ui/main_window.ui:222 msgid "" "Start exploring your library by switching to the Author or Reader view." msgstr "" "Начните изучать свою библиотеку, переключившись на просмотр «Автор» или " "«Диктор»." #: data/ui/main_window.ui:280 msgid "Stay tuned while Cozy is preparing your library…" msgstr "Подождите, пока Cozy подготавливает библиотеку…" #: data/ui/main_window.ui:334 msgid "Import your Audiobooks" msgstr "Импорт аудиокниг" #: data/ui/main_window.ui:353 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy автоматически импортирует аудиокниги из указанного каталога в " "библиотеку" #: data/ui/main_window.ui:385 msgid "Drag & Drop" msgstr "Перетаскивание" #: data/ui/main_window.ui:387 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "" "Перенесите ваши аудиокниги в уютное местечко — Cozy, и они автоматически " "импортируются" #: data/ui/main_window.ui:414 msgid "Load audiobooks from a directory, network drive or an external disk" msgstr "Загружайте аудиокниги из каталога, сетевого или внешнего диска" #: data/ui/main_window.ui:417 msgid "Select" msgstr "Выбрать" #: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 #: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 msgid "Rewind" msgstr "Перемотать" #: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 #: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 msgid "Rewind button" msgstr "Кнопка перемотки" #: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 #: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 msgid "Rewind playback" msgstr "Обратное воспроизведение" #: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 #: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 msgid "Start playback" msgstr "Начать воспроизведение" #: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 #: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 msgid "Play/Pause Button" msgstr "Кнопка воспр./паузы" #: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 #: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 msgid "Start or pause the playback" msgstr "Запуск или приостановка воспроизведения" #: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 #: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 msgid "Forward" msgstr "Вперёд" #: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 #: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 msgid "Forward button" msgstr "Кнопка вперёд" #: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 #: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 msgid "Forward Playback" msgstr "Воспроизведение вперёд" #: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 msgid "Currently playing" msgstr "Сейчас воспроизводится" #: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 msgid "Booktitle" msgstr "Заголовок аудиокниги" #: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 msgid "Title of currently playing book" msgstr "Название текущей аудиокниги" #: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 msgid "Part name" msgstr "Название части" #: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 msgid "Title of the currently playing part" msgstr "Название текущей части" #: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Пройденное время" #: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Прошло времени" #: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Истекшее время текущей части" #: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "Перейти на позицию в текущей главе" #: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Ползунок положения" #: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Положение текущей части в секундах" #: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Оставшееся время" #: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Времени осталось" #: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Оставшееся время текущей части" #: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 msgid "Volume control" msgstr "Регулятор громкости" #: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 #: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 msgid "Playback speed" msgstr "Скорость воспроизведения" #: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 msgid "Sleep timer" msgstr "Таймер сна" #: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 msgid "Timer menu button" msgstr "Кнопка меню таймера" #: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 msgid "Open the sleep timer popover" msgstr "Открыть окно таймера сна" #: data/ui/media_controller_big.ui:53 msgid "Open book" msgstr "Открыть книгу" #: data/ui/preferences.ui:55 msgid "General" msgstr "Общие" #: data/ui/preferences.ui:60 msgid "Appearance" msgstr "Внешний вид" #: data/ui/preferences.ui:83 msgid "Tags" msgstr "Метки" #: data/ui/preferences.ui:90 msgid "Activate if author and reader are displayed the wrong way" msgstr "Активируйте, если автор и диктор отображаются неправильно" #: data/ui/preferences.ui:107 msgid "Playback" msgstr "Проигрывание" #: data/ui/preferences.ui:114 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Перемотка текущей книги на 30 секунд назад при запуске Cozy" #: data/ui/preferences.ui:172 msgid "Sleep Timer" msgstr "Таймер сна" #: data/ui/preferences.ui:218 msgid "Storage" msgstr "Хранилище" #: data/ui/preferences.ui:223 msgid "Artwork" msgstr "Произведение" #: data/ui/preferences.ui:230 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Всегда использовать изображения (cover.jpg, *.png, …), когда доступно" #: data/ui/preferences.ui:247 data/ui/preferences.ui:253 msgid "Storage locations" msgstr "Места хранения " #: data/ui/preferences.ui:312 msgid "Add location" msgstr "Добавить расположение" #: data/ui/preferences.ui:338 msgid "Remove location" msgstr "Удалить расположение" #: data/ui/preferences.ui:376 msgid "Toggle this storage location to be internal/external." msgstr "Изменить память на внутреннюю/внешнюю" #: data/ui/preferences.ui:405 msgid "Set as default storage location for new audiobooks" msgstr "Установить как место хранения по умолчанию для новых аудиокниг" #: data/ui/preferences.ui:409 msgid "Set as default" msgstr "Установить по умолчанию" #: data/ui/preferences.ui:453 msgid "Feedback" msgstr "Обратная связь" #: data/ui/preferences.ui:463 msgid "User Feedback" msgstr "Обратная связь пользователей" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Поиск" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Поисковая строка" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Поиск в вашей аудиобиблиотеке" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Какую книгу вы ищите?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Книга" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Часть" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Ничего не найдено :(" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Продолжительность таймера" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Ползунок длительности таймера" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Установить таймер сна в минутах" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Остановить после текущей главы" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "Задействовать управление питанием" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Действие по истечению таймера.\n" "«Выключение» попробует выключить ваш компьютер (также «отключение питания»)\n" "«Спящий режим» попробует приостановить работу компьютера (также «сон»)." #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "Выполнить действие\n" "по управлению питанием" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "спящий режим" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "выключение" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "_Сканировать библиотеку" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "_Скрыть недоступные книги" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Параметры" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Справка" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "_О программе" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Выход" #: data/ui/welcome.ui:29 msgid "Welcome!" msgstr "Добро пожаловать!" #: data/ui/welcome.ui:46 msgid "Add your audiobooks and let's get cozy." msgstr "Добавьте свои аудиокниги и устраивайтесь поудобнее." #: data/ui/whats_new.ui:9 msgid "Whats new?" msgstr "Что нового?" #: data/ui/whats_new.ui:27 msgid "Continue" msgstr "Продолжить" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 #: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 msgid "What's new in Cozy" msgstr "Что нового в Cozy" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" "Переписанный с нуля и намного более надёжный метод импортирования файлов. " #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" "Были ли у вас проблемы с импортом аудиофайлов? Можно перетащить эти файлы в " "окно Cozy, или воспользоваться меню приложения для нового сканирования " "каталогов ваших аудиокниг!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" "На данный момент, программа поддерживает форматы mp3, m4a, flac, ogg, opus и" " wav." #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "Мы добавим больше в следующем обновлении." #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "Важные изменения в управлении библиотекой" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" "Раньше каждый файл, который был импортирован в вашу библиотеку, но который " "не удавалось найти, удалялся из библиотеки во время сканирования." #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" "Теперь аудиокниги больше не удаляются из вашей библиотеки автоматически. Это" " предотвращает случайную потерю прогресса чтения аудиокниги, когда файл " "временно не может быть найден." #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" "Чтобы удалить аудиокнигу из библиотеки, просто нажмите на нее правой кнопкой" " мыши и выберите параметр «Удалить из библиотеки»." #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "Поддержка аудиокниг формата m4b." #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" "По многочисленным просьбам, мы добавили поддержку книг формата m4b. Эта " "версия включает в себя базовую поддержку формата m4b, но не поддерживает " "использование глав." #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" "Перетащите файлы m4b в окно Cozy или используйте меню приложения чтобы ещё " "раз сканировать папку с вашими аудиокнигами." #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "Поддержка глав будет добавлена в будущем обновлении." #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "Поддержка глав аудиокниг формата m4b." #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "Эта версия Cozy поддерживает главы для аудиокниг в формате m4b!" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" "Если у вас уже есть импортированные файлы m4b, вам нужно запустить " "сканирование вашей библиотеки из меню приложения." #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "После этого главы будут удалены." cozy-1.3.0/po/sv.po000066400000000000000000000446261457036466300141370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # efef6ec5b435a041fce803c7f8af77d2_2341d43, 2020 # Åke Engelbrektson, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Åke Engelbrektson, 2024\n" "Language-Team: Swedish (https://app.transifex.com/geigi/teams/78138/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "Ljudböcker" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Kopierar" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "Kan inte kopiera: Ljudboksmappen är skrivskyddad." #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "Kan inte kopiera: Disken är full." #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "Kan inte kopiera: Behörighet saknas." #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Fel vid import av nya filer" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} timma" msgstr[1] "{hours} timmar" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} minut" msgstr[1] "{minutes} minuter" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} sekund" msgstr[1] "{seconds} sekunder" #: cozy/tools.py:102 msgid "finished" msgstr "slutfört" #: cozy/tools.py:126 msgid "never" msgstr "aldrig" #: cozy/tools.py:128 msgid "today" msgstr "idag" #: cozy/tools.py:130 msgid "yesterday" msgstr "igår" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s dagar sedan" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} vecka sedan" msgstr[1] "{weeks} veckor sedan" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} månad sedan" msgstr[1] "{months} månader sedan" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} år sedan" msgstr[1] "{years} år sedan" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "Nerladdat" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "Ladda ner" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Under en uppdatering av databasen uppstod ett fel och Cozy kommer inte att kunna starta. En säkerhetskopia av databasen skapades före uppdateringen och har nu återställts. Använd version 0.9.5 av Cozy, tills detta problem har lösts.\n" "Du kan hjälpa till att lösa problemet genom att rapportera det på GitHub." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "Kunde inte uppdatera databasen" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "Stäng Cozy" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "Få hjälp på GitHub" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "Vill du ta bort ljudboken?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" "Denna ljudbok kommer att tas bort från din hårddisk och från Cozys " "bibliotek." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "Avbryt" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "Ta bort ljudbok" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "Skiva" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "Filen hittades inte" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Denna fil hittades inte. Vill du lokalisera den manuellt?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "Plats" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "Hitta saknad fil" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "{ext} filer" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "Ljudfiler" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "Detta kan ha flera orsaker:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "Ljudformatet stöds inte" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "Sökvägen eller filnamnet innehåller icke-UTF-8-tecken" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "Filen/Filerna är inte giltiga ljudfiler" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "Filen/Filerna är skadade" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "Vissa filer kunde inte importeras" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "OK" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "Patreon-supportrar" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "m4b-kapitelstöd i mutagen" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "Öppen källkodsprojekt" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "Åke Engelbrektson" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "Markera som läst" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "Öppna i filhanterare" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "Ta bort från biblioteket" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "Spela upp denna bok" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "Inaktiverad" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "Grundläggande felrapportering" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "Detaljerad felrapportering" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "Detaljerad felrapportering med importfel" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "Ingen fel eller kraschrapportering." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "" "Följande information kommer att skickas vid eventuellt fel eller krasch:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "Vilken typ av fel uppstod" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "kodrad där ett fel uppstod" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "Cozys version" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "Linux-distribution" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "Skrivbordsmiljö" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "Typ av mediefil som Cozy inte kunde importera" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Alla" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Visa alla böcker" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "Hoppa till {artist_name}" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "min" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "Av" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "Ange ljudboksmapp" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "Extern enhet" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "Intern disk" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "Uppdaterar ljudbokskollektionen" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "Kopierar nya filer..." #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "Ändrar ljudboksplats…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "Spela" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Återstår" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "Sammanlagt" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Senast spelad" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "Publicerad" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "Vissa eller alla filer kan inte hittas till den här boken." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "ej tillgänglig" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "Läser in kapitel, vänta..." #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "Öppna boköversikt" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "Spela upp denna del" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "Återkoppling" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Du kan hjälpa till att förbättra Cozy genom att informera om fel och " "krascher." #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Denna information är frivillig och helt anonym. Vi kommer aldrig att samla " "in personlig data, filer du bifogar eller någon som helst information som " "kan identifiera dig." #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "Cozy är öppen källkod och återkopplingskoden kan inspekteras här:" #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "Källkod på" " GitHub" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "Välj mapp" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "Sidofält av/på" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "Alternativ" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "Öppna inställningsfönstret" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "Sök i ditt bibliotek" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "Öppna sökfönstret" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "Visa förlopp för bakgrundsaktivitet" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "Börja skriv..." #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "_Skanna biblioteket" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "_Dölj icke tillgängliga böcker" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "_Inställningar" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "_Om Cosy" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "A_vsluta" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "Släpp ljudböcker här, för att lägga till dem i ditt bibliotek." #: data/ui/main_window.ui:48 msgid "Library" msgstr "Bibliotek" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "Tidigare" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "Författare" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Lista över författare" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "Uppläsare" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Lista över uppläsare" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "Lista över böcker" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "Inga tidigare böcker ännu" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "Utforska ditt bibliotek genom att växla till författar- eller läsvy." #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "Nu spelas" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "Titel på aktuell ljudbok" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "Titel på aktuell ljudboksdel" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "Spola tillbaka" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "Spola tillbaka uppspelning" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "Starta uppspelning" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "Starta eller pausa uppspelning" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "Spola fram" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "Spola fram uppspelning" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "Volymkontroll" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "Uppspelningshastighet" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "Insomningsur" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "Öppna insomningsfönstret" #: data/ui/preferences.ui:27 msgid "General" msgstr "Allmänt" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Utseende" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "Mörk läge" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "Taggar" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "Växla författare och uppläsare" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "Aktivera om författare och uppläsare visas fel" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "Uppspelning" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "Återuppspela" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Spola tillbaka 30 sekunder i aktuell bok när Cosy startas" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "Varaktighet för bakåtspolning" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "Varaktighet för framspolning" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Tona ut" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "Varaktighet för uttoning" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "Lagring" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Omslag" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "Föredra externa bilder framför inbäddade" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Använd alltid bilder (cover.jpg, *.png, …) om tillgängligt" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "Återkoppling" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "Sök i ditt bibliotek" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "Inget hittades" #: data/ui/search_page.ui:33 msgid "Book" msgstr "Bok" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "Förfluten tid" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "Förfluten tid för aktuell del" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "Hoppa till position i aktuellt kapitel" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "Position för aktuell del i sekunder" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "Återstående tid" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "Återstående tid för aktuell del" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "Lagringsplats" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "Ange som standard" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "Ta bort" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Tidurets varaktighet" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Ange varaktighet för insomningsuret i minuter" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Stoppa efter aktuell kapitel" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "Aktivera systemkraftkontroll" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Typ av åtgärd när insomningstiden gått ut.\n" "\"Stäng av\" försöker stänga av systemet.\n" "\"Viloläge\" försöker försätta datorn i viloläge." #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "Systemkraftåtgärd att utföra" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "Viloläge" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "Stäng av" cozy-1.3.0/po/tr.po000066400000000000000000000456601457036466300141330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2019 # abc Def , 2020 # Bün Colak , 2020 # Oğuzhan KIRLI , 2021 # Veysel Erden, 2022 # Sabri Ünal , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Sabri Ünal , 2024\n" "Language-Team: Turkish (https://app.transifex.com/geigi/teams/78138/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: cozy/application.py:59 msgid "Audiobooks" msgstr "Sesli Kitaplar" #: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Kopyalanıyor" #: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" msgstr "Kopyalanamadı: Sesli kitap dizini salt okunur" #: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" msgstr "Kopyalanamadı: Disk dolu" #: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "Kopyalanamadı: Yeterli izin yok" #: cozy/media/importer.py:121 msgid "Error while importing new files" msgstr "Yeni dosyaları içe aktarırken hata" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} saat" msgstr[1] "{hours} saat" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} dakika" msgstr[1] "{minutes} dakika" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} saniye" msgstr[1] "{seconds} saniye" #: cozy/tools.py:102 msgid "finished" msgstr "bitti" #: cozy/tools.py:126 msgid "never" msgstr "hiçbir zaman" #: cozy/tools.py:128 msgid "today" msgstr "bugün" #: cozy/tools.py:130 msgid "yesterday" msgstr "dün" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s gün önce" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} hafta önce" msgstr[1] "{weeks} hafta önce" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} ay önce" msgstr[1] "{months} ay önce" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} yıl önce" msgstr[1] "{years} yıl önce" #: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "İndirildi" #: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "İndir" #: cozy/ui/db_migration_failed_view.py:6 msgid "" "During an update of the database an error occurred and Cozy will not be able" " to startup. A backup of the database was created before the update and has " "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" "Veri tabanı güncellenirken hata oluştu ve Cozy başlatılamıyor. Veri " "tabanının bir yedeği güncelleme işleminden önce oluşturuldu ve şimdi geri " "yüklendi. Bu sorun düzeltilene kadar lütfen Cozy'nin 0.9.5 sürümünü " "kullanın. Bu problemin düzelmesine GitHub'ta bir hata kaydı açarak yardımcı " "olabilirsiniz." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" msgstr "Veri Tabanı Güncellenemedi" #: cozy/ui/db_migration_failed_view.py:22 msgid "Close Cozy" msgstr "Cozy'yi Kapat" #: cozy/ui/db_migration_failed_view.py:23 msgid "Receive help on GitHub" msgstr "GitHub'ta yardım al" #: cozy/ui/delete_book_view.py:13 msgid "Delete Audiobook?" msgstr "Sesli Kitap Silinsin Mi?" #: cozy/ui/delete_book_view.py:14 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "Bu sesli kitap sabit diskinden ve Cozy kitaplığından kaldırılacak." #: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 msgid "Cancel" msgstr "İptal" #: cozy/ui/delete_book_view.py:22 msgid "Remove Audiobook" msgstr "Sesli Kitabı Kaldır" #: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "Disk" #: cozy/ui/file_not_found_dialog.py:18 msgid "File not found" msgstr "Dosya bulunamadı" #: cozy/ui/file_not_found_dialog.py:19 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Dosya bulunamadı. Yerini belirlemek ister misiniz?" #: cozy/ui/file_not_found_dialog.py:27 msgid "Locate" msgstr "Yer belirle" #: cozy/ui/file_not_found_dialog.py:38 msgid "Locate Missing File" msgstr "Kayıp Dosyayı Bul" #: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format msgid "{ext} files" msgstr "{ext} dosyaları" #: cozy/ui/file_not_found_dialog.py:44 msgid "Audio files" msgstr "Ses dosyaları" #: cozy/ui/import_failed_dialog.py:8 msgid "This can have multiple reasons:" msgstr "Bunun pek çok sebebi olabilir:" #: cozy/ui/import_failed_dialog.py:11 msgid "The audio format is not supported" msgstr "Ses biçimi desteklenmiyor" #: cozy/ui/import_failed_dialog.py:12 msgid "The path or filename contains non utf-8 characters" msgstr "Yol ya da dosya adı utf-8 olmayan karakter içeriyor" #: cozy/ui/import_failed_dialog.py:13 msgid "The file(s) are no valid audio files" msgstr "Dosya(lar) geçerli ses dosyası değil" #: cozy/ui/import_failed_dialog.py:14 msgid "The file(s) are corrupt" msgstr "Dosya(lar) bozuk" #: cozy/ui/import_failed_dialog.py:28 msgid "Some files could not be imported" msgstr "Bazı dosyalar içe aktarılamadı" #: cozy/ui/import_failed_dialog.py:35 msgid "Ok" msgstr "Tamam" #: cozy/ui/main_view.py:198 msgid "Patreon Supporters" msgstr "Patreon Destekçileri" #: cozy/ui/main_view.py:202 msgid "m4b chapter support in mutagen" msgstr "mutagen içinde m4b bölüm desteği" #: cozy/ui/main_view.py:206 msgid "Open Source Projects" msgstr "Açık Kaynak Projeler" #. Translators: Replace "translator-credits" with your names, one name per #. line #: cozy/ui/main_view.py:211 msgid "translator-credits" msgstr "" "Cozy Uygulamasına Gönül Verenler\n" "Sabri Ünal, 2024" #: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" msgstr "Okundu imle" #: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "Dosya görüntüleyicide aç" #: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" msgstr "Kitaplıktan kaldır" #: cozy/ui/widgets/book_row.py:25 msgid "Play this book" msgstr "Bu kitabı oynat" #: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" msgstr "Devre dışı" #: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "Temel hata raporlama" #: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "Ayrıntılı hata raporlama" #: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "İçe aktarma hataları ile ayrıntılı hata raporlama" #: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "Hata ya da çökme raporu yok." #: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" msgstr "Hata ya da çökme durumunda aşağıdaki bilgiler gönderilecek:" #: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" msgstr "Hangi tip hata oluştur" #: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" msgstr "Hatanın oluştuğu kod satırı" #: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" msgstr "Cozy sürümü" #: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "Linux dağıtımı" #: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "Masaüstü ortamı" #: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" msgstr "Cozy'nin içe aktaramadığı ortam türü dosyaları" #: cozy/ui/widgets/filter_list_box.py:18 #: cozy/view_model/library_view_model.py:45 #: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Tümü" #: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Tüm kitapları göster" #: cozy/ui/widgets/search_results.py:13 #, python-brace-format msgid "Jump to {artist_name}" msgstr "{artist_name} git" #: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "dk" #: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "Kapat" #: cozy/ui/widgets/storages.py:11 msgid "Set Audiobooks Directory" msgstr "Sesli Kitaplar Dizinini Ayarla" #: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" msgstr "Harici sürücü" #: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "Dahili sürücü" #: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" msgstr "Sesli kitap koleksiyonu yenileniyor" #: cozy/view_model/headerbar_view_model.py:87 #: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" msgstr "Yeni dosyalar kopyalanıyor..." #: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" msgstr "Sesli kitap konumu değiştiriliyor…" #: data/ui/album_element.ui:47 msgid "Play" msgstr "Oynat" #: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Kalan" #: data/ui/book_detail.ui:195 msgid "Total" msgstr "Toplam" #: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Son oynatılan" #: data/ui/book_detail.ui:221 msgid "Published" msgstr "Yayınlayan" #: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." msgstr "Bu kitabın tüm ya da bazı sayfaları bulunamadı." #: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "erişilemez" #: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." msgstr "Bölümler yükleniyor, lütfen bekleyin..." #: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "Kitap genel görünümünü aç" #: data/ui/chapter_element.ui:5 msgid "Play this part" msgstr "Bu bölümü oynat" #: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "Kullanıcı geri bildirimi" #: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" "Hata ve çökme durumunda bilgi sağlayarak Cozy'nin geliştirilmesine yardımcı " "olabilirsiniz. " #: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" "Bu bilgileri sağlamak isteğe bağlıdır ve tamamen anonimdir. Kişisel " "verileri, içe aktardığınız dosyaları ya da sizi tanımlayabilecek herhangi " "bir bilgiyi asla toplanmayacak. " #: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" "Cozy açık kaynak kodludur ve kullanıcı geri bildirim kaynak kodu şuradan " "incelenebilir: " #. Translators: Don't touch the markup. Translate the text "Sourcecode on #. GitHub" only! #: data/ui/error_reporting.ui:94 msgid "" "Sourcecode" " on GitHub" msgstr "" "GitHub " "üstünden kaynak kodu" #: data/ui/first_import_button.ui:12 msgid "Select Folder" msgstr "Klasör Seç" #: data/ui/headerbar.ui:17 msgid "Toggle Filter Sidebar" msgstr "Süzgeç Kenar Çubuğunu Aç/Kapat" #: data/ui/headerbar.ui:22 msgid "Options" msgstr "Seçenekler" #: data/ui/headerbar.ui:26 msgid "Open the options popover" msgstr "Seçenekler açılır kutusunu aç" #: data/ui/headerbar.ui:33 msgid "Search your library" msgstr "Kitaplıkta ara" #: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "Arama açılır kutusunu aç" #: data/ui/headerbar.ui:44 msgid "Display background task progress" msgstr "Arka planda işlemin ilerleyişini göster" #: data/ui/headerbar.ui:67 msgid "Start typing..." msgstr "Yazmaya başlayın..." #: data/ui/headerbar.ui:80 msgid "_Scan Library" msgstr "_Kitaplığı Tara" #: data/ui/headerbar.ui:86 msgid "_Hide unavailable books" msgstr "Kullanılamayan kitapları _gizle" #: data/ui/headerbar.ui:92 msgid "_Preferences" msgstr "_Tercihler" #: data/ui/headerbar.ui:96 msgid "_About Cozy" msgstr "Cozy _Hakkında" #: data/ui/headerbar.ui:102 msgid "_Quit" msgstr "_Çık" #: data/ui/main_window.ui:26 msgid "Drop Audio Books Here to Add Them to Your Library" msgstr "Kitaplığınıza Eklemek İçin Sesli Kitapları Buraya Bırakın" #: data/ui/main_window.ui:48 msgid "Library" msgstr "Kitaplık" #: data/ui/main_window.ui:65 msgid "Recent" msgstr "Son kullanılan" #: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "Yazar" #: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Yazar listesi" #: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "Seslendiren" #: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Seslendiren listesi" #: data/ui/main_window.ui:172 msgid "List of books" msgstr "Kitap listesi" #: data/ui/main_window.ui:194 msgid "No Recent Books Yet" msgstr "Son Kullanılan Kitaplar Yok" #: data/ui/main_window.ui:195 msgid "Explore your library by switching to the Author or Reader view" msgstr "Yazar ya da Seslendiren görünümüne geçerek kitaplığınızı keşfedin" #: data/ui/media_controller.ui:48 msgid "Currently playing" msgstr "Şu anda oynatılan" #: data/ui/media_controller.ui:65 msgid "Title of currently playing book" msgstr "Şu anda oynatılan kitabın başlığı" #: data/ui/media_controller.ui:82 msgid "Title of the currently playing part" msgstr "Şu anda oynatılan bölümün başlığı" #: data/ui/media_controller.ui:111 msgid "Rewind" msgstr "Geri Sar" #: data/ui/media_controller.ui:116 msgid "Rewind playback" msgstr "Oynatmayı geri sar" #: data/ui/media_controller.ui:130 msgid "Start playback" msgstr "Oynatmayı başlat" #: data/ui/media_controller.ui:135 msgid "Start or pause the playback" msgstr "Oynatmayı başlat ya da durdur" #: data/ui/media_controller.ui:148 msgid "Forward" msgstr "İleri" #: data/ui/media_controller.ui:153 msgid "Forward Playback" msgstr "Oynatmayı İleri Sar" #: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "Ses denetimi" #: data/ui/media_controller.ui:202 msgid "Playback speed" msgstr "Oynatma hızı" #: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 msgid "Sleep Timer" msgstr "Uyku Zamanlayıcısı" #: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "Uyku zamanlayıcı açılır kutusunu aç" #: data/ui/preferences.ui:27 msgid "General" msgstr "Genel" #: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Görünüm" #: data/ui/preferences.ui:33 msgid "Dark Mode" msgstr "Koyu Kip" #: data/ui/preferences.ui:40 msgid "Tags" msgstr "Etiketler" #: data/ui/preferences.ui:43 msgid "Swap Author and Reader" msgstr "Yazar ile Seslendireni Yer Değiştir" #: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" msgstr "Yazar ve seslendiren yanlış görüntüleniyorsa etkinleştirin" #: data/ui/preferences.ui:51 msgid "Playback" msgstr "Oynatma" #: data/ui/preferences.ui:54 msgid "Replay" msgstr "Yeniden Oynat" #: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" msgstr "Cozy'yi başlattığınızda geçerli kitabı 30 saniye geri sar" #: data/ui/preferences.ui:60 msgid "Rewind Duration" msgstr "Geri Sarma Süresi" #: data/ui/preferences.ui:69 msgid "Forward Duration" msgstr "İleri Sarma Süresi" #: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Solma" #: data/ui/preferences.ui:88 msgid "Fadeout Duration" msgstr "Solma Süresi" #: data/ui/preferences.ui:104 msgid "Storage" msgstr "Depo" #: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Kapak Resmi" #: data/ui/preferences.ui:110 msgid "Prefer External Images Over Embedded Cover" msgstr "Gömülü Kapak Resmi Yerine Harici Görüntüleri Tercih Et" #: data/ui/preferences.ui:111 msgid "Always use images (cover.jpg, *.png, …) when available" msgstr "Her zaman var olan resimleri kullanın (kapak.jpg, *.png, …)" #: data/ui/preferences.ui:121 msgid "Feedback" msgstr "Geri Bildirim" #: data/ui/search_page.ui:9 msgid "Search in your library" msgstr "Kitaplıkta ara" #: data/ui/search_page.ui:15 msgid "No results found" msgstr "Sonuç bulunamadı" #: data/ui/search_page.ui:33 msgid "Book" msgstr "Kitap" #: data/ui/seek_bar.ui:15 msgid "Elapsed time" msgstr "Geçen zaman" #: data/ui/seek_bar.ui:21 msgid "Elapsed time of current part" msgstr "Geçerli bölümün geçen zamanı" #: data/ui/seek_bar.ui:32 msgid "Jump to position in current chapter" msgstr "Geçerli bölümdeki konuma git" #: data/ui/seek_bar.ui:39 msgid "Position of the current part in seconds" msgstr "Geçerli parçanın saniye cinsinden konumu" #: data/ui/seek_bar.ui:48 msgid "Remaining time" msgstr "Kalan zaman" #: data/ui/seek_bar.ui:53 msgid "Remaining time of current part" msgstr "Geçerli parçanın kalan zamanı" #: data/ui/storage_locations.ui:5 msgid "Storage locations" msgstr "Depolama konumu" #: data/ui/storage_locations.ui:24 msgid "Set as default" msgstr "Öntanımlı olarak ayarla" #: data/ui/storage_locations.ui:28 msgid "Remove" msgstr "Kaldır" #: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Zamanlayıcı süresi" #: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Uyku zamanlayıcı süresini dakika olarak belirle" #: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Geçerli bölümden sonra dur" #: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "Sistem güç kontrolünü etkinleştir" #: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "Zamanlayıcı bittiğinde yapılacak eylemin türü.\n" "\"shutdown\" sisteminizi kapatmayı deneyecektir (güç kapatma olarak da bilinir)\n" "\"suspend\" sisteminizi askıya almaya çalışır (uyku olarak da bilinir)." #: data/ui/timer_popover.ui:129 msgid "System power action to perform" msgstr "Gerçekleştirilecek sistem güç eylemi" #: data/ui/timer_popover.ui:137 msgid "suspend" msgstr "askıya al" #: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "kapat" cozy-1.3.0/po/uk.po000066400000000000000000000566421457036466300141270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: Julian Geywitz , 2021\n" "Language-Team: Ukrainian (https://www.transifex.com/geigi/teams/78138/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "Копіювання" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "хв." #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "Вимк." #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/tools.py:102 msgid "finished" msgstr "завершена" #: cozy/tools.py:126 msgid "never" msgstr "ніколи" #: cozy/tools.py:128 msgid "today" msgstr "сьогодні" #: cozy/tools.py:130 msgid "yesterday" msgstr "вчора" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: cozy/application.py:101 msgid "Audiobooks" msgstr "" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "Слухати цю аудіокнигу" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "Завантажено" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "Завантажити" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "Відкрити огляд книги" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "Відзначити як прочитане" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "Відкрити у файловому браузері" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "Видалити з бібліотеки" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "Всі файли" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "Слухати цю частину" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "Всі" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "Відобразити всі книжки" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "Перейти до автора " #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "Перейти до диктора " #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "Імпорт аудіокниг" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "" #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "Зміна місця розташування книги …" #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "Залишилось" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "Тривалість" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "Останнє програвання" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "Опубліковано" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "" #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "сторінка0" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "Відміна" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "Знайти" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "Файл не знайдено" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "Файл не знайдено. Ви хочете знайти його самостійно?" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "Так" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "Деякі файли не можуть бути імпортовані" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "Останні" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "Список авторів" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "Автор" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "Список дикторів" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "Диктор" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "Список книжок" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "" "Почніть використовувати вашу бібліотеку, перейшовши до вікна \"Автор\" або " "\"Диктор\"." #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "Імпорт аудіокниг" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "" "Cozy аавтоматично імпортує аудіокниги з зазначеного каталога в бібліотеку" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "Автоматично імпортувати нові аудіокниги при запуску програми" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "Перемикач автосканування" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "Drag & Drop" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "Перетягніть аудіокниги в cozy, і вони будуть автоматично імпортовані" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "Розташування аудіокниг" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "Встановити каталог аудіокниг" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "" #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "Пошук" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "Пошукова строка" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "Пошук у вашій аудіобібліотеці" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "Яку книгу ви шукайте?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "Книга" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "Частина" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "Нічого не знайдено :(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "Основні" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "Темний режим" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "Рядок заголовку" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "Зовнішній вигляд" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "Вимкнення системи по таймеру" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "Автоповернення на 30 секунд" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "Автоматичне сканування медіа" #: data/ui/settings.ui:604 msgid "Tags" msgstr "" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "Таймер сну" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "Затухання" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "Тривалість затухання" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "Поведінка" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "Обкладинка" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "Перевага зовнішніх зображеннь над вбудованими обкладинками " #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "Використовувати зображення (cover.jpg, * .png, …), коли вони доступні" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "Розташування аудіокниг" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "Місця зберігання" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "Додати місцеположення" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "Видалити місцеположення" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "Тип місця зберігання внутрішнє/зовнішнє." #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "Встановити за умовчанням для нових аудіокниг" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "" #: data/ui/settings.ui:1576 msgid "Path" msgstr "Шлях" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "Слідувати за символічними посиланнями" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "Бібліотеки" #: data/ui/settings.ui:1715 msgid "Database" msgstr "База даних" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "Примусово оновити базу даних" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "Це оновить метадані всіх імпортованих книг" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "Примусити оновити" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "Розширені" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "Тривалість таймера" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "Повзунок тривалості таймера" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "Установка тривалості таймера сну в хвилинах" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "Зупиніться після поточного розділу" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "_Параметри" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "_Довідка" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "П_ро програму" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "_Вихід" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "Пройдений час" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "Пройшло часу" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "Час, що минув для поточної частини" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "Повзунок положення" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "Положення поточної частини в секундах" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "Час, що залишився" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "Залишилось" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "Час, що залишився для поточної частини" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "Кнопка перемотування" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "Почати програвання" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "Кнопка прогр./паузи" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "Запуск або призупинення програвання" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "Зараз програється" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "Назва аудіокниги" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "Назва поточної аудіокниги" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "Назва частини" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "Назва поточної частини" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "Обробка…" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "В даний момент працює" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "Регулятор гучності" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "Швидкість відтворення" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "Кнопка меню таймера" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "Відкрити вікно таймера сну" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "Пошук у вашій аудіобібліотеці" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "Кнопка меню пошуку" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "Відкрийте пошуковий запит" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "Налаштування" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "Кнопка меню налаштувань" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "Відкрити вікно налаштувань" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/po/zh.po000066400000000000000000000557251457036466300141320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.geigi.cozy package. # FIRST AUTHOR , YEAR. # # Translators: # Julian Geywitz , 2019 # WhiredPlanck , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-25 13:55+0200\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" "Last-Translator: WhiredPlanck , 2021\n" "Language-Team: Chinese (https://www.transifex.com/geigi/teams/78138/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh\n" "Plural-Forms: nplurals=1; plural=0;\n" #: cozy/control/offline_cache.py:201 msgid "Copying" msgstr "副本" #: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 msgid "min" msgstr "秒" #: cozy/ui/widgets/sleep_timer.py:65 msgid "Off" msgstr "关闭" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" msgstr[0] "{hours} 小时" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" msgstr[0] "{minutes} 分钟" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" msgstr[0] "{seconds} 秒" #: cozy/tools.py:102 msgid "finished" msgstr "已完成" #: cozy/tools.py:126 msgid "never" msgstr "从不" #: cozy/tools.py:128 msgid "today" msgstr "今天" #: cozy/tools.py:130 msgid "yesterday" msgstr "昨天" #: cozy/tools.py:132 #, python-format msgid "%s days ago" msgstr "%s 天前" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" msgstr[0] "{weeks} 个星期前" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} 个月前" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" msgstr[0] "{years} 年前" #: cozy/application.py:101 msgid "Audiobooks" msgstr "有声书" #: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 msgid "Play this book" msgstr "朗读这本书" #: cozy/ui/book_detail_view.py:302 msgid "Downloaded" msgstr "已下载" #: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 msgid "Download" msgstr "下载" #: cozy/ui/book_element.py:33 msgid "Open book overview" msgstr "打开书籍概览" #: cozy/ui/book_element.py:113 msgid "Mark as read" msgstr "标记为已读" #: cozy/ui/book_element.py:116 msgid "Open in file browser" msgstr "在文件浏览器中打开" #: cozy/ui/book_element.py:119 msgid "Remove from library" msgstr "从书库中移除" #: cozy/ui/disk_element.py:26 msgid "Disc" msgstr "碟片" #: cozy/ui/file_not_found_dialog.py:56 msgid "All files" msgstr "所有文件" #: cozy/ui/settings.py:103 msgid "Feedback" msgstr "反馈" #: cozy/ui/chapter_element.py:23 msgid "Play this part" msgstr "回放这个部分" #: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 #, python-brace-format msgid "{storage} is offline." msgstr "{storage} 已脱机。" #: cozy/ui/widgets/error_reporting.py:12 msgid "Disabled" msgstr "已禁用" #: cozy/ui/widgets/error_reporting.py:13 msgid "Basic error reporting" msgstr "基本错误报告" #: cozy/ui/widgets/error_reporting.py:14 msgid "Detailed error reporting" msgstr "详细错误报告" #: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 msgid "Detailed error reporting with import errors" msgstr "含有导入错误的详细错误报告" #: cozy/ui/widgets/error_reporting.py:19 msgid "No error or crash reporting." msgstr "未报告有错误或崩溃发生。" #: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 msgid "The following information will be sent in case of an error or crash:" msgstr "在发生错误或崩溃时,将发送以下信息:" #: cozy/ui/widgets/error_reporting.py:25 msgid "Which type of error occurred" msgstr "发生的错误的类型" #: cozy/ui/widgets/error_reporting.py:26 msgid "Line of code where an error occurred" msgstr "使错误发生的代码行号" #: cozy/ui/widgets/error_reporting.py:27 msgid "Cozy's version" msgstr "Cozy 版本" #: cozy/ui/widgets/error_reporting.py:28 msgid "Linux distribution" msgstr "Linux 发行版" #: cozy/ui/widgets/error_reporting.py:29 msgid "Desktop environment" msgstr "桌面环境" #: cozy/ui/widgets/error_reporting.py:30 msgid "Media type of files that Cozy couldn't import" msgstr "Cozy 无法导入的文件的媒体类型" #: cozy/ui/widgets/filter_list_box.py:20 #: cozy/view_model/library_view_model.py:44 #: cozy/view_model/library_view_model.py:140 msgid "All" msgstr "所有" #: cozy/ui/widgets/filter_list_box.py:21 msgid "Display all books" msgstr "显示所有书籍" #: cozy/ui/widgets/search_results.py:73 msgid "Jump to author " msgstr "跳转到作者 " #: cozy/ui/widgets/search_results.py:76 msgid "Jump to reader " msgstr "跳转到朗读者 " #: cozy/view_model/headerbar_view_model.py:75 msgid "Importing Audiobooks" msgstr "导入有声读物" #: cozy/view_model/headerbar_view_model.py:84 #: cozy/view_model/headerbar_view_model.py:100 msgid "Copying new files…" msgstr "正在复制新文件…" #: cozy/view_model/headerbar_view_model.py:91 msgid "Changing audio book location…" msgstr "正在更改有声书目的位置…" #: cozy/model/track.py:38 msgid "Chapter" msgstr "" #: cozy/media/files.py:69 msgid "Cannot copy: Audiobook directory is read only" msgstr "" #: cozy/media/files.py:71 msgid "Cannot copy: Disk is full" msgstr "" #: cozy/media/files.py:73 cozy/media/files.py:89 msgid "Cannot copy: Permission denied" msgstr "" #: data/ui/about.ui:16 msgid "GitHub" msgstr "GitHub" #: data/ui/book_detail.ui:205 msgid "Remaining" msgstr "剩余时间" #: data/ui/book_detail.ui:260 msgid "Total" msgstr "合计时间" #: data/ui/book_detail.ui:276 msgid "Last played" msgstr "上一次播放" #: data/ui/book_detail.ui:292 msgid "Published" msgstr "出版时间" #: data/ui/book_detail.ui:338 msgid "Some or all files of this book cannot be found." msgstr "本书的部分或全部文件无法找到。" #: data/ui/book_detail.ui:361 msgid "unavailable" msgstr "不可用" #: data/ui/book_detail.ui:472 msgid "Loading chapters, please wait..." msgstr "" #: data/ui/book_detail.ui:527 msgid "page0" msgstr "" #: data/ui/error_reporting.ui:23 msgid "User feedback" msgstr "用户反馈" #: data/ui/error_reporting.ui:66 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "您可以通过提供错误和崩溃信息来帮助改进 Cozy。 " #: data/ui/error_reporting.ui:80 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "贡献这些信息是可选的,而且是完全匿名的。我们永远不会收集个人数据、您导入的文件或任何可能识别您身份的信息。" #: data/ui/error_reporting.ui:95 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "Cozy 是开源的,关于用户反馈的源码可以在这里查看: " #: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 msgid "Cancel" msgstr "取消" #: data/ui/file_not_found.ui:32 msgid "Locate" msgstr "定位" #: data/ui/file_not_found.ui:86 msgid "File not found" msgstr "找不到文件" #: data/ui/file_not_found.ui:119 msgid "This file could not be found. Do you want to locate it manually?" msgstr "无法找到此文件。 您想手动找到它吗?" #: data/ui/import_failed.ui:27 msgid "Ok" msgstr "好的" #: data/ui/import_failed.ui:81 msgid "Some files could not be imported" msgstr "有些文件无法导入" #: data/ui/import_failed.ui:134 msgid "" "This can have multiple reasons:\n" "- The audio format is not supported\n" "- The path or filename contains non utf-8 characters\n" "- The file(s) are no valid audio files\n" "- The file(s) are corrupt" msgstr "" "这可能有好几种原因:\n" "- 音频格式不支持\n" "- 路径或文件名中包含非 UTF-8 字符\n" "- 文件不是有效的音频文件\n" "- 文件已损坏" #: data/ui/main_window.ui:125 msgid "Recent" msgstr "最近" #: data/ui/main_window.ui:145 msgid "List of authors" msgstr "作者名单" #: data/ui/main_window.ui:161 data/ui/main_window.ui:271 #: data/ui/search_popover.ui:107 msgid "Author" msgstr "作者" #: data/ui/main_window.ui:181 msgid "List of readers" msgstr "朗读者名单" #: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 msgid "Reader" msgstr "朗读者" #: data/ui/main_window.ui:251 msgid "List of books" msgstr "书目清单" #: data/ui/main_window.ui:301 msgid "Stay tuned while Cozy is preparing your library…" msgstr "稍安勿躁,Cozy 正在准备书库…" #: data/ui/main_window.ui:334 msgid "" "Start exploring your library by switching to the Author or Reader view " "above." msgstr "通过切换到上面的作者或朗读者视图开始探索书库。" #: data/ui/main_window.ui:379 msgid "Import your Audiobooks" msgstr "导入您的有声读物" #: data/ui/main_window.ui:395 msgid "" "Cozy automatically imports your audiobooks in one directory - your library" msgstr "朗读者自动将您的有声读物导入一个目录 - 您的图书目录" #: data/ui/main_window.ui:431 data/ui/main_window.ui:452 msgid "Automatically import new audiobooks on startup" msgstr "在启动时自动导入新的有声读物" #: data/ui/main_window.ui:451 msgid "Auto scan switch" msgstr "自动扫描开关" #: data/ui/main_window.ui:495 msgid "Drag & Drop" msgstr "拖放导入" #: data/ui/main_window.ui:512 msgid "Drag your audiobooks into cozy and they will be automatically imported" msgstr "将您的有声书籍拖入 Cozy,它们将被自动导入" #: data/ui/main_window.ui:535 msgid "Location of your audiobooks" msgstr "你的有声读物的位置" #: data/ui/main_window.ui:556 msgid "Set Audiobooks Directory" msgstr "设定有声书籍目录" #: data/ui/main_window.ui:579 msgid "Load audiobooks from a directory, network drive or an external disk." msgstr "从目录、网络磁盘或外置磁盘中加载有声书籍。" #: data/ui/main_window.ui:597 msgid "You can add more storage locations later in the settings" msgstr "您可以稍后在设置中添加更多存储位置" #: data/ui/search_popover.ui:24 msgid "Search" msgstr "搜索" #: data/ui/search_popover.ui:36 msgid "Search box" msgstr "搜索框" #: data/ui/search_popover.ui:37 msgid "Search your audiobook library" msgstr "在您的书库中搜索" #: data/ui/search_popover.ui:67 msgid "Which book are you looking for?" msgstr "哪本书是您需要看的?" #: data/ui/search_popover.ui:154 msgid "Book" msgstr "书" #: data/ui/search_popover.ui:248 msgid "Part" msgstr "章节" #: data/ui/search_popover.ui:295 msgid "Nothing found :(" msgstr "什么也么找到:(" #: data/ui/settings.ui:111 data/ui/settings.ui:382 msgid "General" msgstr "常规" #: data/ui/settings.ui:156 msgid "Dark Mode" msgstr "暗色模式" #: data/ui/settings.ui:232 msgid "Titlebar" msgstr "标题栏" #: data/ui/settings.ui:277 msgid "Display the whole book instead of the current chapter" msgstr "显示全书名而非当前章节名" #: data/ui/settings.ui:340 msgid "Appearance" msgstr "外观" #: data/ui/settings.ui:425 msgid "Suspend system on timer" msgstr "系统挂起定时器" #: data/ui/settings.ui:485 msgid "Replay 30 seconds" msgstr "重播30秒" #: data/ui/settings.ui:545 msgid "Automatic media scan" msgstr "自动媒体扫描" #: data/ui/settings.ui:604 msgid "Tags" msgstr "标签" #: data/ui/settings.ui:656 msgid "Swap author and reader" msgstr "交换作者和朗读者" #: data/ui/settings.ui:669 msgid "Activate this if author and reader are displayed the wrong way" msgstr "如果作者和朗读者不能正确显示,请激活此选项" #: data/ui/settings.ui:694 msgid "switch author and reader assignment" msgstr "调换作者和朗读者的任务" #: data/ui/settings.ui:743 msgid "Playback" msgstr "" #: data/ui/settings.ui:789 msgid "Rewind duration" msgstr "" #: data/ui/settings.ui:874 msgid "Forward duration" msgstr "" #: data/ui/settings.ui:956 data/ui/headerbar.ui:415 msgid "Sleep timer" msgstr "睡眠计时器" #: data/ui/settings.ui:1001 msgid "Fadeout" msgstr "淡出" #: data/ui/settings.ui:1063 msgid "Fadeout duration" msgstr "淡出时长" #: data/ui/settings.ui:1144 msgid "Behaviour" msgstr "行为" #: data/ui/settings.ui:1171 msgid "Artwork" msgstr "插图" #: data/ui/settings.ui:1223 msgid "Prefer external images over embedded cover" msgstr "外部图像优先于内嵌封面" #: data/ui/settings.ui:1236 msgid "Use images (cover.jpg, *.png, …) when available" msgstr "如有,则使用图片(cover.jpg, *.png, ...)" #: data/ui/settings.ui:1319 msgid "Audio books location" msgstr "有声书目位置" #: data/ui/settings.ui:1335 msgid "Storage locations" msgstr "存储位置" #: data/ui/settings.ui:1393 msgid "Add location" msgstr "添加位置" #: data/ui/settings.ui:1418 data/ui/settings.ui:1613 msgid "Remove location" msgstr "移除位置" #: data/ui/settings.ui:1454 msgid "Toggle this storage location to be internal/external." msgstr "将此存储位置切换为内置/外置类型。" #: data/ui/settings.ui:1480 msgid "Set as default storage location for new audiobooks" msgstr "设为新有声书籍的默认存储位置" #: data/ui/settings.ui:1532 msgid "Ignore list" msgstr "忽略列表" #: data/ui/settings.ui:1576 msgid "Path" msgstr "路径" #: data/ui/settings.ui:1659 msgid "Follow symlinks" msgstr "符号链接" #: data/ui/settings.ui:1691 msgid "Storage" msgstr "存储" #: data/ui/settings.ui:1715 msgid "Database" msgstr "数据库" #: data/ui/settings.ui:1767 msgid "Force refresh the database" msgstr "强制刷新数据库" #: data/ui/settings.ui:1780 msgid "This will force update the metadata of all imported books" msgstr "这将会强制更新所有已导入书目的元数据" #: data/ui/settings.ui:1800 msgid "Force refresh" msgstr "强制刷新" #: data/ui/settings.ui:1856 msgid "Advanced" msgstr "高级" #: data/ui/timer_popover.ui:37 msgid "Timer duration" msgstr "计时器时间" #: data/ui/timer_popover.ui:49 msgid "Timer duration slider" msgstr "计时器滑块" #: data/ui/timer_popover.ui:50 msgid "Set the sleep timer duration in minutes" msgstr "以分钟为单位设置睡眠定时器的时间" #: data/ui/timer_popover.ui:116 msgid "Stop after current chapter" msgstr "播放完当前章节后停止" #: data/ui/timer_popover.ui:164 msgid "Enable system power control" msgstr "启用系统电源控制" #: data/ui/timer_popover.ui:201 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" "计时器结束时执行的操作类型。\n" "“关机” 会尝试关闭您的系统(即所谓关闭电源)\n" "“挂起” 会尝试挂起您的系统(即所谓进入睡眠)。" #: data/ui/timer_popover.ui:205 msgid "" "System power action\n" "to perform" msgstr "" "要执行的\n" "系统电源操作" #: data/ui/timer_popover.ui:221 msgid "suspend" msgstr "挂起" #: data/ui/timer_popover.ui:237 msgid "shutdown" msgstr "关机" #: data/ui/titlebar_menu.ui:7 msgid "_Scan Library" msgstr "扫描书库(_S)" #: data/ui/titlebar_menu.ui:13 msgid "_Hide unavailable books" msgstr "隐藏不可用的书目(_H)" #: data/ui/titlebar_menu.ui:19 msgid "_Preferences" msgstr "偏好设置" #: data/ui/titlebar_menu.ui:25 msgid "_Help" msgstr "帮助(_H)" #: data/ui/titlebar_menu.ui:29 msgid "_About" msgstr "关于(_A)" #: data/ui/titlebar_menu.ui:33 msgid "_Quit" msgstr "退出(_Q)" #: data/ui/whats_new.ui:8 msgid "Whats new?" msgstr "有什么新功能?" #: data/ui/whats_new.ui:21 msgid "Continue" msgstr "继续" #: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 #: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 msgid "What's new in Cozy" msgstr "" #: data/ui/whats_new_importer.ui:52 msgid "A completely rewritten and far more reliable media importer." msgstr "一个完全重写并且更加可靠的媒体导入器。" #: data/ui/whats_new_importer.ui:77 msgid "" "Did you experience audio files that couldn't be imported? Drag & Drop those " "files onto Cozy or use the application menu in the titlebar to rescan your " "audiobook directories!" msgstr "您有遇到音频文件无法导入的情况吗?拖放这些文件到 Cozy 中或者使用标题栏中的应用菜单来重新扫描有声书籍目录!" #: data/ui/whats_new_importer.ui:92 msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." msgstr "当前支持媒体文件格式为 mp3、m4a、flac、ogg、opus 和 wav。" #: data/ui/whats_new_importer.ui:107 msgid "More to come in a later update." msgstr "更多尽在后续更新。" #: data/ui/whats_new_m4b.ui:52 msgid "Basic support for m4b audio books." msgstr "对 m4b 格式有声书籍的基本支持。" #: data/ui/whats_new_m4b.ui:77 msgid "" "Many of you have been waiting for it: Support for m4b audio books! This " "version features basic support for m4b files without chapter support." msgstr "很多人都在期待:支持 m4b 音频书籍!此版本的特点是基本支持 m4b 文件(但不支持章节)。" #: data/ui/whats_new_m4b.ui:92 msgid "" "Drag & Drop your m4b files onto Cozy or use the application menu in the " "titlebar to rescan your audiobook directories." msgstr "拖放 m4b 文件到 Cozy 中或者使用标题栏中的应用菜单来重新扫描有声书籍目录。" #: data/ui/whats_new_m4b.ui:107 msgid "Chapter support will follow in a later update. Stay tuned!" msgstr "章节支持将在以后的更新中陆续推出。敬请期待!" #: data/ui/whats_new_m4b_chapter.ui:52 msgid "Chapter support for m4b audio books." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:77 msgid "This version of Cozy features chapter support for m4b audio books!" msgstr "" #: data/ui/whats_new_m4b_chapter.ui:92 msgid "" "If you already have m4b files imported you'll need to start a scan of your " "library from the app menu." msgstr "" #: data/ui/whats_new_m4b_chapter.ui:107 msgid "The chapters will then be detected." msgstr "" #: data/ui/whats_new_library.ui:52 msgid "An important change in library management" msgstr "" #: data/ui/whats_new_library.ui:77 msgid "" "Previously every file which was imported in your library but couldn't be " "found anymore was removed from the library during a scan." msgstr "" #: data/ui/whats_new_library.ui:92 msgid "" "Now audiobooks are not removed from your library automatically anymore. This" " prevents accidentally loosing the progress of a audiobook when a file can't" " be found temporarily." msgstr "" #: data/ui/whats_new_library.ui:107 msgid "" "To remove an audiobook from the library simply right-click on it and choose " "the remove from library option." msgstr "" #: data/ui/seek_bar.ui:20 msgid "Elapsed time" msgstr "所需时间" #: data/ui/seek_bar.ui:28 msgid "Time elapsed" msgstr "已用时间" #: data/ui/seek_bar.ui:29 msgid "Elapsed time of current part" msgstr "正在朗读部分已用时间" #: data/ui/seek_bar.ui:45 msgid "Jump to position in current chapter" msgstr "跳至当前章节朗读位置" #: data/ui/seek_bar.ui:56 msgid "Position slider" msgstr "位置滑块" #: data/ui/seek_bar.ui:57 msgid "Position of the current part in seconds" msgstr "当前部分的位置,以秒为单位" #: data/ui/seek_bar.ui:76 msgid "Remaining time" msgstr "剩余时间" #: data/ui/seek_bar.ui:83 msgid "Time remaining" msgstr "时间剩余" #: data/ui/seek_bar.ui:84 msgid "Remaining time of current part" msgstr "正在朗读部分已用时间" #: data/ui/headerbar.ui:123 msgid "Rewind" msgstr "" #: data/ui/headerbar.ui:131 msgid "Rewind button" msgstr "倒带按钮" #: data/ui/headerbar.ui:132 msgid "Rewind playback" msgstr "" #: data/ui/headerbar.ui:149 msgid "Start playback" msgstr "开始回放" #: data/ui/headerbar.ui:157 msgid "Play/Pause Button" msgstr "播放/暂停按钮" #: data/ui/headerbar.ui:158 msgid "Start or pause the playback" msgstr "开始或暂停播放" #: data/ui/headerbar.ui:174 msgid "Forward" msgstr "" #: data/ui/headerbar.ui:182 msgid "Forward button" msgstr "" #: data/ui/headerbar.ui:183 msgid "Forward Playback" msgstr "" #: data/ui/headerbar.ui:214 msgid "Warnings" msgstr "警告" #: data/ui/headerbar.ui:259 msgid "Currently playing" msgstr "正在播放" #: data/ui/headerbar.ui:275 msgid "Booktitle" msgstr "书名" #: data/ui/headerbar.ui:276 msgid "Title of currently playing book" msgstr "当前正在播放的书的书名" #: data/ui/headerbar.ui:302 msgid "Part name" msgstr "章节名字" #: data/ui/headerbar.ui:303 msgid "Title of the currently playing part" msgstr "当前播放部分的书名" #: data/ui/headerbar.ui:336 msgid "Working…" msgstr "进行中…" #: data/ui/headerbar.ui:340 msgid "Currently working" msgstr "正在进行" #: data/ui/headerbar.ui:357 msgid "Volume control" msgstr "音量控制" #: data/ui/headerbar.ui:394 msgid "Playback speed" msgstr "播放速度" #: data/ui/headerbar.ui:425 msgid "Timer menu button" msgstr "定时器菜单按钮" #: data/ui/headerbar.ui:426 msgid "Open the sleep timer popover" msgstr "打开睡眠计时器弹出窗口" #: data/ui/headerbar.ui:442 msgid "Search your library" msgstr "在您的书库中查找" #: data/ui/headerbar.ui:452 msgid "Search menu button" msgstr "搜索菜单按钮" #: data/ui/headerbar.ui:453 msgid "Open the search popover" msgstr "打开搜索弹出窗口" #: data/ui/headerbar.ui:468 msgid "Options" msgstr "显示选项" #: data/ui/headerbar.ui:479 msgid "Options menu button" msgstr "显示选项按钮" #: data/ui/headerbar.ui:480 msgid "Open the options popover" msgstr "打开显示选项弹出窗口" #: data/ui/delete_book_dialog.ui:45 msgid "Delete Audiobook" msgstr "删除有声书" #: data/ui/delete_book_dialog.ui:105 msgid "Are you sure you want to delete the selected audiobook?" msgstr "确定要删除选定的有声书吗?" #: data/ui/delete_book_dialog.ui:126 msgid "The audiobook will be removed from your disk and from Cozy's library." msgstr "此有声书将从您的磁盘和 Cozy 书库中移除。" #: data/ui/db_migration_failed.ui:31 msgid "Close Cozy" msgstr "" #: data/ui/db_migration_failed.ui:47 msgid "Recieve help on GitHub" msgstr "" #: data/ui/db_migration_failed.ui:108 msgid "An error occured while updating the database" msgstr "" #: data/ui/db_migration_failed.ui:129 msgid "" "During an update of the database an error occurred and Cozy will not be able to startup.\n" "A backup of the database was created before the update and has been restored now.\n" "Until this issue is resolved please use version 0.9.5 of Cozy.\n" "You can help resolve this problem by reporting an issue on GitHub." msgstr "" cozy-1.3.0/pyproject.toml000066400000000000000000000004111457036466300154250ustar00rootroot00000000000000[tool.black] line-length = 100 skip-magic-trailing-comma = true [tool.isort] line_length = 100 profile = "black" multi_line_output = 3 [tool.ruff] line-length = 100 builtins = ["_"] output-format = "github" extend-select = ["B", "SIM", "PIE", "C4", "INT", "LOG"] cozy-1.3.0/requirements.txt000066400000000000000000000000531457036466300157770ustar00rootroot00000000000000distro mutagen peewee>=3.9.6 pytz requests cozy-1.3.0/test/000077500000000000000000000000001457036466300134745ustar00rootroot00000000000000cozy-1.3.0/test/__init__.py000066400000000000000000000000001457036466300155730ustar00rootroot00000000000000cozy-1.3.0/test/books.json000066400000000000000000000037561457036466300155170ustar00rootroot00000000000000[ { "id": 1, "name": "Test Book", "author": "Test Author", "reader": "Test Reader", "position": 0, "rating": 0 }, { "id": 2, "name": "Harry Potter and the Philosophers Stone", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 3, "name": "Harry Potter and the Order of the Phoenix", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 4, "name": "Harry Potter And The Deathly Hallows", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 5, "name": "Harry Potter and the Chamber of Secrets", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 6, "name": "Harry Potter and the Prisoner of Azkaban", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 7, "name": "Harry Potter and the Goblet of Fire", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 8, "name": "Harry Potter and the Half-Blood Prince", "author": "J. K. Rowling", "reader": "Stephen Fry", "position": 0, "rating": 0 }, { "id": 9, "name": "20.000 Meilen unter den Meeren", "author": "Jules Verne", "reader": "Ernst Jacobi, Gottfried John, Hermann Lause, Peter Gavajda (Sprecher)", "position": 222, "rating": 0 }, { "id": 10, "name": "This is a book without tracks", "author": "Test", "reader": "Test", "position": 0, "rating": 0 }, { "id": 11, "name": "This is a book with multiple chapters in a single file", "author": "Test", "reader": "Test", "position": 0, "rating": 0 }, { "id": 12, "name": "This is a book no chapter names", "author": "Test", "reader": "Test", "position": 0, "rating": 0 } ]cozy-1.3.0/test/conftest.py000066400000000000000000000076741457036466300157110ustar00rootroot00000000000000import json import os import pytest import gi gi.require_version('Gtk', '4.0') gi.require_version('Gdk', '4.0') gi.require_version('Adw', '1') gi.require_version('Gst', '1.0') gi.require_version('GstPbutils', '1.0') @pytest.fixture(scope='session', autouse=True) def install_l10n(): import gettext as g trans = g.translation('spam', 'locale', fallback=True) trans.install('gettext') def chunks(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n] @pytest.fixture(scope="function") def peewee_database(): from cozy.db.track import Track from cozy.db.book import Book from cozy.db.settings import Settings from cozy.db.storage_blacklist import StorageBlackList from cozy.db.storage import Storage from cozy.db.file import File from cozy.db.track_to_file import TrackToFile db_path, models, test_db = prepare_db() path_of_test_folder = os.path.dirname(os.path.realpath(__file__)) + '/' with open(path_of_test_folder + 'books.json') as json_file: book_data = json.load(json_file) with open(path_of_test_folder + 'tracks.json') as json_file: track_data = json.load(json_file) with open(path_of_test_folder + 'files.json') as json_file: file_data = json.load(json_file) with open(path_of_test_folder + 'track_to_file.json') as json_file: track_to_file_data = json.load(json_file) Book.insert_many(book_data).execute() for chunk in chunks(track_data, 25): Track.insert_many(chunk).execute() for chunk in chunks(file_data, 25): File.insert_many(chunk).execute() for chunk in chunks(track_to_file_data, 25): TrackToFile.insert_many(chunk).execute() with open(path_of_test_folder + 'storages.json') as json_file: storage_data = json.load(json_file) Storage.insert_many(storage_data).execute() Settings.create(path="", last_played_book=Book.get()) StorageBlackList.create(path="/path/to/replace/test1.mp3") StorageBlackList.create(path="/path/to/not/replace/test2.mp3") print("Provide database...") yield test_db teardown_db(db_path, models, test_db) @pytest.fixture(scope="function") def peewee_database_storage(): from cozy.db.storage import Storage from cozy.db.settings import Settings from cozy.db.storage_blacklist import StorageBlackList db_path, models, test_db = prepare_db() path_of_test_folder = os.path.dirname(os.path.realpath(__file__)) + '/' with open(path_of_test_folder + 'storages.json') as json_file: storage_data = json.load(json_file) Storage.insert_many(storage_data).execute() Settings.create(path="", last_played_book=None) StorageBlackList.create(path="/path/to/replace/test1.mp3") StorageBlackList.create(path="/path/to/not/replace/test2.mp3") print("Provide database...") yield test_db teardown_db(db_path, models, test_db) def teardown_db(db_path, models, test_db): print("Teardown database...") test_db.drop_tables(models) test_db.close() def prepare_db(): from playhouse.pool import PooledSqliteDatabase from cozy.db.artwork_cache import ArtworkCache from cozy.db.book import Book from cozy.db.offline_cache import OfflineCache from cozy.db.settings import Settings from cozy.db.storage import Storage from cozy.db.storage_blacklist import StorageBlackList from cozy.db.track import Track from cozy.db.file import File from cozy.db.track_to_file import TrackToFile from cozy.db.collation import collate_natural models = [Track, Book, File, TrackToFile, Settings, ArtworkCache, Storage, StorageBlackList, OfflineCache] print("Setup database...") db_path = ':memory:' test_db = PooledSqliteDatabase(db_path, pragmas=[('journal_mode', 'wal')]) test_db.bind(models, bind_refs=False, bind_backrefs=False) test_db.connect() test_db.create_tables(models) test_db.register_collation(collate_natural) return db_path, models, test_db cozy-1.3.0/test/cozy/000077500000000000000000000000001457036466300144605ustar00rootroot00000000000000cozy-1.3.0/test/cozy/__init__.py000066400000000000000000000000001457036466300165570ustar00rootroot00000000000000cozy-1.3.0/test/cozy/extensions/000077500000000000000000000000001457036466300166575ustar00rootroot00000000000000cozy-1.3.0/test/cozy/extensions/__init__.py000066400000000000000000000000001457036466300207560ustar00rootroot00000000000000cozy-1.3.0/test/cozy/extensions/test_is_same_book.py000066400000000000000000000014261457036466300227250ustar00rootroot00000000000000from cozy.extensions.is_same_book import is_same_book def test_books_with_identical_spelling_are_same(): book_a = "Dummy Book Title" book_b = "Dummy Book Title" result = is_same_book(book_a, book_b) assert result is True def test_books_with_inconsistent_spelling_are_same(): book_a = "Dummy Book Title" book_b = "Dummy book title" result = is_same_book(book_a, book_b) assert result is True def test_different_books_are_not_same(): book_a = "First Dummy Book Title" book_b = "Second Dummy Book Title" result = is_same_book(book_a, book_b) assert result is False def test_books_without_title_are_not_same(): book_a = "First Dummy Book Title" book_b = "" result = is_same_book(book_a, book_b) assert result is False cozy-1.3.0/test/cozy/extensions/test_set.py000066400000000000000000000020371457036466300210650ustar00rootroot00000000000000from cozy.extensions.set import split_strings_to_set def test_split_strings_does_nothing_for_non_seperated_element(): test = "This is a nice test. Nothing should be splitted." result = split_strings_to_set({test}) assert {test} == result def test_split_strings_are_splitted(): test = "This/is&a,test;splitting" how_it_should_be = {"This", "is", "a", "test", "splitting"} result = split_strings_to_set({test}) assert how_it_should_be == result def test_split_strings_are_splitted_and_whitespace_is_removed(): test = "This / is & a , test ; splitting " how_it_should_be = {"This", "is", "a", "test", "splitting"} result = split_strings_to_set({test}) assert how_it_should_be == result def test_split_strings_are_splitted_and_dots_are_not_splitted(): test = "This Dr. Prof. L. Lala / is & a , test ; splitting " how_it_should_be = {"This Dr. Prof. L. Lala", "is", "a", "test", "splitting"} result = split_strings_to_set({test}) assert how_it_should_be == result cozy-1.3.0/test/cozy/media/000077500000000000000000000000001457036466300155375ustar00rootroot00000000000000cozy-1.3.0/test/cozy/media/__init__.py000066400000000000000000000000001457036466300176360ustar00rootroot00000000000000cozy-1.3.0/test/cozy/media/test_files.py000066400000000000000000000011661457036466300202560ustar00rootroot00000000000000def test_update_copy_status_emits_1_for_zero_files(mocker): from cozy.media.files import Files files = Files() spy = mocker.spy(files, "emit_event_main_thread") files._file_count = 0 files._update_copy_status(1, 2, None) spy.assert_called_once_with("copy-progress", 1.0) def test_update_copy_status_emits_1_for_zero_byte_files(mocker): from cozy.media.files import Files files = Files() spy = mocker.spy(files, "emit_event_main_thread") files._file_count = 1 files._file_progess = 1 files._update_copy_status(0, 0, None) spy.assert_called_once_with("copy-progress", 1.0) cozy-1.3.0/test/cozy/media/test_importer.py000066400000000000000000000137431457036466300210210ustar00rootroot00000000000000from unittest.mock import MagicMock, call import pytest from peewee import SqliteDatabase from cozy.ext import inject from cozy.media.media_file import MediaFile from cozy.model.library import Library @pytest.fixture(autouse=True) def setup_inject(peewee_database_storage): inject.clear_and_configure(lambda binder: binder .bind(SqliteDatabase, peewee_database_storage) .bind_to_constructor("FilesystemMonitor", MagicMock()) .bind_to_constructor(Library, MagicMock())) yield inject.clear() def test_external_paths_are_excluded_when_offline(mocker): from cozy.media.importer import Importer from cozy.db.storage import Storage mocker.patch("os.path.exists", return_value=True) mocker.patch("cozy.control.filesystem_monitor.FilesystemMonitor.is_storage_online", autospec=True, return_value=False) importer = Importer() paths_to_import = importer._get_configured_storage_paths() internal_storages_in_db = Storage.select().where(Storage.external is not False) internal_storage_paths = [storage.path for storage in internal_storages_in_db] assert len(internal_storage_paths) == len(paths_to_import) assert all([a == b for a, b in zip(internal_storage_paths, paths_to_import)]) def test_paths_not_existing_are_excluded(mocker): from cozy.media.importer import Importer mocker.patch("os.path.exists", return_value=False) importer = Importer() paths_to_import = importer._get_configured_storage_paths() assert len(paths_to_import) == 0 def test_all_existing_paths_are_included(mocker): from cozy.media.importer import Importer from cozy.db.storage import Storage mocker.patch("os.path.exists", return_value=True) importer = Importer() paths_to_import = importer._get_configured_storage_paths() internal_storages_in_db = Storage.select() internal_storage_paths = [storage.path for storage in internal_storages_in_db] assert len(internal_storage_paths) == len(paths_to_import) assert all([a == b for a, b in zip(internal_storage_paths, paths_to_import)]) def test_import_file_returns_false_for_directory(mocker): from cozy.media.importer import import_file mocker.patch("os.path.isfile", return_value=False) imported = import_file(MagicMock()) assert not imported def test_filter_unchanged_files_returns_only_new_or_changed_files(mocker): from cozy.media.importer import Importer example_chapters = [] mocker.patch("cozy.model.library.Library.chapters") mocker.patch("os.path.getmtime", return_value=100) importer = Importer() def test_scan_emits_start_event(mocker): from cozy.media.importer import Importer, ScanStatus importer = Importer() spy = mocker.spy(importer, "emit_event_main_thread") importer.scan() spy.assert_has_calls(calls=[call("scan", ScanStatus.STARTED), call('scan-progress', 0.025), call('scan-progress', 0.05), call('scan-progress', 1.0), call("scan", ScanStatus.SUCCESS), call("new-or-updated-files", set())]) def test_scan_returns_file_names_that_could_not_be_imported(mocker): from cozy.media.importer import Importer files = {"1", "2"} class Mock: def get(self): return {"1", "2"} mocker.patch("multiprocessing.pool.Pool.map_async", return_value=Mock()) mocker.patch("cozy.media.importer.Importer._wait_for_job_to_complete") mocker.patch("cozy.model.database_importer.DatabaseImporter.insert_many") importer = Importer() _, not_imported = importer._execute_import(files) assert not_imported == files def test_scan_returns_none_for_non_audio_files(mocker): from cozy.media.importer import Importer class Mock: def get(self): return self.iterator() def iterator(self): for item in [None, None]: yield item mocker.patch("multiprocessing.pool.Pool.map_async", return_value=Mock()) mocker.patch("cozy.media.importer.Importer._wait_for_job_to_complete") mocker.patch("cozy.model.database_importer.DatabaseImporter.insert_many") importer = Importer() _, not_imported = importer._execute_import(["a"]) assert not_imported == set() def test_scan_processes_all_files_even_if_many_are_not_audio_files(mocker): from cozy.media.importer import Importer class Mock: def get(self): return self.iterator() def iterator(self): items = [None] * 200 items.append("test") for item in items: yield item mocker.patch("multiprocessing.pool.Pool.map_async", return_value=Mock()) mocker.patch("cozy.media.importer.Importer._wait_for_job_to_complete") mocker.patch("cozy.model.database_importer.DatabaseImporter.insert_many") importer = Importer() _, not_imported = importer._execute_import(["a"]) assert len(not_imported) == 1 assert "test" in not_imported def test_execute_import_returns_list_of_imported_files(mocker): from cozy.media.importer import Importer media_file1 = MediaFile( book_name="a", author="a", reader="a", disk=1, cover=b"", path="path", modified=1, chapters=[] ) media_file2 = MediaFile( book_name="a", author="a", reader="a", disk=1, cover=b"", path="path2", modified=1, chapters=[] ) class Mock: def get(self): return self.iterator() def iterator(self): for item in [media_file1, media_file2, None]: yield item mocker.patch("multiprocessing.pool.Pool.map_async", return_value=Mock()) mocker.patch("cozy.media.importer.Importer._wait_for_job_to_complete") mocker.patch("cozy.model.database_importer.DatabaseImporter.insert_many") importer = Importer() imported, _ = importer._execute_import(["a", "b"]) assert all([a == b for a, b in zip(imported, ["path", "path2"])]) cozy-1.3.0/test/cozy/media/test_media_detector.py000066400000000000000000000011301457036466300221130ustar00rootroot00000000000000def test_get_media_data_should_work_with_valid_audio_files(mocker): from cozy.media.media_detector import MediaDetector mocker.patch("gi.repository.GstPbutils.Discoverer") mocker.patch("gi.repository.Gst.init") file_extensions = ['.mp3', '.ogg', '.flac', '.m4a', '.m4b', '.mp4', '.wav', '.opus'] for extension in file_extensions: md = MediaDetector("/test.{}".format(extension)) assert md._has_audio_file_ending() for extension in file_extensions: md = MediaDetector("/test.{}".format(extension.upper())) assert md._has_audio_file_ending() cozy-1.3.0/test/cozy/media/test_player.py000066400000000000000000000147231457036466300204530ustar00rootroot00000000000000from unittest.mock import MagicMock, call, PropertyMock import pytest from peewee import SqliteDatabase from cozy.application_settings import ApplicationSettings from cozy.ext import inject from cozy.media.gst_player import GstPlayer from cozy.model.library import Library from cozy.model.settings import Settings @pytest.fixture(autouse=True) def setup_inject(peewee_database): inject.clear_and_configure(lambda binder: binder .bind(SqliteDatabase, peewee_database) .bind_to_constructor("FilesystemMonitor", MagicMock()) .bind_to_constructor(GstPlayer, MagicMock()) .bind_to_constructor(ApplicationSettings, MagicMock()) .bind_to_constructor(Library, lambda: Library()) .bind_to_constructor(Settings, lambda: Settings())) yield inject.clear() def test_initializing_player_loads_last_book(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) library.last_played_book = library.books[0] player = Player() assert player._book == library.last_played_book def test_loading_new_book_loads_chapter_and_book(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) player = Player() book = library.books[0] player._continue_book(book) assert player._book == book assert player._book.current_chapter == book.current_chapter def test_loading_new_book_emits_changed_event(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) player = Player() spy = mocker.spy(player, "emit_event_main_thread") book = library.books[2] player._continue_book(book) spy.assert_has_calls(calls=[call("chapter-changed", book)]) def test_loading_new_chapter_loads_chapter(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) player = Player() book = library.books[0] player._load_chapter(book.current_chapter) assert player._book.current_chapter == book.current_chapter def test_loading_new_chapter_sets_playback_speed(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) player = Player() book = library.books[0] book.playback_speed = 2.5 player._load_chapter(book.current_chapter) print(player.playback_speed) assert player.playback_speed == book.playback_speed def test_loading_new_chapter_emits_changed_event(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_in_book") library = inject.instance(Library) player = Player() spy = mocker.spy(player, "emit_event_main_thread") book = library.books[1] player._book = book player._load_chapter(book.chapters[1]) spy.assert_has_calls(calls=[call('chapter-changed', book)]) def test_emit_tick_does_not_emit_tick_when_nothing_is_loaded(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") player = Player() spy = mocker.spy(player, "emit_event_main_thread") player._emit_tick() spy.assert_not_called() def test_emit_tick_does_emit_tick_on_startup_when_last_book_is_loaded(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._rewind_feature") player = Player() spy = mocker.spy(player, "emit_event_main_thread") player._emit_tick() spy.assert_has_calls(calls=[call('position', player.loaded_chapter.position)]) def test_rewind_in_book_does_not_rewind_if_no_book_is_loaded(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") player = Player() player._rewind_in_book() def test_forward_in_book_does_not_forward_if_no_book_is_loaded(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") player = Player() player._forward_in_book() def test_load_book_does_not_load_book_if_it_is_none(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") player = Player() player._load_book(None) assert player.loaded_book is None def test_play_pause_chapter_does_not_trigger_chapter_or_book_reload_when_book_has_been_played_before(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") player = Player() library = inject.instance(Library) book = library.books[0] chapter = book.chapters[0] # Start Playback player.play_pause_chapter(book, chapter) spy_book = mocker.spy(player, "_load_book") spy_chapter = mocker.spy(player, "_load_chapter") # Pause Playback. Spies should not record any book or chapter reload player.play_pause_chapter(book, chapter) spy_book.assert_not_called() spy_chapter.assert_not_called() def test_should_jump_to_chapter_position_returns_true_for_position_zero(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") mock = mocker.patch("cozy.media.player.Player.position", new_callable=PropertyMock) mock.return_value = 0 player = Player() jump = player._should_jump_to_chapter_position(100000000000) assert jump def test_should_jump_to_chapter_position_returns_true_for_lager_position(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") mock = mocker.patch("cozy.media.player.Player.position", new_callable=PropertyMock) mock.return_value = 1000000000000 player = Player() jump = player._should_jump_to_chapter_position(100000000000) assert jump def test_should_jump_to_chapter_position_returns_false_for_less_than_one_second_difference(mocker): from cozy.media.player import Player mocker.patch("cozy.media.player.Player._load_last_book") mock = mocker.patch("cozy.media.player.Player.position", new_callable=PropertyMock) mock.return_value = 10 ** 9 player = Player() jump = player._should_jump_to_chapter_position(1.9 * 10 ** 9) assert not jump cozy-1.3.0/test/cozy/media/test_tag_reader.py000066400000000000000000000114431457036466300212500ustar00rootroot00000000000000from collections import namedtuple from typing import List import pytest class M4BChapter: title: str start: float def __init__(self, title: str, start: float): self.title = title self.start = start class M4B: chapters: List[M4BChapter] def __init__(self, chapters: List[M4BChapter]): self.chapters = chapters @pytest.fixture(scope="function") def discoverer_mocks(mocker): mock_info = mocker.patch("gi.repository.GstPbutils.DiscovererInfo", ) mock_tags = mocker.patch("gi.repository.Gst.TagList", autospec=True) mock_tags = mock_info.get_tags.return_value return namedtuple("discoverer_mocks", "info tags")(mock_info, mock_tags) def get_true_and_numbered_string(_, number): return True, "string {}".format(str(number)) def test_multiple_authors_returned_as_separated_list(discoverer_mocks): from cozy.media.tag_reader import TagReader discoverer_mocks.tags.get_string_index.side_effect = get_true_and_numbered_string discoverer_mocks.tags.get_tag_size.return_value = 2 tag_reader = TagReader("uri", discoverer_mocks.info) assert tag_reader._get_author() == "string 0; string 1" def test_multiple_readers_returned_as_separated_list(discoverer_mocks): from cozy.media.tag_reader import TagReader discoverer_mocks.tags.get_string_index.side_effect = get_true_and_numbered_string discoverer_mocks.tags.get_tag_size.return_value = 2 tag_reader = TagReader("uri", discoverer_mocks.info) assert tag_reader._get_reader() == "string 0; string 1" def test_track_name_fallback_is_filename(discoverer_mocks): from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def/a nice file.mp3", discoverer_mocks.info) assert tag_reader._get_track_name_fallback() == "a nice file" def test_track_name_fallback_is_unescaped_filename(discoverer_mocks): from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def/a%20nice%20file.mp3", discoverer_mocks.info) assert tag_reader._get_track_name_fallback() == "a nice file" def test_book_title_fallback_is_parent_directory_name(discoverer_mocks): from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def hij/a nice file.mp3", discoverer_mocks.info) assert tag_reader._get_book_name_fallback() == "def hij" def test_book_title_fallback_is_unescaped_parent_directory_name(discoverer_mocks): from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def%20hij/a%20nice%20file.mp3", discoverer_mocks.info) assert tag_reader._get_book_name_fallback() == "def hij" def test_default_track_number(discoverer_mocks): from cozy.media.tag_reader import TagReader discoverer_mocks.tags.get_uint_index.return_value = False, 999 tag_reader = TagReader("uri", discoverer_mocks.info) assert tag_reader._get_track_number() == 0 def test_default_disk_number(discoverer_mocks): from cozy.media.tag_reader import TagReader discoverer_mocks.tags.get_uint_index.return_value = False, 999 tag_reader = TagReader("uri", discoverer_mocks.info) assert tag_reader._get_disk() == 1 def test_author_reader_fallback(mocker, discoverer_mocks): from cozy.media.tag_reader import TagReader discoverer_mocks.tags.get_string_index.return_value = False, [] tag_reader = TagReader("uri", discoverer_mocks.info) assert tag_reader._get_author() == "Unknown" assert tag_reader._get_reader() == "Unknown" def test_get_m4b_chapters(mocker, discoverer_mocks): discoverer_mocks.info.get_duration = lambda: 10 * (10 ** 9) from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def/01 a nice file.m4b", discoverer_mocks.info) chapters = tag_reader._get_m4b_chapters(M4B([M4BChapter("test", 0), M4BChapter("testa", 1)])) assert len(chapters) == 2 assert chapters[0].name == "test" assert chapters[0].position == 0 assert chapters[0].length == 1 assert chapters[0].number == 1 assert chapters[1].name == "testa" assert chapters[1].position == 1 * (10 ** 9) assert chapters[1].length == 9 assert chapters[1].number == 2 def test_get_m4b_chapters_creates_single_chapter_if_none_present(mocker, discoverer_mocks): discoverer_mocks.info.get_duration = lambda: 10 * (10 ** 9) discoverer_mocks.tags.get_string_index.return_value = True, "a nice file" discoverer_mocks.tags.get_uint_index.return_value = True, 1 from cozy.media.tag_reader import TagReader tag_reader = TagReader("file://abc/def/01 a nice file.m4b", discoverer_mocks.info) chapters = tag_reader._get_m4b_chapters(M4B([])) assert len(chapters) == 1 assert chapters[0].name == "a nice file" assert chapters[0].position == 0 assert chapters[0].length == 10 assert chapters[0].number == 1 cozy-1.3.0/test/cozy/mocks.py000066400000000000000000000001441457036466300161450ustar00rootroot00000000000000class ApplicationSettingsMock: @property def swap_author_reader(self): return False cozy-1.3.0/test/cozy/model/000077500000000000000000000000001457036466300155605ustar00rootroot00000000000000cozy-1.3.0/test/cozy/model/__init__.py000066400000000000000000000000001457036466300176570ustar00rootroot00000000000000cozy-1.3.0/test/cozy/model/storage_block_list.py000066400000000000000000000012511457036466300220020ustar00rootroot00000000000000import pytest from peewee import SqliteDatabase from cozy.ext import inject @pytest.fixture(autouse=True) def setup_inject(peewee_database_storage): inject.clear_and_configure(lambda binder: binder.bind(SqliteDatabase, peewee_database_storage)) yield inject.clear() def test_rebase_path(): from cozy.model.storage_block_list import StorageBlockList from cozy.db.storage_blacklist import StorageBlackList model = StorageBlockList() model.rebase_path("/path/to/replace", "/replaced/path") assert StorageBlackList.get_by_id(1).path == "/replaced/path/test1.mp3" assert StorageBlackList.get_by_id(2).path == "/path/to/not/replace/test2.mp3" cozy-1.3.0/test/cozy/model/test_book.py000066400000000000000000000272351457036466300201340ustar00rootroot00000000000000import pytest from peewee import SqliteDatabase from cozy.application_settings import ApplicationSettings from cozy.ext import inject from test.cozy.mocks import ApplicationSettingsMock @pytest.fixture(autouse=True) def setup_inject(peewee_database): inject.clear_and_configure(lambda binder: binder .bind(SqliteDatabase, peewee_database) .bind_to_constructor(ApplicationSettings, lambda: ApplicationSettingsMock())) yield inject.clear() def test_db_created(peewee_database): from cozy.db.book import Book assert Book.table_exists() def test_name_returns_correct_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.name == "Test Book" def test_setting_name_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.name = "Altered" assert book.name == "Altered" assert BookDB.get_by_id(1).name == "Altered" def test_author_returns_correct_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.author == "Test Author" def test_setting_author_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.author = "Altered" assert book.author == "Altered" assert BookDB.get_by_id(1).author == "Altered" def test_reader_returns_correct_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.reader == "Test Reader" def test_setting_reader_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.reader = "Altered" assert book.reader == "Altered" assert BookDB.get_by_id(1).reader == "Altered" def test_position_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.position == 0 def test_setting_position_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.position = 42 assert book.position == 42 assert BookDB.get_by_id(1).position == 42 def test_rating_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.rating == 0 def test_setting_rating_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.rating = 5 assert book.rating == 5 assert BookDB.get_by_id(1).rating == 5 def test_cover_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.cover == None def test_setting_cover_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.cover = b"42" assert book.cover == b"42" assert BookDB.get_by_id(1).cover == b"42" def test_playback_speed_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.playback_speed == 1.0 def test_setting_playback_speed_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.playback_speed = 1.2 assert book.playback_speed == 1.2 assert BookDB.get_by_id(1).playback_speed == 1.2 def test_last_played_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.last_played == 0 def test_setting_last_played_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.last_played = 42 assert book.last_played == 42 assert BookDB.get_by_id(1).last_played == 42 def test_offline_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.offline == False def test_setting_offline_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.offline = True assert book.offline is True assert BookDB.get_by_id(1).offline is True def test_downloaded_returns_default_value(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert book.downloaded == False def test_setting_downloaded_updates_in_book_object_and_database(peewee_database): from cozy.db.book import Book as BookDB from cozy.model.book import Book book = Book(peewee_database, BookDB.get(1)) book.downloaded = True assert book.downloaded is True assert BookDB.get_by_id(1).downloaded is True def test_chapters_return_correct_count_of_chapters(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) assert len(book.chapters) == 1 def test_tracks_are_ordered_by_disk_number_name(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(9)) chapters_manually_sorted = book.chapters.copy() chapters_manually_sorted.sort(key=lambda chapter: (chapter.disk, chapter.number, chapter.name)) assert all([a == b for a, b in zip(book.chapters, chapters_manually_sorted)]) def test_current_track_is_actually_current_track(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(9)) assert book.current_chapter.id == BookDB.get_by_id(9).position def test_try_to_init_empty_book_should_throw_exception(peewee_database): from cozy.model.book import Book from cozy.model.book import BookIsEmpty from cozy.db.book import Book as BookDB with pytest.raises(BookIsEmpty): Book(peewee_database, BookDB.get(10)) def test_try_to_init_non_existant_book_throws_exception(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB from peewee import DoesNotExist with pytest.raises(DoesNotExist): Book(peewee_database, BookDB.get(-42)) def test_delete_deletes_book_from_db(peewee_database, mocker): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) spy = mocker.spy(book, "emit_event") book._on_chapter_event("chapter-deleted", book.chapters[0]) assert BookDB.select().where(BookDB.id == 1).count() < 1 spy.assert_called_once_with("book-deleted", book) assert len(book._listeners) < 1 def test_deleted_book_removed_from_last_played_book_if_necessary(peewee_database): from cozy.model.book import Book from cozy.model.settings import Settings from cozy.db.book import Book as BookDB settings = Settings() inject.clear_and_configure( lambda binder: binder.bind(SqliteDatabase, peewee_database) and binder.bind(Settings, settings)) book = Book(peewee_database, BookDB.get(1)) settings.last_played_book = book book._on_chapter_event("chapter-deleted", book.chapters[0]) assert settings.last_played_book == None def test_skipping_removing_a_non_existing_chapter(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) book._on_chapter_event("chapter-deleted", None) def test_progress_return_progress_for_started_book(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) chapter = book.chapters[0] chapter.position = 42 * 1000000000 book.position = chapter.id assert book.progress == 42 def test_progress_should_be_zero_for_unstarted_book(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) book.position = 0 assert book.progress == 0 def test_progress_should_be_100_for_finished_book(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB book = Book(peewee_database, BookDB.get(1)) book.position = -1 assert book.progress == book.duration def test_removing_book_removes_all_traces_in_db(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB from cozy.db.track import Track from cozy.db.file import File from cozy.db.track_to_file import TrackToFile book = Book(peewee_database, BookDB.get(1)) track_ids = [chapter.id for chapter in book.chapters] track_to_file_ids = [track_to_file.id for track_to_file in TrackToFile.select().join(Track).where(TrackToFile.track.id << track_ids)] file_ids = [track_to_file.file.id for track_to_file in TrackToFile.select().join(Track).where(TrackToFile.track.id << track_ids)] assert len(track_ids) > 0 assert len(track_to_file_ids) > 0 assert len(file_ids) > 0 book.remove() assert BookDB.select().where(BookDB.id == 1).count() == 0 assert Track.select().where(Track.id << track_ids).count() == 0 assert TrackToFile.select().where(TrackToFile.id << track_to_file_ids).count() == 0 assert File.select().where(File.id << file_ids).count() == 0 def test_removing_book_with_missing_file_removes_all_traces_in_db(peewee_database): from cozy.model.book import Book from cozy.db.book import Book as BookDB from cozy.db.track import Track from cozy.db.file import File from cozy.db.track_to_file import TrackToFile book = Book(peewee_database, BookDB.get(1)) track_ids = [chapter.id for chapter in book.chapters] track_to_file_ids = [track_to_file.id for track_to_file in TrackToFile.select().join(Track).where(TrackToFile.track.id << track_ids)] file_ids = [track_to_file.file.id for track_to_file in TrackToFile.select().join(Track).where(TrackToFile.track.id << track_ids)] assert len(track_ids) > 0 assert len(track_to_file_ids) > 0 assert len(file_ids) > 0 File.get_by_id(file_ids[0]).delete_instance() book.remove() assert BookDB.select().where(BookDB.id == 1).count() == 0 assert Track.select().where(Track.id << track_ids).count() == 0 assert TrackToFile.select().where(TrackToFile.id << track_to_file_ids).count() == 0 assert File.select().where(File.id << file_ids).count() == 0 cozy-1.3.0/test/cozy/model/test_database_importer.py000066400000000000000000000505541457036466300226670ustar00rootroot00000000000000import pytest from peewee import SqliteDatabase from cozy.ext import inject @pytest.fixture(autouse=True) def setup_inject(peewee_database): inject.clear() inject.configure(lambda binder: (binder.bind(SqliteDatabase, peewee_database))) yield inject.clear() def test_prepare_files_db_objects_skips_existing_files(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile media_file = MediaFile(book_name="New Book Name", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=1234567, chapters=[None]) database_importer = DatabaseImporter() file_objects = database_importer._prepare_files_db_objects([media_file]) assert len(file_objects) == 0 def test_prepare_files_db_objects_skips_duplicate_file(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile media_file = MediaFile(book_name="New Book Name", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="i_m_a_new_file.mp3", modified=1234567, chapters=[None]) database_importer = DatabaseImporter() file_objects = database_importer._prepare_files_db_objects([media_file, media_file]) assert len(file_objects) == 1 assert file_objects[0]["path"] == "i_m_a_new_file.mp3" def test_update_files_db_objects_updates_modified_field(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.db.file import File media_file = MediaFile(book_name="New Book Name", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=12345678, chapters=[None]) database_importer = DatabaseImporter() file = File.select().where(File.path == "test.mp3").get() file_objects = database_importer._update_files_in_db(file, media_file) assert File.select().where(File.path == "test.mp3").get().modified == 12345678 def test_prepare_files_db_objects_returns_object_for_new_file(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile media_file = MediaFile(book_name="New Book Name", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="i_m_a_new_file.mp3", modified=1234567, chapters=[None]) database_importer = DatabaseImporter() file_objects = database_importer._prepare_files_db_objects([media_file]) assert len(file_objects) == 1 assert file_objects[0]["path"] == "i_m_a_new_file.mp3" def test_prepare_db_objects_skips_none(): from cozy.model.database_importer import DatabaseImporter database_importer = DatabaseImporter() database_importer._prepare_track_db_objects([None, None, None]) def test_create_track_db_object_creates_object(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.db.book import Book from cozy.media.chapter import Chapter database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="New Book Name", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="New File", modified=1234567, chapters=[chapter]) book = Book.select().get() res_dict = database_importer._get_track_list_for_db(media_file, book)[0] assert res_dict["name"] == "New Chapter" assert res_dict["disk"] == 999 assert res_dict["number"] == 999 assert res_dict["book"] == book assert res_dict["length"] == 1234567 assert res_dict["position"] == 0 def test_update_book_db_object_updates_object(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.db.book import Book from cozy.media.chapter import Chapter database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=1234567, chapters=[chapter]) database_importer._update_book_db_object(media_file) book_in_db: Book = Book.select().where(Book.name == "Test Book").get() assert book_in_db.name == "Test Book" assert book_in_db.author == "New Author" assert book_in_db.reader == "New Reader" assert book_in_db.cover == b"cover" def test_update_book_db_object_updates_object_regardless_of_book_spelling(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.db.book import Book from cozy.media.chapter import Chapter database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="TEST BOOK", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=1234567, chapters=[chapter]) database_importer._update_book_db_object(media_file) book_in_db: Book = Book.select().where(Book.name == "TEST BOOK").get() assert book_in_db.name == "TEST BOOK" assert book_in_db.author == "New Author" assert book_in_db.reader == "New Reader" assert book_in_db.cover == b"cover" def test_create_book_db_object_creates_object(): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.db.book import Book from cozy.media.chapter import Chapter database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="New Book", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=1234567, chapters=[chapter]) database_importer._create_book_db_object(media_file) book_in_db: Book = Book.select().where(Book.name == "New Book").get() assert book_in_db.name == "New Book" assert book_in_db.author == "New Author" assert book_in_db.reader == "New Reader" assert book_in_db.cover == b"cover" assert book_in_db.position == 0 assert book_in_db.rating == -1 def test_prepare_db_objects_recreates_existing_track(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.track_to_file import TrackToFile from cozy.db.file import File database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="test.mp3", modified=1234567, chapters=[chapter]) res = database_importer._prepare_track_db_objects([media_file]) res_list = list(res) request = res_list[0] assert TrackToFile.select().join(File).where(File.path == "test.mp3").count() == 0 assert len(res_list) == 1 assert request.file.path == "test.mp3" assert request.start_at == 0 assert request.track_data["name"] == "New Chapter" assert request.track_data["number"] == 999 assert request.track_data["disk"] == 999 assert request.track_data["book"].id == 1 assert request.track_data["length"] == 1234567 assert request.track_data["position"] == 0 def test_prepare_db_objects_skips_if_file_object_not_present(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter database_importer = DatabaseImporter() chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="New test File", modified=1234567, chapters=[chapter]) res_dict = database_importer._prepare_track_db_objects([media_file]) assert len(list(res_dict)) == 0 def test_prepare_db_objects_creates_new_track(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.file import File database_importer = DatabaseImporter() spy = mocker.spy(database_importer, "_get_track_list_for_db") File.create(path="New File", modified=1234567) chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book", author="New Author", reader="New Reader", disk=999, cover=b"cover", path="New File", modified=1234567, chapters=[chapter]) res_dict = database_importer._prepare_track_db_objects([media_file]) assert len(list(res_dict)) == 1 spy.assert_called_once() def test_prepare_db_objects_updates_existing_book(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.file import File database_importer = DatabaseImporter() spy = mocker.spy(database_importer, "_update_book_db_object") File.create(path="New test File", modified=1234567) chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="New test File", modified=1234567, chapters=[chapter]) res_dict = database_importer._prepare_track_db_objects([media_file]) assert len(list(res_dict)) == 1 spy.assert_called_once() def test_prepare_db_objects_updates_existing_book_regardless_of_spelling(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.file import File database_importer = DatabaseImporter() spy = mocker.spy(database_importer, "_update_book_db_object") File.create(path="New test File", modified=1234567) File.create(path="Another test File", modified=1234568) chapter = Chapter("New Chapter", 0, 1234567, 999) another_chapter = Chapter("Another Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="TeSt bOOk", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="New test File", modified=1234567, chapters=[chapter]) another_media_file = MediaFile(book_name="TEST BOOK", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="Another test File", modified=1234568, chapters=[another_chapter]) res_dict = database_importer._prepare_track_db_objects([media_file, another_media_file]) assert len(list(res_dict)) == 2 spy.assert_called_once() def test_prepare_db_objects_creates_new_book(mocker): from cozy.model.database_importer import DatabaseImporter from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.file import File database_importer = DatabaseImporter() spy = mocker.spy(database_importer, "_create_book_db_object") File.create(path="New test File", modified=1234567) chapter = Chapter("New Chapter", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book New", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="New test File", modified=1234567, chapters=[chapter]) res_dict = database_importer._prepare_track_db_objects([media_file]) assert len(list(res_dict)) == 1 spy.assert_called_once() def test_delete_all_tracks_from_db_does_as_it_says(): from cozy.media.media_file import MediaFile from cozy.media.chapter import Chapter from cozy.db.file import File from cozy.db.track import Track from cozy.db.track_to_file import TrackToFile from cozy.model.database_importer import DatabaseImporter database_importer = DatabaseImporter() chapter = Chapter("Ohne Aussicht auf Freiheit", 0, 1234567, 999) media_file = MediaFile(book_name="Test Book New", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="20.000 Meilen unter dem Meer/2-10 Ohne Aussicht auf Freiheit.m4a", modified=1234567, chapters=[chapter]) assert Track.select().where(Track.name == "Ohne Aussicht auf Freiheit").count() == 1 assert TrackToFile.select().join(File).where(TrackToFile.file.path == media_file.path).count() == 1 database_importer._delete_tracks_from_db(media_file) assert Track.select().where(Track.name == "Ohne Aussicht auf Freiheit").count() == 0 assert TrackToFile.select().join(File).where(TrackToFile.file.path == media_file.path).count() == 0 assert File.select().where(File.path == media_file.path).count() == 1 def test_delete_all_tracks_from_db_does_nothing_if_no_tracks_are_present(): from cozy.media.media_file import MediaFile from cozy.model.database_importer import DatabaseImporter database_importer = DatabaseImporter() media_file = MediaFile(book_name="Test Book New", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="file_not_present", modified=1234567, chapters=[]) database_importer._delete_tracks_from_db(media_file) def test_is_chapter_count_in_db_different_returns_true_for_non_existent_file(): from cozy.media.media_file import MediaFile from cozy.model.database_importer import DatabaseImporter database_importer = DatabaseImporter() media_file = MediaFile(book_name="Test Book New", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="file_not_present", modified=1234567, chapters=["Chapter 1"]) assert database_importer._is_chapter_count_in_db_different(media_file) def test_is_chapter_count_in_db_different_returns_false_for_equal_chapter_count(): from cozy.media.media_file import MediaFile from cozy.model.database_importer import DatabaseImporter database_importer = DatabaseImporter() media_file = MediaFile(book_name="Test Book New", author="New Author2", reader="New Reader", disk=999, cover=b"cover", path="20.000 Meilen unter dem Meer/2-10 Ohne Aussicht auf Freiheit.m4a", modified=1234567, chapters=[None]) assert not database_importer._is_chapter_count_in_db_different(media_file) def test_insert_track_inserts_all_rows_expected(): from cozy.model.database_importer import DatabaseImporter, TrackInsertRequest from cozy.db.book import Book from cozy.db.file import File from cozy.db.track_to_file import TrackToFile database_importer = DatabaseImporter() file = File.create(path="New File", modified=1234567) track_data = { "name": "Test", "number": 2, "disk": 2, "book": Book.select().where(Book.name == "Test Book").get(), "length": 123, "position": 0 } track = TrackInsertRequest(track_data, file, 1234) database_importer._insert_tracks([track]) track_to_file_query = TrackToFile.select().join(File).where(TrackToFile.file == file.id) assert track_to_file_query.count() == 1 track_to_file: TrackToFile = track_to_file_query.get() assert track_to_file.track.name == track_data["name"] assert track_to_file.track.number == track_data["number"] assert track_to_file.track.disk == track_data["disk"] assert track_to_file.track.book.id == Book.select().where(Book.name == "Test Book").get().id assert track_to_file.track.length == track_data["length"] assert track_to_file.track.position == track_data["position"] def test_update_book_position_skips_empty_book(): from cozy.model.database_importer import DatabaseImporter from cozy.db.book import Book database_importer = DatabaseImporter() book = Book.get_by_id(10) database_importer._update_book_position(book, 0) def test_update_book_position_sets_position_for_multi_chapter_file_correctly(): from cozy.model.database_importer import DatabaseImporter from cozy.db.book import Book from cozy.db.track import Track database_importer = DatabaseImporter() book = Book.get_by_id(11) database_importer._update_book_position(book, 4251) book = Book.get_by_id(11) assert book.position == 232 assert Track.get_by_id(232).position == 4251000000000 def test_update_book_position_sets_position_for_single_chapter_file_correctly(): from cozy.model.database_importer import DatabaseImporter from cozy.db.book import Book from cozy.db.track import Track database_importer = DatabaseImporter() book = Book.get_by_id(2) database_importer._update_book_position(book, 4251) book = Book.get_by_id(2) desired_chapter_position = 4251000000000.0 - ((Track.get_by_id(198).length + Track.get_by_id(197).length) * 10 ** 9) assert book.position == 194 assert Track.get_by_id(194).position == desired_chapter_position def test_update_book_position_resets_position_if_it_is_longer_than_the_duration(): from cozy.model.database_importer import DatabaseImporter from cozy.db.book import Book database_importer = DatabaseImporter() book = Book.get_by_id(11) book.position = 1 book.save(only=book.dirty_fields) database_importer._update_book_position(book, 42510) book = Book.get_by_id(11) assert book.position == 0 cozy-1.3.0/test/cozy/model/test_library.py000066400000000000000000000062441457036466300206430ustar00rootroot00000000000000import pytest from peewee import SqliteDatabase from cozy.application_settings import ApplicationSettings from cozy.ext import inject from cozy.extensions.set import split_strings_to_set from cozy.model.settings import Settings from test.cozy.mocks import ApplicationSettingsMock @pytest.fixture(autouse=True) def setup_inject(peewee_database): inject.clear() inject.configure(lambda binder: (binder.bind(SqliteDatabase, peewee_database), binder.bind_to_constructor(Settings, lambda: Settings()) .bind_to_constructor(ApplicationSettings, lambda: ApplicationSettingsMock()))) yield inject.clear() def test_library_contains_books(): from cozy.model.library import Library library = Library() assert len(library.books) > 0 def test_authors_contains_every_author_from_db(): from cozy.model.library import Library from cozy.db.book import Book library = Library() books = Book.select(Book.author).distinct().order_by(Book.author) authors_from_db = [book.author for book in books] authors_from_db = list(split_strings_to_set(set(authors_from_db))) # we cannot assert the same content as the library filters books without chapters assert len(library.authors) > 0 assert library.authors.issubset(authors_from_db) def test_readers_contains_every_reader_from_db(): from cozy.model.library import Library from cozy.db.book import Book library = Library() books = Book.select(Book.reader).distinct().order_by(Book.reader) readers_from_db = [book.reader for book in books] readers_from_db = list(split_strings_to_set(set(readers_from_db))) # we cannot assert the same content as the library filters books without chapters assert len(library.readers) > 0 assert library.readers.issubset(readers_from_db) def test_deleted_chapter_removed_from_lists(): from cozy.model.library import Library library = Library() chapter = next(iter(library.chapters)) library._load_all_files() library._load_all_chapters() library._on_chapter_event("chapter-deleted", next(iter(library.chapters))) assert chapter not in library.chapters assert chapter.file not in library.files def test_deleted_book_removed_from_list(): from cozy.model.library import Library library = Library() book = next(iter(library.books)) library._on_book_event("book-deleted", next(iter(library.books))) assert book not in library.books def test_rebase_path(): from cozy.model.library import Library library = Library() chapters = {chapter for chapter in library.chapters if chapter.file.startswith("20.000 Meilen unter dem Meer")} library.rebase_path("20.000 Meilen unter dem Meer", "new path") def test_empty_last_book_returns_none(): from cozy.model.library import Library library = Library() library._settings.last_played_book = None assert library.last_played_book is None def test_empty_last_book_returns_none(): from cozy.model.library import Library library = Library() library._settings.last_played_book = library.books[0] assert library.last_played_book is library.books[0] cozy-1.3.0/test/cozy/model/test_settings.py000066400000000000000000000076261457036466300210440ustar00rootroot00000000000000import pytest import cozy.ext.inject as inject from peewee import SqliteDatabase @pytest.fixture(autouse=True) def setup_inject(peewee_database): inject.clear_and_configure(lambda binder: binder.bind(SqliteDatabase, peewee_database)) yield inject.clear() def test_storage_locations_contains_every_storage_location_from_db(peewee_database): from cozy.model.settings import Settings from cozy.db.storage import Storage settings = Settings() storage_locations = Storage.select() assert len(settings.storage_locations) == len(storage_locations) assert [storage.path for storage in settings.storage_locations] == [storage.path for storage in storage_locations] assert [storage.location_type for storage in settings.storage_locations] == [storage.location_type for storage in storage_locations] assert [storage.default for storage in settings.storage_locations] == [storage.default for storage in storage_locations] assert [storage.external for storage in settings.storage_locations] == [storage.external for storage in storage_locations] def test_external_storage_locations_contain_only_external_storages(peewee_database): from cozy.model.settings import Settings from cozy.db.storage import Storage settings = Settings() storage_locations = Storage.select().where(Storage.external == True) assert len(settings.external_storage_locations) == len(storage_locations) assert all([storage.external for storage in settings.external_storage_locations]) def test_last_played_book_returns_correct_value(peewee_database): from cozy.model.settings import Settings from cozy.db.book import Book settings = Settings() assert settings.last_played_book == Book.get() def test_setting_last_played_book_to_none_updates_in_settings_object_and_database(peewee_database): from cozy.model.settings import Settings from cozy.db.settings import Settings as SettingsModel settings = Settings() settings.last_played_book = None assert settings.last_played_book == None assert SettingsModel.get().last_played_book == None def test_fetching_non_existent_last_played_book_returns_none(peewee_database): from cozy.model.settings import Settings from cozy.db.settings import Settings as SettingsModel db_object = SettingsModel.get() db_object.last_played_book = 437878782 db_object.save(only=db_object.dirty_fields) settings = Settings() assert settings.last_played_book is None def test_fetching_non_existent_last_played_book_sets_it_to_none(peewee_database): from cozy.model.settings import Settings from cozy.db.settings import Settings as SettingsModel db_object = SettingsModel.get() db_object.last_played_book = 437878782 db_object.save(only=db_object.dirty_fields) settings = Settings() dummy = settings.last_played_book assert SettingsModel.get().last_played_book is None def test_ensure_default_storage_is_present_adds_default_if_not_present(peewee_database): from cozy.model.settings import Settings from cozy.db.storage import Storage Storage.update(default=False).where(Storage.id == 2).execute() settings = Settings() settings._load_all_storage_locations() settings._ensure_default_storage_is_present() assert Storage.get(1).default assert not Storage.get(2).default def test_ensure_default_storage_is_present_does_nothing_if_default_is_present(peewee_database): from cozy.model.settings import Settings from cozy.db.storage import Storage settings = Settings() settings._load_all_storage_locations() settings._ensure_default_storage_is_present() assert not Storage.get(1).default assert Storage.get(2).default cozy-1.3.0/test/cozy/model/test_storage.py000066400000000000000000000053301457036466300206360ustar00rootroot00000000000000import pytest def test_path_returns_correct_value(peewee_database_storage): from cozy.model.storage import Storage storage = Storage(peewee_database_storage, 1) assert storage.path == "/media/test" def test_setting_path_updates_in_track_object_and_database(peewee_database_storage): from cozy.db.storage import Storage as StorageModel from cozy.model.storage import Storage new_path = "/tmp/media2" storage = Storage(peewee_database_storage, 1) storage.path = new_path assert storage.path == new_path assert StorageModel.get_by_id(1).path == new_path def test_setting_invalid_path_raises_exception(peewee_database_storage): from cozy.model.storage import Storage, InvalidPath invalid_path = "not an absolute path" storage = Storage(peewee_database_storage, 1) with pytest.raises(InvalidPath): storage.path = invalid_path def test_location_type_returns_correct_default_value(peewee_database_storage): from cozy.model.storage import Storage storage = Storage(peewee_database_storage, 1) assert storage.location_type == 0 def test_setting_location_type_updates_in_track_object_and_database(peewee_database_storage): from cozy.db.storage import Storage as StorageModel from cozy.model.storage import Storage new_location_type = 555 storage = Storage(peewee_database_storage, 1) storage.location_type = new_location_type assert storage.location_type == new_location_type assert StorageModel.get_by_id(1).location_type == new_location_type def test_default_returns_correct_default_value(peewee_database_storage): from cozy.model.storage import Storage storage = Storage(peewee_database_storage, 1) assert storage.default == False def test_setting_default_updates_in_track_object_and_database(peewee_database_storage): from cozy.db.storage import Storage as StorageModel from cozy.model.storage import Storage new_default = True storage = Storage(peewee_database_storage, 1) storage.default = new_default assert storage.default == new_default assert StorageModel.get_by_id(1).default == new_default def test_external_returns_correct_default_value(peewee_database_storage): from cozy.model.storage import Storage storage = Storage(peewee_database_storage, 1) assert storage.external == False def test_setting_external_updates_in_track_object_and_database(peewee_database_storage): from cozy.db.storage import Storage as StorageModel from cozy.model.storage import Storage new_external = True storage = Storage(peewee_database_storage, 1) storage.external = new_external assert storage.external == new_external assert StorageModel.get_by_id(1).external == new_external cozy-1.3.0/test/cozy/model/test_track.py000066400000000000000000000165621457036466300203070ustar00rootroot00000000000000import pytest def test_db_created(peewee_database): from cozy.db.track import Track assert Track.table_exists() def test_name_returns_correct_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.name == "Test Track" def test_name_returns_generated_name_when_no_name_is_present(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(234)) assert track.name == "Chapter {}".format(track.number) def test_setting_name_updates_in_track_object_and_database(peewee_database): from cozy.db.track import Track as TrackDB from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) track.name = "Altered" assert track.name == "Altered" assert TrackDB.get_by_id(1).name == "Altered" def test_number_returns_correct_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.number == 1 def test_setting_number_updates_in_track_object_and_database(peewee_database): from cozy.db.track import Track as TrackDB from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) track.number = 2 assert track.number == 2 assert TrackDB.get_by_id(1).number == 2 def test_disk_returns_correct_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.disk == 1 def test_setting_disk_updates_in_track_object_and_database(peewee_database): from cozy.db.track import Track as TrackDB from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) track.disk = 2 assert track.disk == 2 assert TrackDB.get_by_id(1).disk == 2 def test_position_returns_default_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.position == 0 def test_setting_position_updates_in_track_object_and_database(peewee_database): from cozy.db.track import Track as TrackDB from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) track.position = 42 assert track.position == 42 assert TrackDB.get_by_id(1).position == 42 def test_file_returns_default_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.file == "test.mp3" def test_setting_file_updates_in_track_object_and_database(peewee_database): from cozy.db.track_to_file import TrackToFile from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) track.file = "altered.mp3" file = TrackToFile.get(TrackToFile.track == track.id).file assert track.file == "altered.mp3" assert file.path == "altered.mp3" def test_setting_file_gets_file_object_if_it_is_already_present_in_database(peewee_database): from cozy.db.track_to_file import TrackToFile from cozy.db.file import File from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) track.file = "file with multiple chapters.m4b" file = TrackToFile.get(TrackToFile.track == track.id).file assert track.file == "file with multiple chapters.m4b" assert file.path == "file with multiple chapters.m4b" assert File.select().where(File.id == 0).count() == 0 def test_setting_file_gets_file_object_if_it_is_already_present_in_database_but_preserves_old_file_if_still_used( peewee_database): from cozy.db.track_to_file import TrackToFile from cozy.db.file import File from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(230)) track.file = "Changed path" file = TrackToFile.get(TrackToFile.track == track.id).file assert track.file == "Changed path" assert file.path == "Changed path" assert File.select().where(File.id == 229).count() == 1 def test_length_returns_default_value(peewee_database): from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) assert track.length == 42.1 def test_setting_length_updates_in_track_object_and_database(peewee_database): from cozy.db.track import Track as TrackDB from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) track.length = 42.42 assert track.length == 42.42 assert TrackDB.get_by_id(1).length == 42.42 def test_setting_modified_updates_in_track_object_and_database(peewee_database): from cozy.model.track import Track from cozy.db.track_to_file import TrackToFile from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) track.modified = 42 track_to_file = TrackToFile.select().where(TrackToFile.track == track._db_object.id).get() assert track.modified == 42 assert track_to_file.file.modified == 42 def test_delete_deletes_track_from_db(peewee_database, mocker): from cozy.db.track import Track as TrackDB from cozy.db.track_to_file import TrackToFile from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) spy = mocker.spy(track, "emit_event") track.delete() assert TrackDB.select().where(TrackDB.id == 1).count() < 1 assert TrackToFile.select().join(TrackDB).where(TrackToFile.track.id == 1).count() < 1 spy.assert_called_once_with("chapter-deleted", track) assert len(track._listeners) < 1 def test_delete_does_not_delete_book(peewee_database): from cozy.db.track import Track as TrackDB from cozy.db.book import Book from cozy.model.track import Track track = Track(peewee_database, TrackDB.get(1)) book_id = TrackDB.get(1).book.id track.delete() assert Book.get_or_none(book_id) is not None def test_track_to_file_not_present_throws_exception_and_deletes_track_instance(peewee_database): from cozy.db.track_to_file import TrackToFile from cozy.db.track import Track as TrackDB from cozy.model.track import Track, TrackInconsistentData TrackToFile.select().join(TrackDB).where(TrackToFile.track.id == 1).get().delete_instance() with pytest.raises(TrackInconsistentData): Track(peewee_database, TrackDB.get(1)) assert not TrackDB.get_or_none(1) def test_delete_removes_file_object_if_not_used_elsewhere(peewee_database): from cozy.db.file import File from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(1)) file_id = track.file_id track.delete() assert not File.get_or_none(file_id) def test_delete_keeps_file_object_if_used_elsewhere(peewee_database): from cozy.db.file import File from cozy.model.track import Track from cozy.db.track import Track as TrackDB track = Track(peewee_database, TrackDB.get(230)) file_id = track.file_id track.delete() assert File.get_or_none(file_id) cozy-1.3.0/test/files.json000066400000000000000000000747471457036466300155140ustar00rootroot00000000000000[ { "id": 0, "path": "test.mp3", "modified": 123456 }, { "id": 1, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD3/HP1 16.mp3", "modified": "1508062175" }, { "id": 2, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD3/HP1 15.mp3", "modified": "1508062175" }, { "id": 3, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD3/HP1 14.mp3", "modified": "1508062175" }, { "id": 4, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD3/HP1 13.mp3", "modified": "1508062175" }, { "id": 5, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD07/HP5 25.mp3", "modified": "1508062175" }, { "id": 6, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD07/HP5 24.mp3", "modified": "1508062175" }, { "id": 7, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD07/HP5 23.mp3", "modified": "1508062175" }, { "id": 8, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD4/HP7 17.mp3", "modified": "1508062175" }, { "id": 9, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD4/HP7 18.mp3", "modified": "1508062175" }, { "id": 10, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD4/HP7 16.mp3", "modified": "1508062175" }, { "id": 11, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD4/HP7 15.mp3", "modified": "1508062175" }, { "id": 12, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD4/HP7 14.mp3", "modified": "1508062175" }, { "id": 13, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD1/HP2 01.mp3", "modified": "1508062174" }, { "id": 14, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD1/HP2 03.mp3", "modified": "1508062174" }, { "id": 15, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD1/HP2 04.mp3", "modified": "1508062174" }, { "id": 16, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD1/HP2 05.mp3", "modified": "1508062174" }, { "id": 17, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD1/HP2 02.mp3", "modified": "1508062174" }, { "id": 18, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD2/HP3 07.mp3", "modified": "1508062174" }, { "id": 19, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD2/HP3 06-2.mp3", "modified": "1508062174" }, { "id": 20, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD2/HP3 09.mp3", "modified": "1508062174" }, { "id": 21, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD2/HP3 08.mp3", "modified": "1508062174" }, { "id": 22, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD2/HP3 10.mp3", "modified": "1508062175" }, { "id": 23, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD5/HP4 27.mp3", "modified": "1508062175" }, { "id": 24, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD5/HP4 26.mp3", "modified": "1508062175" }, { "id": 25, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD5/HP4 23-2.mp3", "modified": "1508062175" }, { "id": 26, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD5/HP4 25.mp3", "modified": "1508062175" }, { "id": 27, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD5/HP4 24.mp3", "modified": "1508062175" }, { "id": 28, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD4/HP6 16.mp3", "modified": "1508062175" }, { "id": 29, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD4/HP6 17.mp3", "modified": "1508062175" }, { "id": 30, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD4/HP6 14.mp3", "modified": "1508062175" }, { "id": 31, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD4/HP6 15.mp3", "modified": "1508062175" }, { "id": 32, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 13.mp3", "modified": "1508062175" }, { "id": 33, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 12.mp3", "modified": "1508062175" }, { "id": 34, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 11.mp3", "modified": "1508062175" }, { "id": 35, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 08-2.mp3", "modified": "1520376433" }, { "id": 36, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 09.mp3", "modified": "1508062174" }, { "id": 37, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD2/HP4 10.mp3", "modified": "1508062175" }, { "id": 38, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD3/HP6 11.mp3", "modified": "1508062175" }, { "id": 39, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD3/HP6 09-2.mp3", "modified": "1508062175" }, { "id": 40, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD3/HP6 10.mp3", "modified": "1508062175" }, { "id": 41, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD3/HP6 13.mp3", "modified": "1508062175" }, { "id": 42, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD3/HP6 12.mp3", "modified": "1508062175" }, { "id": 43, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD3/HP7 12.mp3", "modified": "1508062175" }, { "id": 44, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD3/HP7 13.mp3", "modified": "1508062175" }, { "id": 45, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD3/HP7 10.mp3", "modified": "1508062175" }, { "id": 46, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD3/HP7 11.mp3", "modified": "1508062175" }, { "id": 47, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD9/HP7 35.mp3", "modified": "1508062175" }, { "id": 48, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD9/HP7 34.mp3", "modified": "1508062175" }, { "id": 49, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD9/HP7 37.mp3", "modified": "1508062175" }, { "id": 50, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD9/HP7 36.mp3", "modified": "1508062175" }, { "id": 51, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD7/HP7 29.mp3", "modified": "1508062175" }, { "id": 52, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD7/HP7 27.mp3", "modified": "1508062175" }, { "id": 53, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD7/HP7 26.mp3", "modified": "1508062175" }, { "id": 54, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD7/HP7 28.mp3", "modified": "1508062175" }, { "id": 55, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD7/HP7 30.mp3", "modified": "1508062175" }, { "id": 56, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD04/HP5 13.mp3", "modified": "1508062175" }, { "id": 57, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD04/HP5 14.mp3", "modified": "1508062175" }, { "id": 58, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD04/HP5 15.mp3", "modified": "1508062175" }, { "id": 59, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD2/HP2 10.mp3", "modified": "1508062175" }, { "id": 60, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD2/HP2 06.mp3", "modified": "1508062174" }, { "id": 61, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD2/HP2 08.mp3", "modified": "1508062174" }, { "id": 62, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD2/HP2 09.mp3", "modified": "1508062174" }, { "id": 63, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD2/HP2 07.mp3", "modified": "1508062174" }, { "id": 64, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD7/HP6 26-2.mp3", "modified": "1508062175" }, { "id": 65, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD7/HP6 30.mp3", "modified": "1508062175" }, { "id": 66, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD7/HP6 28.mp3", "modified": "1508062175" }, { "id": 67, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD7/HP6 27.mp3", "modified": "1508062175" }, { "id": 68, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD7/HP6 29.mp3", "modified": "1508062175" }, { "id": 69, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD6/HP4 32.mp3", "modified": "1508062175" }, { "id": 70, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD6/HP4 29.mp3", "modified": "1508062175" }, { "id": 71, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD6/HP4 31.mp3", "modified": "1508062175" }, { "id": 72, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD6/HP4 28.mp3", "modified": "1508062175" }, { "id": 73, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD6/HP4 30.mp3", "modified": "1508062175" }, { "id": 74, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 03.mp3", "modified": "1508062174" }, { "id": 75, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 04.mp3", "modified": "1508062174" }, { "id": 76, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 05.mp3", "modified": "1508062174" }, { "id": 77, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 02.mp3", "modified": "1508062174" }, { "id": 78, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 01.mp3", "modified": "1508062174" }, { "id": 79, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD1/HP3 06-1.mp3", "modified": "1508062174" }, { "id": 80, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD10/HP5 34.mp3", "modified": "1508062175" }, { "id": 81, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD10/HP5 33.mp3", "modified": "1508062175" }, { "id": 82, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD10/HP5 32.mp3", "modified": "1508062175" }, { "id": 83, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD10/HP5 35.mp3", "modified": "1508062175" }, { "id": 84, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 04.mp3", "modified": "1508062174" }, { "id": 85, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 03.mp3", "modified": "1508062174" }, { "id": 86, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 02.mp3", "modified": "1508062174" }, { "id": 87, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 05.mp3", "modified": "1508062174" }, { "id": 88, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 08-1.mp3", "modified": "1520376423" }, { "id": 89, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 06.mp3", "modified": "1508062174" }, { "id": 90, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 01.mp3", "modified": "1508062174" }, { "id": 91, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD1/HP4 07.mp3", "modified": "1508062174" }, { "id": 92, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD09/HP5 30.mp3", "modified": "1508062175" }, { "id": 93, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD09/HP5 31.mp3", "modified": "1508062175" }, { "id": 94, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD09/HP5 29.mp3", "modified": "1508062175" }, { "id": 95, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD03/HP5 10.mp3", "modified": "1508062175" }, { "id": 96, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD03/HP5 11.mp3", "modified": "1508062175" }, { "id": 97, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD03/HP5 12.mp3", "modified": "1508062175" }, { "id": 98, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD03/HP5 09-2.mp3", "modified": "1508062174" }, { "id": 99, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD8/HP7 31.mp3", "modified": "1508062175" }, { "id": 100, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD8/HP7 32.mp3", "modified": "1508062175" }, { "id": 101, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD8/HP7 33.mp3", "modified": "1508062175" }, { "id": 102, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD2/HP7 07.mp3", "modified": "1508062174" }, { "id": 103, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD2/HP7 09.mp3", "modified": "1508062175" }, { "id": 104, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD2/HP7 08.mp3", "modified": "1508062174" }, { "id": 105, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD2/HP7 06.mp3", "modified": "1508062174" }, { "id": 106, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD01/HP5 03.mp3", "modified": "1508062174" }, { "id": 107, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD01/HP5 04.mp3", "modified": "1508062174" }, { "id": 108, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD01/HP5 02.mp3", "modified": "1508062174" }, { "id": 109, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD01/HP5 01.mp3", "modified": "1508062174" }, { "id": 110, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD2/HP6 05.mp3", "modified": "1508062174" }, { "id": 111, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD2/HP6 06.mp3", "modified": "1508062174" }, { "id": 112, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD2/HP6 08.mp3", "modified": "1508062174" }, { "id": 113, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD2/HP6 09-1.mp3", "modified": "1508062174" }, { "id": 114, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD2/HP6 07.mp3", "modified": "1508062174" }, { "id": 115, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 21.mp3", "modified": "1508062175" }, { "id": 116, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 20.mp3", "modified": "1508062175" }, { "id": 117, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 16-2.mp3", "modified": "1508062175" }, { "id": 118, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 18.mp3", "modified": "1508062175" }, { "id": 119, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 22.mp3", "modified": "1508062175" }, { "id": 120, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 19.mp3", "modified": "1508062175" }, { "id": 121, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD4/HP3 17.mp3", "modified": "1508062175" }, { "id": 122, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD3/HP4 16.mp3", "modified": "1508062175" }, { "id": 123, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD3/HP4 18.mp3", "modified": "1508062175" }, { "id": 124, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD3/HP4 17.mp3", "modified": "1508062175" }, { "id": 125, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD3/HP4 14.mp3", "modified": "1508062175" }, { "id": 126, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD3/HP4 15.mp3", "modified": "1508062175" }, { "id": 127, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD5/HP6 21.mp3", "modified": "1508062175" }, { "id": 128, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD5/HP6 20.mp3", "modified": "1508062175" }, { "id": 129, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD5/HP6 18.mp3", "modified": "1508062175" }, { "id": 130, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD5/HP6 19.mp3", "modified": "1508062175" }, { "id": 131, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 11.mp3", "modified": "1508062175" }, { "id": 132, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 15.mp3", "modified": "1508062175" }, { "id": 133, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 12.mp3", "modified": "1508062175" }, { "id": 134, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 13.mp3", "modified": "1508062175" }, { "id": 135, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 14.mp3", "modified": "1508062175" }, { "id": 136, "path": "Harry Potter Steven Fry/HP3 and the Prisoner of Azkaban CD3/HP3 16-1.mp3", "modified": "1508062175" }, { "id": 137, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD4/HP4 21.mp3", "modified": "1508062175" }, { "id": 138, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD4/HP4 20.mp3", "modified": "1508062175" }, { "id": 139, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD4/HP4 22.mp3", "modified": "1508062175" }, { "id": 140, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD4/HP4 23-1.mp3", "modified": "1508062175" }, { "id": 141, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD4/HP4 19.mp3", "modified": "1508062175" }, { "id": 142, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 08.mp3", "modified": "1508062174" }, { "id": 143, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 10.mp3", "modified": "1508062175" }, { "id": 144, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 07.mp3", "modified": "1508062174" }, { "id": 145, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 09.mp3", "modified": "1508062174" }, { "id": 146, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 11.mp3", "modified": "1508062175" }, { "id": 147, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD2/HP1 12.mp3", "modified": "1508062175" }, { "id": 148, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD06/HP5 21.mp3", "modified": "1508062175" }, { "id": 149, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD06/HP5 20.mp3", "modified": "1508062175" }, { "id": 150, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD06/HP5 22.mp3", "modified": "1508062175" }, { "id": 151, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD5/HP7 20.mp3", "modified": "1508062175" }, { "id": 152, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD5/HP7 21.mp3", "modified": "1508062175" }, { "id": 153, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD5/HP7 22.mp3", "modified": "1508062175" }, { "id": 154, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD5/HP7 19.mp3", "modified": "1508062175" }, { "id": 155, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD02/HP5 05.mp3", "modified": "1508062174" }, { "id": 156, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD02/HP5 09-1.mp3", "modified": "1508062174" }, { "id": 157, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD02/HP5 06.mp3", "modified": "1508062174" }, { "id": 158, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD02/HP5 08.mp3", "modified": "1508062174" }, { "id": 159, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD02/HP5 07.mp3", "modified": "1508062174" }, { "id": 160, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD08/HP5 27.mp3", "modified": "1508062175" }, { "id": 161, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD08/HP5 26.mp3", "modified": "1508062175" }, { "id": 162, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD08/HP5 28.mp3", "modified": "1508062175" }, { "id": 163, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD1/HP7 04.mp3", "modified": "1508062174" }, { "id": 164, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD1/HP7 03.mp3", "modified": "1508062174" }, { "id": 165, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD1/HP7 02.mp3", "modified": "1508062174" }, { "id": 166, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD1/HP7 05.mp3", "modified": "1508062174" }, { "id": 167, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD1/HP7 01.mp3", "modified": "1508062174" }, { "id": 168, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD1/HP6 01.mp3", "modified": "1508062174" }, { "id": 169, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD1/HP6 02.mp3", "modified": "1508062174" }, { "id": 170, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD1/HP6 04.mp3", "modified": "1508062174" }, { "id": 171, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD1/HP6 03.mp3", "modified": "1508062174" }, { "id": 172, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD11/HP5 36.mp3", "modified": "1508062175" }, { "id": 173, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD11/HP5 38.mp3", "modified": "1508062175" }, { "id": 174, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD11/HP5 37.mp3", "modified": "1508062175" }, { "id": 175, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD4/HP2 16.mp3", "modified": "1508062175" }, { "id": 176, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD4/HP2 18.mp3", "modified": "1508062175" }, { "id": 177, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD4/HP2 17.mp3", "modified": "1508062175" }, { "id": 178, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD4/HP2 15.mp3", "modified": "1508062175" }, { "id": 179, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD3/HP2 11.mp3", "modified": "1508062175" }, { "id": 180, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD3/HP2 12.mp3", "modified": "1508062175" }, { "id": 181, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD3/HP2 14.mp3", "modified": "1508062175" }, { "id": 182, "path": "Harry Potter Steven Fry/HP2 and the Chamber of Secrets CD3/HP2 13.mp3", "modified": "1508062175" }, { "id": 183, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD7/HP4 36.mp3", "modified": "1508062175" }, { "id": 184, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD7/HP4 37.mp3", "modified": "1508062175" }, { "id": 185, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD7/HP4 33.mp3", "modified": "1508062175" }, { "id": 186, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD7/HP4 34.mp3", "modified": "1508062175" }, { "id": 187, "path": "Harry Potter Steven Fry/HP4 and the Goblet of Fire CD7/HP4 35.mp3", "modified": "1508062175" }, { "id": 188, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD6/HP6 22.mp3", "modified": "1508062175" }, { "id": 189, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD6/HP6 25.mp3", "modified": "1508062175" }, { "id": 190, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD6/HP6 24.mp3", "modified": "1508062175" }, { "id": 191, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD6/HP6 23.mp3", "modified": "1508062175" }, { "id": 192, "path": "Harry Potter Steven Fry/HP6 and the Half-Blood Prince CD6/HP6 26-1.mp3", "modified": "1508062175" }, { "id": 193, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 03.mp3", "modified": "1508062174" }, { "id": 194, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 04.mp3", "modified": "1508062174" }, { "id": 195, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 05.mp3", "modified": "1508062174" }, { "id": 196, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 02.mp3", "modified": "1508062174" }, { "id": 197, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 01.mp3", "modified": "1508062174" }, { "id": 198, "path": "Harry Potter Steven Fry/HP1 and the Philosopher's Stone CD1/HP1 06.mp3", "modified": "1508062174" }, { "id": 199, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD6/HP7 24.mp3", "modified": "1508062175" }, { "id": 200, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD6/HP7 23.mp3", "modified": "1508062175" }, { "id": 201, "path": "Harry Potter Steven Fry/HP7 and the Deathly Hallows CD6/HP7 25.mp3", "modified": "1508062175" }, { "id": 202, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD05/HP5 16.mp3", "modified": "1508062175" }, { "id": 203, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD05/HP5 18.mp3", "modified": "1508062175" }, { "id": 204, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD05/HP5 19.mp3", "modified": "1508062175" }, { "id": 205, "path": "Harry Potter Steven Fry/HP5 and the Order of the Phoenix CD05/HP5 17.mp3", "modified": "1508062175" }, { "id": 206, "path": "20.000 Meilen unter dem Meer/1-06 Die _Nautilus_.m4a", "modified": "1469617772" }, { "id": 207, "path": "20.000 Meilen unter dem Meer/1-09 Nicht vor noch Zur\u00fcck.m4a", "modified": "1469617778" }, { "id": 208, "path": "20.000 Meilen unter dem Meer/1-11 Das geheime Gefecht.m4a", "modified": "1469617780" }, { "id": 209, "path": "20.000 Meilen unter dem Meer/2-07 Am S\u00fcdpool.m4a", "modified": "1469617792" }, { "id": 210, "path": "20.000 Meilen unter dem Meer/2-05 Wo das Meer am tiefsten ist.m4a", "modified": "1469617789" }, { "id": 211, "path": "20.000 Meilen unter dem Meer/2-04 Atlantis.m4a", "modified": "1469617788" }, { "id": 212, "path": "20.000 Meilen unter dem Meer/2-09 Riesenkraken.m4a", "modified": "1469617794" }, { "id": 213, "path": "20.000 Meilen unter dem Meer/2-12 Die Flucht.m4a", "modified": "1469617798" }, { "id": 214, "path": "20.000 Meilen unter dem Meer/2-01 Perlen und Haie.m4a", "modified": "1469617784" }, { "id": 215, "path": "20.000 Meilen unter dem Meer/1-02 Das Seeungeheuer.m4a", "modified": "1469617762" }, { "id": 216, "path": "20.000 Meilen unter dem Meer/1-04 Kapit\u00e4n Nemo.m4a", "modified": "1469617766" }, { "id": 217, "path": "20.000 Meilen unter dem Meer/1-08 Zu Fuss unter Wasser.m4a", "modified": "1469617776" }, { "id": 218, "path": "20.000 Meilen unter dem Meer/2-08 Die Angst zu ersticken.m4a", "modified": "1469617793" }, { "id": 219, "path": "20.000 Meilen unter dem Meer/1-03 Gerettet!.m4a", "modified": "1469617764" }, { "id": 220, "path": "20.000 Meilen unter dem Meer/1-01 Der Aufbruch.m4a", "modified": "1469617759" }, { "id": 221, "path": "20.000 Meilen unter dem Meer/2-02 Unter der Erde hindurch.m4a", "modified": "1469617786" }, { "id": 222, "path": "20.000 Meilen unter dem Meer/1-07 Im Aquarium.m4a", "modified": "1469617774" }, { "id": 223, "path": "20.000 Meilen unter dem Meer/1-10 Die Papua-Indianer.m4a", "modified": "1469617779" }, { "id": 224, "path": "20.000 Meilen unter dem Meer/2-11 Ein Angreifer wird versenkt.m4a", "modified": "1469617796" }, { "id": 225, "path": "20.000 Meilen unter dem Meer/2-03 F\u00fcnf Millionen in Gold.m4a", "modified": "1469617787" }, { "id": 226, "path": "20.000 Meilen unter dem Meer/1-05 Wie ein Schloss voller Sch\u00e4tze.m4a", "modified": "1469617771" }, { "id": 227, "path": "20.000 Meilen unter dem Meer/2-10 Ohne Aussicht auf Freiheit.m4a", "modified": "1469617795" }, { "id": 228, "path": "20.000 Meilen unter dem Meer/2-06 Eis!.m4a", "modified": "1469617791" }, { "id": 229, "path": "file with multiple chapters.m4b", "modified": "1469617791" }, { "id": 230, "path": "No Chapter Names Test.m4b", "modified": "1469617791" } ]cozy-1.3.0/test/storages.json000066400000000000000000000002111457036466300162100ustar00rootroot00000000000000[ { "path": "/media/test" }, { "path": "/mnt/test", "location_type": 1, "default": true, "external": true } ]cozy-1.3.0/test/track_to_file.json000066400000000000000000000365701457036466300172070ustar00rootroot00000000000000[ { "file_id": 0, "start_at": 0, "track_id": 1 }, { "file_id": 1, "start_at": 0, "track_id": 2 }, { "file_id": 2, "start_at": 0, "track_id": 3 }, { "file_id": 3, "start_at": 0, "track_id": 4 }, { "file_id": 4, "start_at": 0, "track_id": 5 }, { "file_id": 5, "start_at": 0, "track_id": 6 }, { "file_id": 6, "start_at": 0, "track_id": 7 }, { "file_id": 7, "start_at": 0, "track_id": 8 }, { "file_id": 8, "start_at": 0, "track_id": 9 }, { "file_id": 9, "start_at": 0, "track_id": 10 }, { "file_id": 10, "start_at": 0, "track_id": 11 }, { "file_id": 11, "start_at": 0, "track_id": 12 }, { "file_id": 12, "start_at": 0, "track_id": 13 }, { "file_id": 13, "start_at": 0, "track_id": 14 }, { "file_id": 14, "start_at": 0, "track_id": 15 }, { "file_id": 15, "start_at": 0, "track_id": 16 }, { "file_id": 16, "start_at": 0, "track_id": 17 }, { "file_id": 17, "start_at": 0, "track_id": 18 }, { "file_id": 18, "start_at": 0, "track_id": 19 }, { "file_id": 19, "start_at": 0, "track_id": 20 }, { "file_id": 20, "start_at": 0, "track_id": 21 }, { "file_id": 21, "start_at": 0, "track_id": 22 }, { "file_id": 22, "start_at": 0, "track_id": 23 }, { "file_id": 23, "start_at": 0, "track_id": 24 }, { "file_id": 24, "start_at": 0, "track_id": 25 }, { "file_id": 25, "start_at": 0, "track_id": 26 }, { "file_id": 26, "start_at": 0, "track_id": 27 }, { "file_id": 27, "start_at": 0, "track_id": 28 }, { "file_id": 28, "start_at": 0, "track_id": 29 }, { "file_id": 29, "start_at": 0, "track_id": 30 }, { "file_id": 30, "start_at": 0, "track_id": 31 }, { "file_id": 31, "start_at": 0, "track_id": 32 }, { "file_id": 32, "start_at": 0, "track_id": 33 }, { "file_id": 33, "start_at": 0, "track_id": 34 }, { "file_id": 34, "start_at": 0, "track_id": 35 }, { "file_id": 35, "start_at": 0, "track_id": 36 }, { "file_id": 36, "start_at": 0, "track_id": 37 }, { "file_id": 37, "start_at": 0, "track_id": 38 }, { "file_id": 38, "start_at": 0, "track_id": 39 }, { "file_id": 39, "start_at": 0, "track_id": 40 }, { "file_id": 40, "start_at": 0, "track_id": 41 }, { "file_id": 41, "start_at": 0, "track_id": 42 }, { "file_id": 42, "start_at": 0, "track_id": 43 }, { "file_id": 43, "start_at": 0, "track_id": 44 }, { "file_id": 44, "start_at": 0, "track_id": 45 }, { "file_id": 45, "start_at": 0, "track_id": 46 }, { "file_id": 46, "start_at": 0, "track_id": 47 }, { "file_id": 47, "start_at": 0, "track_id": 48 }, { "file_id": 48, "start_at": 0, "track_id": 49 }, { "file_id": 49, "start_at": 0, "track_id": 50 }, { "file_id": 50, "start_at": 0, "track_id": 51 }, { "file_id": 51, "start_at": 0, "track_id": 52 }, { "file_id": 52, "start_at": 0, "track_id": 53 }, { "file_id": 53, "start_at": 0, "track_id": 54 }, { "file_id": 54, "start_at": 0, "track_id": 55 }, { "file_id": 55, "start_at": 0, "track_id": 56 }, { "file_id": 56, "start_at": 0, "track_id": 57 }, { "file_id": 57, "start_at": 0, "track_id": 58 }, { "file_id": 58, "start_at": 0, "track_id": 59 }, { "file_id": 59, "start_at": 0, "track_id": 60 }, { "file_id": 60, "start_at": 0, "track_id": 61 }, { "file_id": 61, "start_at": 0, "track_id": 62 }, { "file_id": 62, "start_at": 0, "track_id": 63 }, { "file_id": 63, "start_at": 0, "track_id": 64 }, { "file_id": 64, "start_at": 0, "track_id": 65 }, { "file_id": 65, "start_at": 0, "track_id": 66 }, { "file_id": 66, "start_at": 0, "track_id": 67 }, { "file_id": 67, "start_at": 0, "track_id": 68 }, { "file_id": 68, "start_at": 0, "track_id": 69 }, { "file_id": 69, "start_at": 0, "track_id": 70 }, { "file_id": 70, "start_at": 0, "track_id": 71 }, { "file_id": 71, "start_at": 0, "track_id": 72 }, { "file_id": 72, "start_at": 0, "track_id": 73 }, { "file_id": 73, "start_at": 0, "track_id": 74 }, { "file_id": 74, "start_at": 0, "track_id": 75 }, { "file_id": 75, "start_at": 0, "track_id": 76 }, { "file_id": 76, "start_at": 0, "track_id": 77 }, { "file_id": 77, "start_at": 0, "track_id": 78 }, { "file_id": 78, "start_at": 0, "track_id": 79 }, { "file_id": 79, "start_at": 0, "track_id": 80 }, { "file_id": 80, "start_at": 0, "track_id": 81 }, { "file_id": 81, "start_at": 0, "track_id": 82 }, { "file_id": 82, "start_at": 0, "track_id": 83 }, { "file_id": 83, "start_at": 0, "track_id": 84 }, { "file_id": 84, "start_at": 0, "track_id": 85 }, { "file_id": 85, "start_at": 0, "track_id": 86 }, { "file_id": 86, "start_at": 0, "track_id": 87 }, { "file_id": 87, "start_at": 0, "track_id": 88 }, { "file_id": 88, "start_at": 0, "track_id": 89 }, { "file_id": 89, "start_at": 0, "track_id": 90 }, { "file_id": 90, "start_at": 0, "track_id": 91 }, { "file_id": 91, "start_at": 0, "track_id": 92 }, { "file_id": 92, "start_at": 0, "track_id": 93 }, { "file_id": 93, "start_at": 0, "track_id": 94 }, { "file_id": 94, "start_at": 0, "track_id": 95 }, { "file_id": 95, "start_at": 0, "track_id": 96 }, { "file_id": 96, "start_at": 0, "track_id": 97 }, { "file_id": 97, "start_at": 0, "track_id": 98 }, { "file_id": 98, "start_at": 0, "track_id": 99 }, { "file_id": 99, "start_at": 0, "track_id": 100 }, { "file_id": 100, "start_at": 0, "track_id": 101 }, { "file_id": 101, "start_at": 0, "track_id": 102 }, { "file_id": 102, "start_at": 0, "track_id": 103 }, { "file_id": 103, "start_at": 0, "track_id": 104 }, { "file_id": 104, "start_at": 0, "track_id": 105 }, { "file_id": 105, "start_at": 0, "track_id": 106 }, { "file_id": 106, "start_at": 0, "track_id": 107 }, { "file_id": 107, "start_at": 0, "track_id": 108 }, { "file_id": 108, "start_at": 0, "track_id": 109 }, { "file_id": 109, "start_at": 0, "track_id": 110 }, { "file_id": 110, "start_at": 0, "track_id": 111 }, { "file_id": 111, "start_at": 0, "track_id": 112 }, { "file_id": 112, "start_at": 0, "track_id": 113 }, { "file_id": 113, "start_at": 0, "track_id": 114 }, { "file_id": 114, "start_at": 0, "track_id": 115 }, { "file_id": 115, "start_at": 0, "track_id": 116 }, { "file_id": 116, "start_at": 0, "track_id": 117 }, { "file_id": 117, "start_at": 0, "track_id": 118 }, { "file_id": 118, "start_at": 0, "track_id": 119 }, { "file_id": 119, "start_at": 0, "track_id": 120 }, { "file_id": 120, "start_at": 0, "track_id": 121 }, { "file_id": 121, "start_at": 0, "track_id": 122 }, { "file_id": 122, "start_at": 0, "track_id": 123 }, { "file_id": 123, "start_at": 0, "track_id": 124 }, { "file_id": 124, "start_at": 0, "track_id": 125 }, { "file_id": 125, "start_at": 0, "track_id": 126 }, { "file_id": 126, "start_at": 0, "track_id": 127 }, { "file_id": 127, "start_at": 0, "track_id": 128 }, { "file_id": 128, "start_at": 0, "track_id": 129 }, { "file_id": 129, "start_at": 0, "track_id": 130 }, { "file_id": 130, "start_at": 0, "track_id": 131 }, { "file_id": 131, "start_at": 0, "track_id": 132 }, { "file_id": 132, "start_at": 0, "track_id": 133 }, { "file_id": 133, "start_at": 0, "track_id": 134 }, { "file_id": 134, "start_at": 0, "track_id": 135 }, { "file_id": 135, "start_at": 0, "track_id": 136 }, { "file_id": 136, "start_at": 0, "track_id": 137 }, { "file_id": 137, "start_at": 0, "track_id": 138 }, { "file_id": 138, "start_at": 0, "track_id": 139 }, { "file_id": 139, "start_at": 0, "track_id": 140 }, { "file_id": 140, "start_at": 0, "track_id": 141 }, { "file_id": 141, "start_at": 0, "track_id": 142 }, { "file_id": 142, "start_at": 0, "track_id": 143 }, { "file_id": 143, "start_at": 0, "track_id": 144 }, { "file_id": 144, "start_at": 0, "track_id": 145 }, { "file_id": 145, "start_at": 0, "track_id": 146 }, { "file_id": 146, "start_at": 0, "track_id": 147 }, { "file_id": 147, "start_at": 0, "track_id": 148 }, { "file_id": 148, "start_at": 0, "track_id": 149 }, { "file_id": 149, "start_at": 0, "track_id": 150 }, { "file_id": 150, "start_at": 0, "track_id": 151 }, { "file_id": 151, "start_at": 0, "track_id": 152 }, { "file_id": 152, "start_at": 0, "track_id": 153 }, { "file_id": 153, "start_at": 0, "track_id": 154 }, { "file_id": 154, "start_at": 0, "track_id": 155 }, { "file_id": 155, "start_at": 0, "track_id": 156 }, { "file_id": 156, "start_at": 0, "track_id": 157 }, { "file_id": 157, "start_at": 0, "track_id": 158 }, { "file_id": 158, "start_at": 0, "track_id": 159 }, { "file_id": 159, "start_at": 0, "track_id": 160 }, { "file_id": 160, "start_at": 0, "track_id": 161 }, { "file_id": 161, "start_at": 0, "track_id": 162 }, { "file_id": 162, "start_at": 0, "track_id": 163 }, { "file_id": 163, "start_at": 0, "track_id": 164 }, { "file_id": 164, "start_at": 0, "track_id": 165 }, { "file_id": 165, "start_at": 0, "track_id": 166 }, { "file_id": 166, "start_at": 0, "track_id": 167 }, { "file_id": 167, "start_at": 0, "track_id": 168 }, { "file_id": 168, "start_at": 0, "track_id": 169 }, { "file_id": 169, "start_at": 0, "track_id": 170 }, { "file_id": 170, "start_at": 0, "track_id": 171 }, { "file_id": 171, "start_at": 0, "track_id": 172 }, { "file_id": 172, "start_at": 0, "track_id": 173 }, { "file_id": 173, "start_at": 0, "track_id": 174 }, { "file_id": 174, "start_at": 0, "track_id": 175 }, { "file_id": 175, "start_at": 0, "track_id": 176 }, { "file_id": 176, "start_at": 0, "track_id": 177 }, { "file_id": 177, "start_at": 0, "track_id": 178 }, { "file_id": 178, "start_at": 0, "track_id": 179 }, { "file_id": 179, "start_at": 0, "track_id": 180 }, { "file_id": 180, "start_at": 0, "track_id": 181 }, { "file_id": 181, "start_at": 0, "track_id": 182 }, { "file_id": 182, "start_at": 0, "track_id": 183 }, { "file_id": 183, "start_at": 0, "track_id": 184 }, { "file_id": 184, "start_at": 0, "track_id": 185 }, { "file_id": 185, "start_at": 0, "track_id": 186 }, { "file_id": 186, "start_at": 0, "track_id": 187 }, { "file_id": 187, "start_at": 0, "track_id": 188 }, { "file_id": 188, "start_at": 0, "track_id": 189 }, { "file_id": 189, "start_at": 0, "track_id": 190 }, { "file_id": 190, "start_at": 0, "track_id": 191 }, { "file_id": 191, "start_at": 0, "track_id": 192 }, { "file_id": 192, "start_at": 0, "track_id": 193 }, { "file_id": 193, "start_at": 0, "track_id": 194 }, { "file_id": 194, "start_at": 0, "track_id": 195 }, { "file_id": 195, "start_at": 0, "track_id": 196 }, { "file_id": 196, "start_at": 0, "track_id": 197 }, { "file_id": 197, "start_at": 0, "track_id": 198 }, { "file_id": 198, "start_at": 0, "track_id": 199 }, { "file_id": 199, "start_at": 0, "track_id": 200 }, { "file_id": 200, "start_at": 0, "track_id": 201 }, { "file_id": 201, "start_at": 0, "track_id": 202 }, { "file_id": 202, "start_at": 0, "track_id": 203 }, { "file_id": 203, "start_at": 0, "track_id": 204 }, { "file_id": 204, "start_at": 0, "track_id": 205 }, { "file_id": 205, "start_at": 0, "track_id": 206 }, { "file_id": 206, "start_at": 0, "track_id": 207 }, { "file_id": 207, "start_at": 0, "track_id": 208 }, { "file_id": 208, "start_at": 0, "track_id": 209 }, { "file_id": 209, "start_at": 0, "track_id": 210 }, { "file_id": 210, "start_at": 0, "track_id": 211 }, { "file_id": 211, "start_at": 0, "track_id": 212 }, { "file_id": 212, "start_at": 0, "track_id": 213 }, { "file_id": 213, "start_at": 0, "track_id": 214 }, { "file_id": 214, "start_at": 0, "track_id": 215 }, { "file_id": 215, "start_at": 0, "track_id": 216 }, { "file_id": 216, "start_at": 0, "track_id": 217 }, { "file_id": 217, "start_at": 0, "track_id": 218 }, { "file_id": 218, "start_at": 0, "track_id": 219 }, { "file_id": 219, "start_at": 0, "track_id": 220 }, { "file_id": 220, "start_at": 0, "track_id": 221 }, { "file_id": 221, "start_at": 0, "track_id": 222 }, { "file_id": 222, "start_at": 0, "track_id": 223 }, { "file_id": 223, "start_at": 0, "track_id": 224 }, { "file_id": 224, "start_at": 0, "track_id": 225 }, { "file_id": 225, "start_at": 0, "track_id": 226 }, { "file_id": 226, "start_at": 0, "track_id": 227 }, { "file_id": 227, "start_at": 0, "track_id": 228 }, { "file_id": 228, "start_at": 0, "track_id": 229 }, { "file_id": 229, "start_at": 0, "track_id": 230 }, { "file_id": 229, "start_at": 2578000000000, "track_id": 231 }, { "file_id": 229, "start_at": 4101000000000, "track_id": 232 }, { "file_id": 229, "start_at": 6813000000000, "track_id": 233 }, { "file_id": 230, "start_at": 10000, "track_id": 234 } ]cozy-1.3.0/test/tracks.json000066400000000000000000001121421457036466300156570ustar00rootroot00000000000000[ { "book_id": 1, "disk": 1, "id": 1, "length": 42.1, "name": "Test Track", "number": 1, "position": 0 }, { "book_id": "2", "disk": "1", "id": 2, "length": "2578.7559", "name": "Through The Trapdoor", "number": "16", "position": "0" }, { "book_id": "2", "disk": "1", "id": 3, "length": "2052.6237", "name": "The Forbidden Forest", "number": "15", "position": "0" }, { "book_id": "2", "disk": "1", "id": 4, "length": "1273.54775", "name": "Norbert The Norwegian Ridgeback", "number": "14", "position": "0" }, { "book_id": "2", "disk": "1", "id": 5, "length": "1209.0253", "name": "Nicolas Flamel", "number": "13", "position": "0" }, { "book_id": "3", "disk": "1", "id": 6, "length": "3187.01715", "name": "The Beetle at Bay", "number": "25", "position": "0" }, { "book_id": "3", "disk": "1", "id": 7, "length": "3399.86285", "name": "Occlumency", "number": "24", "position": "0" }, { "book_id": "3", "disk": "1", "id": 8, "length": "2978.37715", "name": "Christmas on the Closed Ward", "number": "23", "position": "0" }, { "book_id": "4", "disk": "1", "id": 9, "length": "2478.3151", "name": "Bathilda's Secret", "number": "17", "position": "0" }, { "book_id": "4", "disk": "1", "id": 10, "length": "1423.64735", "name": "The Life and Lies of Albus Dumbledore", "number": "18", "position": "0" }, { "book_id": "4", "disk": "1", "id": 11, "length": "2195.38285", "name": "Godric's Hollow", "number": "16", "position": "0" }, { "book_id": "4", "disk": "1", "id": 12, "length": "2894.60245", "name": "The Goblin's Revenge", "number": "15", "position": "0" }, { "book_id": "4", "disk": "1", "id": 13, "length": "1745.711", "name": "The Thief", "number": "14", "position": "0" }, { "book_id": "5", "disk": "1", "id": 14, "length": "1107.12165", "name": "The Worst Birthday", "number": "1", "position": "0" }, { "book_id": "5", "disk": "1", "id": 15, "length": "1740.17305", "name": "The Burrow", "number": "3", "position": "0" }, { "book_id": "5", "disk": "1", "id": 16, "length": "2366.929", "name": "At Flourish and Blotts", "number": "4", "position": "0" }, { "book_id": "5", "disk": "1", "id": 17, "length": "2188.3298", "name": "The Whomping Willow", "number": "5", "position": "0" }, { "book_id": "5", "disk": "1", "id": 18, "length": "1259.2588", "name": "Dobby's Warning", "number": "2", "position": "0" }, { "book_id": "6", "disk": "1", "id": 19, "length": "1826.27265", "name": "The Boggart in the Wardrobe", "number": "7", "position": "0" }, { "book_id": "6", "disk": "1", "id": 20, "length": "1832.64655", "name": "Talons and Tea Leaves", "number": "6", "position": "0" }, { "book_id": "6", "disk": "1", "id": 21, "length": "2091.4155", "name": "Grim Defeat", "number": "9", "position": "0" }, { "book_id": "6", "disk": "1", "id": 22, "length": "2049.6457", "name": "Flight of the Fat Lady", "number": "8", "position": "0" }, { "book_id": "6", "disk": "1", "id": 23, "length": "2750.2237", "name": "The Marauder's Map", "number": "10", "position": "0" }, { "book_id": "7", "disk": "1", "id": 24, "length": "2631.52325", "name": "Padfoot Returns", "number": "27", "position": "0" }, { "book_id": "7", "disk": "1", "id": 25, "length": "3020.591", "name": "The Second Task", "number": "26", "position": "0" }, { "book_id": "7", "disk": "1", "id": 26, "length": "1029.61635", "name": "The Yule Ball", "number": "23", "position": "0" }, { "book_id": "7", "disk": "1", "id": 27, "length": "2167.90205", "name": "The Egg and the Eye", "number": "25", "position": "0" }, { "book_id": "7", "disk": "1", "id": 28, "length": "2303.5037", "name": "Rita Skeeter's Scoop", "number": "24", "position": "0" }, { "book_id": "8", "disk": "1", "id": 29, "length": "2633.50855", "name": "A Very Frosty Christmas", "number": "16", "position": "0" }, { "book_id": "8", "disk": "1", "id": 30, "length": "2736.4049", "name": "A Sluggish Memory", "number": "17", "position": "0" }, { "book_id": "8", "disk": "1", "id": 31, "length": "2793.2996", "name": "Felix Felicis", "number": "14", "position": "0" }, { "book_id": "8", "disk": "1", "id": 32, "length": "2553.65225", "name": "The Unbreakable Vow", "number": "15", "position": "0" }, { "book_id": "7", "disk": "1", "id": 33, "length": "1673.6653", "name": "Mad-Eye Moody", "number": "13", "position": "0" }, { "book_id": "7", "disk": "1", "id": 34, "length": "2275.99675", "name": "The Triwizard Tournament", "number": "12", "position": "0" }, { "book_id": "7", "disk": "1", "id": 35, "length": "1302.88325", "name": "Aboard the Hogwarts Express", "number": "11", "position": "0" }, { "book_id": "7", "disk": "1", "id": 36, "length": "1200.92735", "name": "The Quidditch World Cup 2", "number": "8", "position": "0" }, { "book_id": "7", "disk": "1", "id": 37, "length": "2811.84655", "name": "The Dark Mark", "number": "9", "position": "0" }, { "book_id": "7", "disk": "1", "id": 38, "length": "1249.8808", "name": "Mayhem at the Ministry", "number": "10", "position": "0" }, { "book_id": "8", "disk": "1", "id": 39, "length": "2115.5788", "name": "Hermione's Helping Hand", "number": "11", "position": "0" }, { "book_id": "8", "disk": "1", "id": 40, "length": "1318.11265", "name": "The Half-Blood Prince", "number": "9", "position": "0" }, { "book_id": "8", "disk": "1", "id": 41, "length": "2652.0294", "name": "The House of Gaunt", "number": "10", "position": "0" }, { "book_id": "8", "disk": "1", "id": 42, "length": "2433.33225", "name": "The Secret Riddle", "number": "13", "position": "0" }, { "book_id": "8", "disk": "1", "id": 43, "length": "2270.30205", "name": "Silver and Opals", "number": "12", "position": "0" }, { "book_id": "4", "disk": "1", "id": 44, "length": "2568.54205", "name": "Magic is Might", "number": "12", "position": "0" }, { "book_id": "4", "disk": "1", "id": 45, "length": "2524.42125", "name": "The Muggle-Born Registration Commission", "number": "13", "position": "0" }, { "book_id": "4", "disk": "1", "id": 46, "length": "2944.31345", "name": "Kreacher's Tale", "number": "10", "position": "0" }, { "book_id": "4", "disk": "1", "id": 47, "length": "2465.09715", "name": "The Bribe", "number": "11", "position": "0" }, { "book_id": "4", "disk": "1", "id": 48, "length": "2142.64165", "name": "King's Cross", "number": "35", "position": "0" }, { "book_id": "4", "disk": "1", "id": 49, "length": "2023.13145", "name": "The Forest Again", "number": "34", "position": "0" }, { "book_id": "4", "disk": "1", "id": 50, "length": "707.3698", "name": "Nineteen Years Later", "number": "37", "position": "0" }, { "book_id": "4", "disk": "1", "id": 51, "length": "3429.38125", "name": "The Flaw in the Plan", "number": "36", "position": "0" }, { "book_id": "4", "disk": "1", "id": 52, "length": "1840.58775", "name": "The Lost Diadem", "number": "29", "position": "0" }, { "book_id": "4", "disk": "1", "id": 53, "length": "1182.0408", "name": "The Final Hiding Place", "number": "27", "position": "0" }, { "book_id": "4", "disk": "1", "id": 54, "length": "2878.4588", "name": "Gringotts", "number": "26", "position": "0" }, { "book_id": "4", "disk": "1", "id": 55, "length": "1906.3641", "name": "The Missing Mirror", "number": "28", "position": "0" }, { "book_id": "4", "disk": "1", "id": 56, "length": "2093.79265", "name": "The Sacking of Severus Snape", "number": "30", "position": "0" }, { "book_id": "3", "disk": "1", "id": 57, "length": "3461.61635", "name": "Detention with Dolores", "number": "13", "position": "0" }, { "book_id": "3", "disk": "1", "id": 58, "length": "3224.529", "name": "Percy and Padfoot", "number": "14", "position": "0" }, { "book_id": "3", "disk": "1", "id": 59, "length": "2919.2098", "name": "The Hogwarts High Inquisitor", "number": "15", "position": "0" }, { "book_id": "5", "disk": "1", "id": 60, "length": "1993.4041", "name": "The Rogue Bludger", "number": "10", "position": "0" }, { "book_id": "5", "disk": "1", "id": 61, "length": "1835.46775", "name": "Gilderoy Lockhart", "number": "6", "position": "0" }, { "book_id": "5", "disk": "1", "id": 62, "length": "1773.9494", "name": "The Deathday Party", "number": "8", "position": "0" }, { "book_id": "5", "disk": "1", "id": 63, "length": "2023.0008", "name": "The Writing on the Wall", "number": "9", "position": "0" }, { "book_id": "5", "disk": "1", "id": 64, "length": "1697.7241", "name": "Mudbloods and Murmurs", "number": "7", "position": "0" }, { "book_id": "8", "disk": "1", "id": 65, "length": "2217.03835", "name": "The Cave", "number": "26", "position": "0" }, { "book_id": "8", "disk": "1", "id": 66, "length": "2489.7306", "name": "The White Tomb", "number": "30", "position": "0" }, { "book_id": "8", "disk": "1", "id": 67, "length": "1590.5437", "name": "The Flight of the Prince", "number": "28", "position": "0" }, { "book_id": "8", "disk": "1", "id": 68, "length": "2022.45225", "name": "The Lightning-Struck Tower", "number": "27", "position": "0" }, { "book_id": "8", "disk": "1", "id": 69, "length": "2477.009", "name": "The Phoenix Lament", "number": "29", "position": "0" }, { "book_id": "7", "disk": "1", "id": 70, "length": "901.19835", "name": "Flesh, Blood and Bone", "number": "32", "position": "0" }, { "book_id": "7", "disk": "1", "id": 71, "length": "1634.1159", "name": "The Dream", "number": "29", "position": "0" }, { "book_id": "7", "disk": "1", "id": 72, "length": "3068.47345", "name": "The Third Task", "number": "31", "position": "0" }, { "book_id": "7", "disk": "1", "id": 73, "length": "2808.7641", "name": "The Madness of Mr Crouch", "number": "28", "position": "0" }, { "book_id": "7", "disk": "1", "id": 74, "length": "2608.9796", "name": "The Pensieve", "number": "30", "position": "0" }, { "book_id": "6", "disk": "1", "id": 75, "length": "1817.52165", "name": "The Knight Bus", "number": "3", "position": "0" }, { "book_id": "6", "disk": "1", "id": 76, "length": "2069.2637", "name": "The Leaky Cauldron", "number": "4", "position": "0" }, { "book_id": "6", "disk": "1", "id": 77, "length": "2746.3053", "name": "The Dementor", "number": "5", "position": "0" }, { "book_id": "6", "disk": "1", "id": 78, "length": "1614.13225", "name": "Aunt Marge's Big Mistake", "number": "2", "position": "0" }, { "book_id": "6", "disk": "1", "id": 79, "length": "1544.30695", "name": "Owl Post", "number": "1", "position": "0" }, { "book_id": "6", "disk": "1", "id": 80, "length": "953.54775", "name": "Talons and Tea Leaves", "number": "6", "position": "0" }, { "book_id": "3", "disk": "1", "id": 81, "length": "2185.82205", "name": "The Department of Mysteries", "number": "34", "position": "0" }, { "book_id": "3", "disk": "1", "id": 82, "length": "1628.08165", "name": "Fight and Flight", "number": "33", "position": "0" }, { "book_id": "3", "disk": "1", "id": 83, "length": "2474.9453", "name": "Out of the Fire", "number": "32", "position": "0" }, { "book_id": "3", "disk": "1", "id": 84, "length": "3287.53635", "name": "Beyond the Veil", "number": "35", "position": "0" }, { "book_id": "7", "disk": "1", "id": 85, "length": "1199.90855", "name": "Back to the Burrow", "number": "4", "position": "0" }, { "book_id": "7", "disk": "1", "id": 86, "length": "1236.689", "name": "The Invitation", "number": "3", "position": "0" }, { "book_id": "7", "disk": "1", "id": 87, "length": "1116.57795", "name": "The Scar", "number": "2", "position": "0" }, { "book_id": "7", "disk": "1", "id": 88, "length": "1403.6898", "name": "Weasleys' Wizard Wheezes", "number": "5", "position": "0" }, { "book_id": "7", "disk": "1", "id": 89, "length": "1162.9192", "name": "The Quidditch World Cup 1", "number": "8", "position": "0" }, { "book_id": "7", "disk": "1", "id": 90, "length": "878.73305", "name": "The Portkey", "number": "6", "position": "0" }, { "book_id": "7", "disk": "1", "id": 91, "length": "1740.4604", "name": "The Riddle House", "number": "1", "position": "0" }, { "book_id": "7", "disk": "1", "id": 92, "length": "2023.0008", "name": "Bagman and Crouch", "number": "7", "position": "0" }, { "book_id": "3", "disk": "1", "id": 93, "length": "3274.73635", "name": "Grawp", "number": "30", "position": "0" }, { "book_id": "3", "disk": "1", "id": 94, "length": "3200.99265", "name": "OWLs", "number": "31", "position": "0" }, { "book_id": "3", "disk": "1", "id": 95, "length": "2986.86695", "name": "Careers Advice", "number": "29", "position": "0" }, { "book_id": "3", "disk": "1", "id": 96, "length": "2399.9739", "name": "Luna Lovegood", "number": "10", "position": "0" }, { "book_id": "3", "disk": "1", "id": 97, "length": "2507.80735", "name": "The Sorting Hat's New Song", "number": "11", "position": "0" }, { "book_id": "3", "disk": "1", "id": 98, "length": "3481.78285", "name": "Professor Umbridge", "number": "12", "position": "0" }, { "book_id": "3", "disk": "1", "id": 99, "length": "1534.90285", "name": "he Woes of Mrs Weasley", "number": "9", "position": "0" }, { "book_id": "4", "disk": "1", "id": 100, "length": "3440.5355", "name": "The Battle of Hogwarts", "number": "31", "position": "0" }, { "book_id": "4", "disk": "1", "id": 101, "length": "2546.57305", "name": "The Elder Wand", "number": "32", "position": "0" }, { "book_id": "4", "disk": "1", "id": 102, "length": "3771.19345", "name": "The Prince's Tale", "number": "33", "position": "0" }, { "book_id": "4", "disk": "1", "id": 103, "length": "2802.4947", "name": "The Will of Albus Dumbledore", "number": "7", "position": "0" }, { "book_id": "4", "disk": "1", "id": 104, "length": "1759.84325", "name": "A Place to Hide", "number": "9", "position": "0" }, { "book_id": "4", "disk": "1", "id": 105, "length": "2721.0449", "name": "The Wedding", "number": "8", "position": "0" }, { "book_id": "4", "disk": "1", "id": 106, "length": "2803.93145", "name": "The Ghoul in Pyjamas", "number": "6", "position": "0" }, { "book_id": "3", "disk": "1", "id": 107, "length": "2084.3102", "name": "The Advance Guard", "number": "3", "position": "0" }, { "book_id": "3", "disk": "1", "id": 108, "length": "2135.90205", "name": "Number Twelve, Grimmauld Place", "number": "4", "position": "0" }, { "book_id": "3", "disk": "1", "id": 109, "length": "2536.5943", "name": "A Peck of Owls", "number": "2", "position": "0" }, { "book_id": "3", "disk": "1", "id": 110, "length": "2469.9298", "name": "Dudley Demented", "number": "1", "position": "0" }, { "book_id": "8", "disk": "1", "id": 111, "length": "2626.1159", "name": "An Excess of Phlegm", "number": "5", "position": "0" }, { "book_id": "8", "disk": "1", "id": 112, "length": "2497.0188", "name": "Draco's Detour", "number": "6", "position": "0" }, { "book_id": "8", "disk": "1", "id": 113, "length": "1768.88165", "name": "Snape Victorious", "number": "8", "position": "0" }, { "book_id": "8", "disk": "1", "id": 114, "length": "1212.8392", "name": "The Half-Blood Prince", "number": "9", "position": "0" }, { "book_id": "8", "disk": "1", "id": 115, "length": "2689.2539", "name": "The Slug Club", "number": "7", "position": "0" }, { "book_id": "6", "disk": "1", "id": 116, "length": "2856.0196", "name": "Hermione's Secret", "number": "21", "position": "0" }, { "book_id": "6", "disk": "1", "id": 117, "length": "849.5543", "name": "The Dementors' Kiss", "number": "20", "position": "0" }, { "book_id": "6", "disk": "1", "id": 118, "length": "863.6343", "name": "Professor Trelawney's Prediction", "number": "16", "position": "0" }, { "book_id": "6", "disk": "1", "id": 119, "length": "909.8449", "name": "Moony, Wormtail, Padfoot and Prongs", "number": "18", "position": "0" }, { "book_id": "6", "disk": "1", "id": 120, "length": "1867.4155", "name": "Owl Post Again", "number": "22", "position": "0" }, { "book_id": "6", "disk": "1", "id": 121, "length": "2091.729", "name": "The Servant of Lord Voldemort", "number": "19", "position": "0" }, { "book_id": "6", "disk": "1", "id": 122, "length": "1754.46205", "name": "Cat, Rat and Dog", "number": "17", "position": "0" }, { "book_id": "7", "disk": "1", "id": 123, "length": "2457.1298", "name": "The Goblet of Fire", "number": "16", "position": "0" }, { "book_id": "7", "disk": "1", "id": 124, "length": "2659.68325", "name": "The Weighing of the Wands", "number": "18", "position": "0" }, { "book_id": "7", "disk": "1", "id": 125, "length": "1720.3461", "name": "The Four Champions", "number": "17", "position": "0" }, { "book_id": "7", "disk": "1", "id": 126, "length": "1932.3037", "name": "The Unforgivable Curses", "number": "14", "position": "0" }, { "book_id": "7", "disk": "1", "id": 127, "length": "2104.00655", "name": "Beauxbatons and Durmstrang", "number": "15", "position": "0" }, { "book_id": "8", "disk": "1", "id": 128, "length": "2376.2547", "name": "The Unknowable Room", "number": "21", "position": "0" }, { "book_id": "8", "disk": "1", "id": 129, "length": "2884.70205", "name": "Lord Voldemort's Request", "number": "20", "position": "0" }, { "book_id": "8", "disk": "1", "id": 130, "length": "2858.8147", "name": "Birthday Surprises", "number": "18", "position": "0" }, { "book_id": "8", "disk": "1", "id": 131, "length": "2583.35345", "name": "Elf Tails", "number": "19", "position": "0" }, { "book_id": "6", "disk": "1", "id": 132, "length": "2157.45305", "name": "The Firebolt", "number": "11", "position": "0" }, { "book_id": "6", "disk": "1", "id": 133, "length": "2240.88815", "name": "The Quidditch Final", "number": "15", "position": "0" }, { "book_id": "6", "disk": "1", "id": 134, "length": "1873.26695", "name": "The Patronus", "number": "12", "position": "0" }, { "book_id": "6", "disk": "1", "id": 135, "length": "1598.30205", "name": "Gryffindor vs Ravenclaw", "number": "13", "position": "0" }, { "book_id": "6", "disk": "1", "id": 136, "length": "2096.849", "name": "Snape's Grudge", "number": "14", "position": "0" }, { "book_id": "6", "disk": "1", "id": 137, "length": "866.40325", "name": "Professor Trelawney's Prediction", "number": "16", "position": "0" }, { "book_id": "7", "disk": "1", "id": 138, "length": "2105.75675", "name": "The House-Elf Liberation Front", "number": "21", "position": "0" }, { "book_id": "7", "disk": "1", "id": 139, "length": "2783.5298", "name": "The First Task", "number": "20", "position": "0" }, { "book_id": "7", "disk": "1", "id": 140, "length": "1645.8188", "name": "The Unexpected Task", "number": "22", "position": "0" }, { "book_id": "7", "disk": "1", "id": 141, "length": "1988.2841", "name": "The Yule Ball", "number": "23", "position": "0" }, { "book_id": "7", "disk": "1", "id": 142, "length": "2425.20815", "name": "The Hungarian Horntail", "number": "19", "position": "0" }, { "book_id": "2", "disk": "1", "id": 143, "length": "1124.33635", "name": "The Potions Master", "number": "8", "position": "0" }, { "book_id": "2", "disk": "1", "id": 144, "length": "1560.50285", "name": "Halloween", "number": "10", "position": "0" }, { "book_id": "2", "disk": "1", "id": 145, "length": "1773.2441", "name": "The Sorting Hat", "number": "7", "position": "0" }, { "book_id": "2", "disk": "1", "id": 146, "length": "1835.20655", "name": "The Midnight Duel", "number": "9", "position": "0" }, { "book_id": "2", "disk": "1", "id": 147, "length": "1206.02125", "name": "Quidditch", "number": "11", "position": "0" }, { "book_id": "2", "disk": "1", "id": 148, "length": "2056.7249", "name": "The Mirror Of Erised", "number": "12", "position": "0" }, { "book_id": "3", "disk": "1", "id": 149, "length": "3005.49225", "name": "The Eye of the Snake", "number": "21", "position": "0" }, { "book_id": "3", "disk": "1", "id": 150, "length": "2387.4351", "name": "Hagrid's Tale", "number": "20", "position": "0" }, { "book_id": "3", "disk": "1", "id": 151, "length": "3206.45225", "name": "St Mungo's Hospital for Magical Maladies and Injuries", "number": "22", "position": "0" }, { "book_id": "4", "disk": "1", "id": 152, "length": "1833.6653", "name": "Xenophilius Lovegood", "number": "20", "position": "0" }, { "book_id": "4", "disk": "1", "id": 153, "length": "2060.591", "name": "The Tale of the Three Brothers", "number": "21", "position": "0" }, { "book_id": "4", "disk": "1", "id": 154, "length": "2436.0751", "name": "The Deathly Hallows", "number": "22", "position": "0" }, { "book_id": "4", "disk": "1", "id": 155, "length": "2802.6253", "name": "The Silver Doe", "number": "19", "position": "0" }, { "book_id": "3", "disk": "1", "id": 156, "length": "2075.37635", "name": "The Order of the Phoenix", "number": "5", "position": "0" }, { "book_id": "3", "disk": "1", "id": 157, "length": "1715.6441", "name": "he Woes of Mrs Weasley", "number": "9", "position": "0" }, { "book_id": "3", "disk": "1", "id": 158, "length": "2659.55265", "name": "The Noble and Most Ancient House of Black", "number": "6", "position": "0" }, { "book_id": "3", "disk": "1", "id": 159, "length": "1752.71185", "name": "The Hearing", "number": "8", "position": "0" }, { "book_id": "3", "disk": "1", "id": 160, "length": "1859.44815", "name": "The Ministry of Magic", "number": "7", "position": "0" }, { "book_id": "3", "disk": "1", "id": 161, "length": "3121.37145", "name": "The Centaur and the Sneak", "number": "27", "position": "0" }, { "book_id": "3", "disk": "1", "id": 162, "length": "3410.57305", "name": "Seen and Unforeseen", "number": "26", "position": "0" }, { "book_id": "3", "disk": "1", "id": 163, "length": "3300.38855", "name": "Snape's Worst Memory", "number": "28", "position": "0" }, { "book_id": "4", "disk": "1", "id": 164, "length": "2347.80735", "name": "The Seven Potters", "number": "4", "position": "0" }, { "book_id": "4", "disk": "1", "id": 165, "length": "1511.68", "name": "The Dursleys Departing", "number": "3", "position": "0" }, { "book_id": "4", "disk": "1", "id": 166, "length": "1827.31755", "name": "In Memoriam", "number": "2", "position": "0" }, { "book_id": "4", "disk": "1", "id": 167, "length": "2660.3102", "name": "Fallen Warrior", "number": "5", "position": "0" }, { "book_id": "4", "disk": "1", "id": 168, "length": "1580.591", "name": "The Dark Lord Ascending", "number": "1", "position": "0" }, { "book_id": "8", "disk": "1", "id": 169, "length": "2258.3641", "name": "The Other Minister", "number": "1", "position": "0" }, { "book_id": "8", "disk": "1", "id": 170, "length": "2361.2604", "name": "Spinner's End", "number": "2", "position": "0" }, { "book_id": "8", "disk": "1", "id": 171, "length": "2684.7347", "name": "Horace Slughorn", "number": "4", "position": "0" }, { "book_id": "8", "disk": "1", "id": 172, "length": "2193.711", "name": "Will and Won't", "number": "3", "position": "0" }, { "book_id": "3", "disk": "1", "id": 173, "length": "1714.0506", "name": "The Only One He Ever Feared", "number": "36", "position": "0" }, { "book_id": "3", "disk": "1", "id": 174, "length": "3028.271", "name": "The Second War Begins", "number": "38", "position": "0" }, { "book_id": "3", "disk": "1", "id": 175, "length": "3385.9396", "name": "The Lost Prophecy", "number": "37", "position": "0" }, { "book_id": "5", "disk": "1", "id": 176, "length": "2385.711", "name": "The Chamber of Secrets", "number": "16", "position": "0" }, { "book_id": "5", "disk": "1", "id": 177, "length": "1691.4547", "name": "Dobby's Reward", "number": "18", "position": "0" }, { "book_id": "5", "disk": "1", "id": 178, "length": "2530.5339", "name": "The Heir of Slytherin", "number": "17", "position": "0" }, { "book_id": "5", "disk": "1", "id": 179, "length": "1951.6604", "name": "Aragog", "number": "15", "position": "0" }, { "book_id": "5", "disk": "1", "id": 180, "length": "2357.83835", "name": "The Dueling Club", "number": "11", "position": "0" }, { "book_id": "5", "disk": "1", "id": 181, "length": "2160.11755", "name": "The Polyjuice Potion", "number": "12", "position": "0" }, { "book_id": "5", "disk": "1", "id": 182, "length": "1636.12735", "name": "Cornelius Fudge", "number": "14", "position": "0" }, { "book_id": "5", "disk": "1", "id": 183, "length": "2195.48735", "name": "The Very Secret Diary", "number": "13", "position": "0" }, { "book_id": "7", "disk": "1", "id": 184, "length": "2474.5796", "name": "The Parting of the Ways", "number": "36", "position": "0" }, { "book_id": "7", "disk": "1", "id": 185, "length": "1928.56815", "name": "The Beginning", "number": "37", "position": "0" }, { "book_id": "7", "disk": "1", "id": 186, "length": "1862.71345", "name": "The Death Eaters", "number": "33", "position": "0" }, { "book_id": "7", "disk": "1", "id": 187, "length": "1248.65305", "name": "Priori Incantatem", "number": "34", "position": "0" }, { "book_id": "7", "disk": "1", "id": 188, "length": "2481.7894", "name": "Veritaserum", "number": "35", "position": "0" }, { "book_id": "8", "disk": "1", "id": 189, "length": "2662.4", "name": "After the Burial", "number": "22", "position": "0" }, { "book_id": "8", "disk": "1", "id": 190, "length": "2127.0988", "name": "The Seer Overheard", "number": "25", "position": "0" }, { "book_id": "8", "disk": "1", "id": 191, "length": "2584.03265", "name": "Sectumsempra", "number": "24", "position": "0" }, { "book_id": "8", "disk": "1", "id": 192, "length": "2575.28165", "name": "Horcruxes", "number": "23", "position": "0" }, { "book_id": "8", "disk": "1", "id": 193, "length": "574.929", "name": "The Cave", "number": "26", "position": "0" }, { "book_id": "2", "disk": "1", "id": 194, "length": "1505.489", "name": "The Letters From No One", "number": "3", "position": "0" }, { "book_id": "2", "disk": "1", "id": 195, "length": "1472.0261", "name": "The Keeper Of The Keys", "number": "4", "position": "0" }, { "book_id": "2", "disk": "1", "id": 196, "length": "2653.3094", "name": "Diagon Alley", "number": "5", "position": "0" }, { "book_id": "2", "disk": "1", "id": 197, "length": "1330.65145", "name": "The Vanishing Glass", "number": "2", "position": "0" }, { "book_id": "2", "disk": "1", "id": 198, "length": "1909.8645", "name": "The Boy Who Lived", "number": "1", "position": "0" }, { "book_id": "2", "disk": "1", "id": 199, "length": "2285.4792", "name": "The Journey From Platform Nine And Three-Quarters", "number": "6", "position": "0" }, { "book_id": "4", "disk": "1", "id": 200, "length": "2919.39265", "name": "The Wandmaker", "number": "24", "position": "0" }, { "book_id": "4", "disk": "1", "id": 201, "length": "3620.5192", "name": "Malfoy Manor", "number": "23", "position": "0" }, { "book_id": "4", "disk": "1", "id": 202, "length": "1804.06855", "name": "Shell Cottage", "number": "25", "position": "0" }, { "book_id": "3", "disk": "1", "id": 203, "length": "2276.7543", "name": "In the Hog's Head", "number": "16", "position": "0" }, { "book_id": "3", "disk": "1", "id": 204, "length": "2794.449", "name": "Dumbledore's Army", "number": "18", "position": "0" }, { "book_id": "3", "disk": "1", "id": 205, "length": "2693.04165", "name": "The Lion and the Serpent", "number": "19", "position": "0" }, { "book_id": "3", "disk": "1", "id": 206, "length": "2760.5943", "name": "Educational Decree Number Twenty-four", "number": "17", "position": "0" }, { "book_id": "9", "disk": "1", "id": 207, "length": "561.1066666666667", "name": "Die Nautilus", "number": "6", "position": "382983253750" }, { "book_id": "9", "disk": "1", "id": 208, "length": "292.6933333333333", "name": "Nicht vor noch Zur\u00fcck", "number": "9", "position": "0" }, { "book_id": "9", "disk": "1", "id": 209, "length": "340.4533333333333", "name": "Das geheime Gefecht", "number": "11", "position": "0" }, { "book_id": "9", "disk": "2", "id": 210, "length": "148.57333333333332", "name": "Am S\u00fcdpool", "number": "7", "position": "0" }, { "book_id": "9", "disk": "2", "id": 211, "length": "348.88", "name": "Wo das Meer am tiefsten ist", "number": "5", "position": "0" }, { "book_id": "9", "disk": "2", "id": 212, "length": "261.50666666666666", "name": "Atlantis", "number": "4", "position": "0" }, { "book_id": "9", "disk": "2", "id": 213, "length": "317.17333333333335", "name": "Riesenkraken", "number": "9", "position": "0" }, { "book_id": "9", "disk": "2", "id": 214, "length": "378.32", "name": "Die Flucht", "number": "12", "position": "378073792000" }, { "book_id": "9", "disk": "2", "id": 215, "length": "618.1333333333333", "name": "Perlen und Haie", "number": "1", "position": "0" }, { "book_id": "9", "disk": "1", "id": 216, "length": "508.92", "name": "Das Seeungeheuer", "number": "2", "position": "0" }, { "book_id": "9", "disk": "1", "id": 217, "length": "297.18666666666667", "name": "Kapit\u00e4n Nemo", "number": "4", "position": "0" }, { "book_id": "9", "disk": "1", "id": 218, "length": "284.29333333333335", "name": "Zu Fuss unter Wasser", "number": "8", "position": "0" }, { "book_id": "9", "disk": "2", "id": 219, "length": "359.62666666666667", "name": "Die Angst zu ersticken", "number": "8", "position": "0" }, { "book_id": "9", "disk": "1", "id": 220, "length": "259.2133333333333", "name": "Gerettet!", "number": "3", "position": "0" }, { "book_id": "9", "disk": "1", "id": 221, "length": "381.4266666666667", "name": "Der Aufbruch", "number": "1", "position": "229153450000" }, { "book_id": "9", "disk": "2", "id": 222, "length": "586.8666666666667", "name": "Unter der Erde hindurch", "number": "2", "position": "0" }, { "book_id": "9", "disk": "1", "id": 223, "length": "380.7866666666667", "name": "Im Aquarium", "number": "7", "position": "0" }, { "book_id": "9", "disk": "1", "id": 224, "length": "270.74666666666667", "name": "Die Papua-Indianer", "number": "10", "position": "0" }, { "book_id": "9", "disk": "2", "id": 225, "length": "326.38666666666666", "name": "Ein Angreifer wird versenkt", "number": "11", "position": "0" }, { "book_id": "9", "disk": "2", "id": 226, "length": "363.02666666666664", "name": "F\u00fcnf Millionen in Gold", "number": "3", "position": "0" }, { "book_id": "9", "disk": "1", "id": 227, "length": "470.5466666666667", "name": "Wie ein Schloss voller Sch\u00e4tze", "number": "5", "position": "34005799000" }, { "book_id": "9", "disk": "2", "id": 228, "length": "246.58666666666667", "name": "Ohne Aussicht auf Freiheit", "number": "10", "position": "0" }, { "book_id": "9", "disk": "2", "id": 229, "length": "464.24", "name": "Eis!", "number": "6", "position": "0" }, { "book_id": "11", "disk": "1", "id": 230, "length": "2578", "name": "Chapter 1", "number": "1", "position": "0" }, { "book_id": "11", "disk": "1", "id": 231, "length": "1523", "name": "Chapter 2", "number": "2", "position": "0" }, { "book_id": "11", "disk": "1", "id": 232, "length": "2712", "name": "Chapter 3", "number": "3", "position": "0" }, { "book_id": "11", "disk": "1", "id": 233, "length": "3237", "name": "Chapter 4", "number": "4", "position": "0" }, { "book_id": 12, "disk": 1, "id": 234, "length": 42.1, "name": "", "number": 2, "position": 0 } ]