Compare commits

..

No commits in common. "master" and "0.4.2" have entirely different histories.

141 changed files with 6085 additions and 19650 deletions

13
.gitignore vendored
View File

@ -8,16 +8,3 @@ build/
vendor/
.criterion/
org.gnome.*.json~
podcasts-gtk/po/gnome-podcasts.pot
# scripts/test.sh
target_*/
# flatpak-builder stuff
.flatpak-builder/
app/
repo/
# Files configured by meson
podcasts-gtk/src/config.rs
podcasts-gtk/src/static_resource.rs

View File

@ -1,30 +1,144 @@
include:
- project: 'gnome/citemplates'
file: 'flatpak/flatpak-ci-initiative-sdk-extensions.yml'
# ref: ''
stages:
- test
- lint
- review
variables:
BUNDLE: "gnome-podcasts-dev.flatpak"
.cargo_cache_template: &cargo_cache
cache:
# JOB_NAME - Each job will have it's own cache
# COMMIT_REF_SLUG = Lowercase name of the branch
# ^ Keep diffrerent caches for each branch
key: "$CI_JOB_NAME"
paths:
- target/
- .cargo_cache/
.cargo_test_template: &cargo_test
stage: test
variables:
RUSTFLAGS: "--cfg rayon_unstable"
RUST_BACKTRACE: "FULL"
before_script:
- apt-get update -yqq
- apt-get install -yqq --no-install-recommends build-essential libgtk-3-dev meson libgstreamer1.0-dev
- mkdir -p .cargo_cache
# Only stuff inside the repo directory can be cached
# Override the CARGO_HOME variable to force it location
- export CARGO_HOME="${PWD}/.cargo_cache"
script:
- rustc -Vv && cargo -Vv
# Force regeneration of gresources regardless of artifacts chage
- cd podcasts-gtk/resources/ && glib-compile-resources --generate resources.xml && cd ../../
- cargo build
- cargo test -- --test-threads=1
- cargo test -- --test-threads=1 --ignored
<<: *cargo_cache
.rust:stable:
# https://hub.docker.com/_/rust/
image: "rust"
<<: *cargo_test
.rust:nightly:
# https://hub.docker.com/r/rustlang/rust/
image: "rustlang/rust:nightly"
<<: *cargo_test
only:
- schedule
- web
flatpak:
image: 'registry.gitlab.gnome.org/gnome/gnome-runtime-images/rust_bundle:3.36'
variables:
MANIFEST_PATH: "org.gnome.Podcasts.Devel.json"
FLATPAK_MODULE: "gnome-podcasts"
MESON_ARGS: "-Dprofile=development"
APP_ID: "org.gnome.Podcasts.Devel"
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
BUNDLE: "org.gnome.Podcasts.Devel.flatpak"
extends: '.flatpak'
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/rust_bundle:3.28
stage: test
script:
- flatpak-builder --stop-at=gnome-podcasts app org.gnome.Podcasts.json
# https://gitlab.gnome.org/World/podcasts/issues/55
# Force regeneration of gresources regardless of artifacts chage
- flatpak-builder --run app org.gnome.Podcasts.json glib-compile-resources --sourcedir=podcasts-gtk/resources/ podcasts-gtk/resources/resources.xml
# Configure and run rustfmt
# Build the flatpak repo
- flatpak-builder --run app org.gnome.Podcasts.json meson --prefix=/app --libdir=/app/lib _build
- flatpak-builder --run app org.gnome.Podcasts.json ninja -C _build install
- flatpak-builder --finish-only app org.gnome.Podcasts.json
- flatpak build-export repo app
# Create a flatpak bundle
- flatpak build-bundle repo ${BUNDLE} org.gnome.Podcasts
# Run the tests
# - flatpak-builder --run app org.gnome.Podcasts.json cargo test -- --test-threads=1
# - flatpak-builder --run app org.gnome.Podcasts.json cargo test -- --test-threads=1 --ignored
artifacts:
paths:
- $BUNDLE
expire_in: 30 days
cache:
# JOB_NAME - Each job will have it's own cache
# COMMIT_REF_SLUG = Lowercase name of the branch
# ^ Keep diffrerent caches for each branch
key: "$CI_JOB_NAME"
paths:
- .flatpak-builder/cache/
- target/
review:
stage: review
dependencies:
- flatpak
script:
- echo "Generating flatpak deployment"
artifacts:
paths:
- $BUNDLE
expire_in: 30 days
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://gitlab.gnome.org/$CI_PROJECT_PATH/-/jobs/$CI_JOB_ID/artifacts/raw/${BUNDLE}
on_stop: stop_review
except:
- master@World/podcasts
stop_review:
stage: review
script:
- echo "Stopping flatpak deployment"
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
except:
- master@World/podcasts
# Configure and run rustfmt on nightly
# Exits and builds fails if on bad format
rustfmt:
image: "rust:slim"
stage: ".pre"
script:
- rustup component add rustfmt
# Create blank versions of our configured files
# so rustfmt does not yell about non-existent files or completely empty files
- echo -e "" >> podcasts-gtk/src/config.rs
- echo -e "" >> podcasts-gtk/src/static_resource.rs
- rustc -Vv && cargo -Vv
- cargo fmt --version
- cargo fmt --all -- --color=always --check
image: "registry.gitlab.com/alatiera/rustfmt-oci-image/rustfmt:nightly"
stage: lint
script:
- rustc -Vv && cargo -Vv
- cargo fmt --version
- cargo fmt --all -- --check
# Configure and run clippy on nightly
# Only fails on errors atm.
.clippy:
image: "registry.gitlab.gnome.org/alatiera/hammond-container-images/clippy:nightly"
stage: lint
variables:
RUSTFLAGS: "--cfg rayon_unstable"
CARGO_HOME: ".cargo_cache"
script:
- rustc --version && cargo --version
- cargo clippy --version
# Force regeneration of gresources regardless of artifacts chage
- cd podcasts-gtk/resources/ && glib-compile-resources --generate resources.xml && cd ../../
- cargo clippy --all
<<: *cargo_cache

View File

@ -11,7 +11,9 @@ Reproducible in:
Please test if the issue was already fixed in the unstable version of the app.
For that, follow these steps:
1. Make sure Flatpak is installed or install it following these steps https://flatpak.org/setup
2. Install the unstable version of the app following, flatpak bundles can be found in the CI artifacts.
2. Install the unstable version of the app following this link
https://gitlab.gnome.org/GNOME/gnome-apps-nightly/raw/master/nautilus.flatpakref and save
it as a ".flatpakref" file
If these steps failed, write in 'Other' the distribution youre using and
the version of the app.

View File

@ -1 +0,0 @@
### Please attach a relevant issue to this MR, if this doesn't exist please create one.

View File

@ -5,7 +5,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added:
### Changed:
@ -14,129 +13,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
### Removed:
## [0.4.7] - 2019-10-23
### Added:
- Improved appdata validation and meson tests World/podcasts!89
- The ability to export show subscriptions to opml files World/podcasts!77
- Support for feeds requiring authentication World/podcasts!120
### Changed:
- Episodes now have a checkmark to show whether or not they've been played World/podcasts!106
- Changed to how errors are shown when adding podcasts World/podcasts!108 World/podcasts!109 World/podcasts!110
- Improved integration of cargo and meson World/podcasts!94
- Refactored some macros for error handling World/podcasts!82
- Refactored the handling of styling changes World/podcasts!119
- Updated the icon to better match the HIG guidlines World/podcasts#102
- Made Podcasts use a GtkApplication subclass World/podcasts!113
- Updated the MPRIS permissions in order to remove a sandbox hole World/podcasts!124
- Bumped gtk and libhandy minimum versions
### Fixed:
- Rewind now works regardless if its the start or the end of the episode World/podcasts!83
- Typos in the README and CONTRIBUTING docs World/podcast!97 World/podcast!98 World/podcast!99 World/podcasts!121
- Show cover is reset properly now if there isn't an image World/podcasts#114
- Query pairs are no longer stripped from URLs World/podcasts!111
- Pause MPRIS button now works on KDE Plasma World/podcasts#115
- The playback widget now properly reflects the playback state on episode change World/podcasts!116
### Removed:
- All preferences World/podcast!104
## [0.4.6] - 2018-10-07
### Added:
- Felix, @haecker-felix, wrote an [mpris crate](https://crates.io/crates/mpris-player) and implemented MPRIS2 client side support! !74 #68
### Changed:
- Download Cancel button was changed to an Icon instead of a label !72
- The applciation will no longer scale below 360p in width 1933c79f7a87d8261d91ca4e14eb51c1ddc66624
- Update to the latest HIG 5050dda4d2f75b706842de8507d115dd5a1bd0a9
- Chris, @brainblasted, upgraded hyper to 0.12, this brings openssl 1.1 support !75
- Pipeline backend is now completly migrated to tokio-runtime 0887789f5e653dd92ad397fb39561df6dffcb45c
- Resume playing an episode will attempt to rewind the track only if more than a minute has passed since the last pause !76
### Fixed:
- Fixed a regression where indexing feeds was blocking the `tokio reactor` #88 !70
- Episodeds Listbox no longer resizes when a download starts #89 !72
- The `total_size` label of the `EpisodeWidget` now behaves correctly if the request fails #90 !73
- The Pipeline will no longer log things in stderr for Requests that returned 304 and are expected to be skipped da361d0cb93cd8edd076859b2c607509a96dac8d
- A bug where the HomeView wold get into an invalid state if your only shows had no episodes 32bd2a89a34e8e940b3b260c6be76defe11835ed
### Translations:
**Added**
- Brazilian Portuguese translation 586cf16f
- Swedish translation 2e527250
- Italian translation a23297e5
- Friulian translation 60e09c0d
- Hungarian translation 2751a828
- Croatian translation 0476b67b
- Latvian translation a681b2c9
- Czech translation 3563a964
- Catalan translation 6ea3fc91
**Updated**
- German translation
- Finnish translation
- Polish translation
- Turkish translation
- Croatian translation
- Indonesian translation
- Spanish translation
## [0.4.5] - 2018-08-31
### Added:
- [OARS](https://hughsie.github.io/oars/) Tags where added for compatibility with Store clients b0c94dd9
- Daniel added support for Translations !46
- Svitozar Cherepii(@svito) created a [wiki page](https://wiki.gnome.org/Apps/Podcasts) 70e79e50
- Libhandy was added as a dependancy #70
- Development builds can now be installed in parallel with stable builds !64
### Changed:
- The update indication was moved to an In-App notification #72
- The app icon's accent color was changed from orange to red 0dfb4859
- The stack switcher in the Headerbar is now insesitive on Empty Views !63
### Fixed:
- Improved handling of HTTP redirections #64 !61 !62
- Fixed a major performance regression when loading show covers !67
- More refference cycles have been fixed !59
- OPML import dialog now exits properly and no longer keeps the application from shuting down !65
- Update action is disabled if there isn't something to update #71
### Translations:
- Added Finish 93696026
- Added Polish 1bd6efc0
- Added Turkish 73929f2d
- Added Spanish !46
- Added German 6b6c390c
- Added Galician 0060a634
- Added Indonesian ded0224f
- Added Korean 36f16963
## [0.4.4] - 2018-07-31
### Changed:
- `SendCell` crate was replaced with `Fragile`. (Jorda Petridis) 838320785ebbea94e009698b473495cfec076f54
- Update dependancies (Jorda Petridis) 91bea8551998b16e44e5358fdd43c53422bcc6f3
### Fixed:
- Fix more refference cycles. (Jorda Petridis) 3496df24f8d8bfa8c8a53d8f00262d42ee39b41c
- Actually fix cargo-vendor (Jorda Petridis)
## [0.4.3] - 2018-07-27
### Fixed:
- Fix the cargo vendor config for the tarball releash script. (Jorda Petridis) a2440c19e11ca4dcdbcb67cd85259a41fe3754d6
## [0.4.2] - 2018-07-27
### Changed:

View File

@ -5,9 +5,9 @@ Thank you for looking in this file!
When contributing to the development of GNOME Podcasts, please first discuss the change you wish to make via issue, email, or any other method with the maintainers before making a change.
If you have any questions regarding the use or development of GNOME Podcasts,
want to discuss design or simply hang out, please join us in [#gnome-podcasts:matrix.org](https://matrix.to/#/#gnome-podcasts:matrix.org) or [#hammond on irc.gnome.org.](irc://irc.gnome.org/#hammond)
want to discuss design or simply hang out, please join us in [#hammond on irc.gnome.org.](irc://irc.gnome.org/#hammond)
Please note we have a [code of conduct](/code-of-conduct.md), please follow it in all your interactions with the project.
Please note we have a [code of conduct](https://wiki.gnome.org/Foundation/CodeOfConduc), please follow it in all your interactions with the project.
## Source repository
@ -26,12 +26,9 @@ makes things easier for the maintainers.
We use [rustfmt](https://github.com/rust-lang-nursery/rustfmt) for code formatting and we enforce it on the gitlab-CI server.
***Installing rustfmt*** As of 2019/Jan, our continuous integration
pipeline assumes the version of rustfmt that is distributed through the
stable channel of [rustup](rustup.rs). You can install it with
Quick setup
```
rustup component add rustfmt
cargo install rustfmt-nightly
cargo fmt --all
```
@ -39,7 +36,7 @@ It is recommended to add a pre-commit hook to run cargo test and `cargo fmt`.
Don't forget to `git add` again after `cargo fmt`.
```
#!/bin/sh
cargo test -- --test-threads=1 && cargo fmt --all -- --check
cargo test -- --test-threads=1 && cargo fmt --all -- --write-mode=diff
```
## Running the test suite
@ -47,7 +44,7 @@ cargo test -- --test-threads=1 && cargo fmt --all -- --check
Running the tests requires an internet connection and it it will download some files from the [Internet Archive](archive.org)
The test suite sets a temporary sqlite database in the `/tmp` folder.
Due to that it's not possible to run them in parallel.
Due to that it's not possible to run them in parrallel.
In order to run the test suite use the following: `cargo test -- --test-threads=1`
@ -94,13 +91,13 @@ Steps to reproduce:
* [ ] qa (quality assurance) tasks
```
## Merge Request Process
## Pull Request Process
1. Ensure your code compiles. Run `meson` & `ninja` before creating the merge request.
1. Ensure your code compiles. Run `make` before creating the pull request.
2. Ensure the test suit passes. Run `cargo test -- --test-threads=1`.
3. Ensure your code is properly formatted. Run `cargo fmt --all`.
3. Ensure your code is properly formated. Run `cargo fmt --all`.
4. If you're adding new API, it must be properly documented.
5. The commit message has to be formatted as follows:
5. The commit message is formatted as follows:
```
component: <summary>
@ -110,8 +107,8 @@ Steps to reproduce:
<link to the bug ticket>
```
6. You may merge the merge request once you have the sign-off of the maintainers, or if you
6. You may merge the pull request in once you have the sign-off of the maintainers, or if you
do not have permission to do that, you may request the second reviewer to merge it for you.
## Code of Conduct
We follow the [GNOME Foundation Code of Conduct](/code-of-conduct.md).
We follow the Gnome [Code of Conduct.](https://wiki.gnome.org/Foundation/CodeOfConduct)

3498
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -6,4 +6,4 @@ members = [
]
[profile.release]
debug = true
debug = false

105
README.md
View File

@ -7,53 +7,57 @@ Listen to your favorite podcasts, right from your desktop.
![shows_view](./screenshots/shows_view.png)
![show_widget](./screenshots/show_widget.png)
## Available on Flathub
[![Get it from Flathub!](https://flathub.org/assets/badges/flathub-badge-en.svg)](https://flathub.org/apps/details/org.gnome.Podcasts)
## Quick start
GNOME Podcasts can be built and run with [Gnome Builder][builder] >= 3.28.
Just clone the repo and hit the run button!
GNOME Podcasts can be built and run with [Gnome Builder](https://wiki.gnome.org/Apps/Builder) >= 3.28.
You can get Builder from [here][get_builder].
Get Builder [here](https://wiki.gnome.org/Apps/Builder/Downloads)
## Broken Feeds
Found a feed that does not work in GNOME Podcasts?
Please [open an issue][new_issue] and choose the `BrokenFeed` template so we will know and fix it!
Please [open an issue](https://gitlab.gnome.org/World/podcasts/issues/new) and choose the `BrokenFeed` template so we will know and fix it!
## Getting in Touch
If you have any questions regarding the use or development of GNOME Podcasts,
want to discuss design or simply hang out, please join us on our [irc][irc] or [matrix][matrix] channel.
want to discuss design or simply hang out, please join us in `#hammond` on
[irc.gnome.org.][irc] or [matrix][matrix].
Note:
There isn't much documentation yet, so you will probably have question about parts of the Code.
## Building
### Flatpak
Flatpak is the recommended way of building and installing GNOME Podcasts.
Here are the dependencies you will need.
Flatpak is the reccomended way of building and installing GNOME Podcasts.
```sh
# Add flathub and the gnome-nightly repo
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
#### Building a Flatpak
# Install the gnome-nightly Sdk and Platform runtime
flatpak install --user gnome-nightly org.gnome.Sdk org.gnome.Platform
Download the `org.gnome.Podcasts.json` flatpak manifest from this repo.
```bash
# Add flathub repo
flatpak --user remote-add flathub --if-not-exists https://dl.flathub.org/repo/flathub.flatpakrepo
# Add the gnome-nightly repo
flatpak --user remote-add gnome-nightly --if-not-exists https://sdk.gnome.org/gnome-nightly.flatpakrepo
# Install the gnome-nightly Sdk and Platform runtim
flatpak --user install gnome-nightly org.gnome.Sdk org.gnome.Platform
# Install the required rust-stable extension from flathub
flatpak install --user flathub org.freedesktop.Sdk.Extension.rust-stable//19.08
flatpak --user install flathub org.freedesktop.Sdk.Extension.rust-stable
flatpak-builder --user --repo=repo podcasts org.gnome.Podcasts.json --force-clean
```
To install the resulting flatpak you can do:
```bash
flatpak-builder --user --install --force-clean --repo=repo podcasts org.gnome.Podcasts.json
flatpak build-bundle repo gnome-podcasts.flatpak org.gnome.Podcasts
flatpak install --user --bundle gnome-podcasts.flatpak
```
### Building from source
### Building from soure
```sh
git clone https://gitlab.gnome.org/World/podcasts.git
@ -65,34 +69,51 @@ sudo ninja -C build install
#### Dependencies
* Rust stable 1.34 or later along with cargo.
* Gtk+ 3.24.11 or later
* Gstreamer 1.16 or later
* libhandy 0.0.11 or later
* Rust stable 1.27 or later along with cargo.
* Gtk+ 3.22 or later
* Gstreamer 1.12 or later
* Meson
* A network connection
Offline build are possible too, but [`cargo-vendor`][vendor] would have to be setup first
**Debian/Ubuntu**
```sh
apt-get install -yqq cargo rustc libsqlite3-dev libssl-dev libgtk-3-dev meson \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav libgstrtspserver-1.0-dev ibgstreamer-plugins-bad1.0-dev
```
**Fedora**
```sh
dnf install -y rust cargo gtk3-devel glib2-devel openssl-devel sqlite-devel meson \
gstreamer1-devel gstreamer1-plugins-base-tools gstreamer1-devel-docs \
gstreamer1-plugins-base-devel gstreamer1-plugins-base-devel-docs \
gstreamer1-plugins-good gstreamer1-plugins-good-extras \
gstreamer1-plugins-bad-free gstreamer1-plugins-bad-free-devel \
gstreamer1-plugins-bad-free-extras
```
If you happen to build it on other distributions please let me know the names
of the corresponding libraries. Feel free to open a MR or an Issue to note it.
## Contributing
There are a lot of things yet to be done.
There alot of thins yet to be done.
If you want to contribute, please check the [Contributions Guidelines][contribution-guidelines].
You can start by taking a look at [Issues][issues] or by opening a [New issue][new_issue].
You can start by taking a look at [Issues](https://gitlab.gnome.org/World/podcasts/issues) or by opening a [New issue](https://gitlab.gnome.org/World/podcasts/issues/new?issue%5Bassignee_id%5D=&issue%5Bmilestone_id%5D=).
There are also some minor tasks tagged with `TODO:` and `FIXME:` in the source code.
[contribution-guidelines]: https://gitlab.gnome.org/World/podcasts/blob/master/CONTRIBUTING.md
### Translations
Translation of this project takes place on the GNOME translation platform,
[Damned Lies](https://l10n.gnome.org/module/podcasts). For further
information on how to join a language team, or even to create one, please see
[GNOME Translation Project wiki page](https://wiki.gnome.org/TranslationProject).
## Overview
@ -117,27 +138,17 @@ $ tree -d
## A note about the project's name
The project used to be called Hammond, after Allan Moore's character [Evey Hammond][hammond] from the graphic novel V for Vendetta.
The project used to be called Hammond, after Allan Moore's character [Evey Hammond](https://en.wikipedia.org/wiki/Evey_Hammond) from the graphic novel V for Vendetta.
It was renamed to GNOME Podcasts on 2018/07/24 shortly before its first public release.
## Acknowledgments
GNOME Podcasts's design is heavily inspired by [GNOME Music][music] and [Vocal][vocal].
GNOME Podcasts's design is heavily insired by [GNOME Music](https://wiki.gnome.org/Design/Apps/Music) and [Vocal](http://vocalproject.net/).
We also copied some elements from [GNOME News][news].
We also copied some elements from [GNOME News](https://wiki.gnome.org/Design/Apps/Potential/News).
And almost the entirety of the build system is copied from the [Fractal][fractal] project.
And almost the entirety of the build system is copied from the [Fractal](https://gitlab.gnome.org/danigm/fractal) project.
[vendor]: https://github.com/alexcrichton/cargo-vendor
[irc]: irc://irc.gnome.org/#hammond
[matrix]: https://matrix.to/#/#gnome-podcasts:matrix.org
[flatpak_setup]: https://flatpak.org/setup/
[music]: https://wiki.gnome.org/Design/Apps/Music
[vocal]: http://vocalproject.net/
[news]: https://wiki.gnome.org/Design/Apps/Potential/News
[fractal]: https://gitlab.gnome.org/World/fractal
[hammond]: https://en.wikipedia.org/wiki/Evey_Hammond
[issues]: https://gitlab.gnome.org/World/podcasts/issues
[new_issue]: https://gitlab.gnome.org/World/podcasts/issues/new
[builder]: https://wiki.gnome.org/Apps/Builder
[get_builder]: https://wiki.gnome.org/Apps/Builder/Downloads

View File

@ -1,126 +0,0 @@
# GNOME Code of Conduct
Thank you for being a part of the GNOME project. We value your participation and want everyone to have an enjoyable and fulfilling experience. Accordingly, all participants are expected to follow this Code of Conduct, and to show respect, understanding, and consideration to one another. Thank you for helping make this a welcoming, friendly community for everyone.
## Scope
This Code of Conduct applies to all online GNOME community spaces, including, but not limited to:
* Issue tracking systems - bugzilla.gnome.org
* Documentation and tutorials - developer.gnome.org
* Code repositories - git.gnome.org and gitlab.gnome.org
* Mailing lists - mail.gnome.org
* Wikis - wiki.gnome.org
* Chat and forums - irc.gnome.org, discourse.gnome.org, GNOME Telegram channels, and GNOME groups and channels on Matrix.org (including bridges to GNOME IRC channels)
* Community spaces hosted on gnome.org infrastructure
* Any other channels or groups which exist in order to discuss GNOME project activities
Communication channels and private conversations that are normally out of scope may be considered in scope if a GNOME participant is being stalked or harassed. Social media conversations may be considered in-scope if the incident occurred under a GNOME event hashtag, or when an official GNOME account on social media is tagged, or within any other discussion about GNOME. The GNOME Foundation reserves the right to take actions against behaviors that happen in any context, if they are deemed to be relevant to the GNOME project and its participants.
All participants in GNOME online community spaces are subject to the Code of Conduct. This includes GNOME Foundation board members, corporate sponsors, and paid employees. This also includes volunteers, maintainers, leaders, contributors, contribution reviewers, issue reporters, GNOME users, and anyone participating in discussion in GNOME online spaces.
## Reporting an Incident
If you believe that someone is violating the Code of Conduct, or have
any other concerns, please [contact the Code of Conduct committee](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide).
## Our Standards
The GNOME online community is dedicated to providing a positive experience for everyone, regardless of:
* age
* body size
* caste
* citizenship
* disability
* education
* ethnicity
* familial status
* gender expression
* gender identity
* genetic information
* immigration status
* level of experience
* nationality
* personal appearance
* pregnancy
* race
* religion
* sex characteristics
* sexual orientation
* sexual identity
* socio-economic status
* tribe
* veteran status
### Community Guidelines
Examples of behavior that contributes to creating a positive environment include:
* **Be friendly.** Use welcoming and inclusive language.
* **Be empathetic.** Be respectful of differing viewpoints and experiences.
* **Be respectful.** When we disagree, we do so in a polite and constructive manner.
* **Be considerate.** Remember that decisions are often a difficult choice between competing priorities. Focus on what is best for the community. Keep discussions around technology choices constructive and respectful.
* **Be patient and generous.** If someone asks for help it is because they need it. When documentation is available that answers the question, politely point them to it. If the question is off-topic, suggest a more appropriate online space to seek help.
* **Try to be concise.** Read the discussion before commenting in order to not repeat a point that has been made.
### Inappropriate Behavior
Community members asked to stop any inappropriate behavior are expected to comply immediately.
We want all participants in the GNOME community have the best possible experience they can. In order to be clear what that means, we've provided a list of examples of behaviors that are inappropriate for GNOME community spaces:
* **Deliberate intimidation, stalking, or following.**
* **Sustained disruption of online discussion, talks, or other events.** Sustained disruption of events, online discussions, or meetings, including talks and presentations, will not be tolerated. This includes 'Talking over' or 'heckling' event speakers or influencing crowd actions that cause hostility in event sessions. Sustained disruption also includes drinking alcohol to excess or using recreational drugs to excess, or pushing others to do so.
* **Harassment of people who don't drink alcohol.** We do not tolerate derogatory comments about those who abstain from alcohol or other substances. We do not tolerate pushing people to drink, talking about their abstinence or preferences to others, or pressuring them to drink - physically or through jeering.
* **Sexist, racist, homophobic, transphobic, ableist language or otherwise exclusionary language.** This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle and/or indirect discrimination.
* **Unwelcome sexual attention or behavior that contributes to a sexualized environment.** This includes sexualized comments, jokes or imagery in interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Sponsors should not use sexualized images, activities, or other material. Meetup organizing staff and other volunteer organizers should not use sexualized clothing/uniforms/costumes, or otherwise create a sexualized environment.
* **Unwelcome physical contact.** This includes touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter, etc) or tattoos. This also includes physically blocking or intimidating another person. Physical contact or simulated physical contact (such as emojis like "kiss") without affirmative consent is not acceptable. This includes sharing or distribution of sexualized images or text.
* **Violence or threats of violence.** Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual, including encouraging a person to commit self-harm. This also includes posting or threatening to post other people's personally identifying information ("doxxing") online.
* **Influencing or encouraging inappropriate behavior.** If you influence or encourage another person to violate the Code of Conduct, you may face the same consequences as if you had violated the Code of Conduct.
* **Possession of an offensive weapon at a GNOME event.** This includes anything deemed to be a weapon by the event organizers.
The GNOME community prioritizes marginalized people's safety over privileged people's comfort. The committee will not act on complaints regarding:
* "Reverse"-isms, including "reverse racism," "reverse sexism," and "cisphobia"
* Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you."
* Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions
* Communicating boundaries or criticizing oppressive behavior in a "tone" you don't find congenial
The examples listed above are not against the Code of Conduct. If you have questions about the above statements, please [read this document](https://github.com/sagesharp/code-of-conduct-template/blob/master/code-of-conduct/example-reversisms.md#supporting-diversity).
If a participant engages in behavior that violates this code of conduct, the GNOME Code of Conduct committee may take any action they deem appropriate. Examples of consequences are outlined in the [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures).
## Procedure for Handling Incidents
* [Reporter Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide)
* [Moderator Procedures](https://wiki.gnome.org/Foundation/CodeOfConduct/ModeratorProcedures)
* [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures)
## License
The GNOME Online Code of Conduct is licensed under a [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/)
![Creative Commons License](http://i.creativecommons.org/l/by-sa/3.0/88x31.png)
## Attribution
The GNOME Online Code of Conduct was forked from the example policy from the [Geek Feminism wiki, created by the Ada Initiative and other volunteers](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), which is under a Creative Commons Zero license.
Additional language was incorporated and modified from the following Codes of Conduct:
* [Citizen Code of Conduct](http://citizencodeofconduct.org/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/).
* [Code of Conduct template](https://github.com/sagesharp/code-of-conduct-template/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) by [Otter Tech](https://otter.technology/code-of-conduct-training)
* [Contributor Covenant version 1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct) (licensed [CC BY 4.0](https://github.com/ContributorCovenant/contributor_covenant/blob/master/LICENSE.md))
* [Data Carpentry Code of Conduct](https://docs.carpentries.org/topic_folders/policies/index_coc.html) is licensed [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/)
* [Django Project Code of Conduct](https://www.djangoproject.com/conduct/) is licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/)
* [Fedora Code of Conduct](http://fedoraproject.org/code-of-conduct)
* [Geek Feminism Anti-harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy) which is under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/)
* [Previous GNOME Foundation Code of Conduct](https://wiki.gnome.org/action/recall/Foundation/CodeOfConduct/Old)
* [LGBTQ in Technology Slack Code of Conduct](https://lgbtq.technology/coc.html) licensed [Creative Commons Zero](https://creativecommons.org/publicdomain/zero/1.0/)
* [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) is licensed [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/).
* [Python Mentors Code of Conduct](http://pythonmentors.com/)
* [Speak Up! Community Code of Conduct](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html), licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/)

View File

@ -1,90 +1,41 @@
# Adatped from:
# https://gitlab.gnome.org/danigm/fractal/blob/6e2911f9d2353c99a18a6c19fab7f903c4bbb431/meson.build
project(
'gnome-podcasts', 'rust',
version: '0.4.7',
version: '0.4.2',
license: 'GPLv3',
)
dependency('sqlite3', version: '>= 3.20')
dependency('openssl', version: '>= 1.0')
dependency('dbus-1')
dependency('glib-2.0', version: '>= 2.56')
dependency('gio-2.0', version: '>= 2.56')
dependency('gdk-pixbuf-2.0')
dependency('gtk+-3.0', version: '>= 3.24.11')
dependency('libhandy-0.0', version: '>= 0.0.13')
dependency('gstreamer-1.0', version: '>= 1.16')
dependency('gstreamer-base-1.0', version: '>= 1.16')
dependency('gstreamer-audio-1.0', version: '>= 1.16')
dependency('gstreamer-video-1.0', version: '>= 1.16')
dependency('gstreamer-player-1.0', version: '>= 1.16')
dependency('gstreamer-plugins-base-1.0', version: '>= 1.16')
dependency('gstreamer-plugins-bad-1.0', version: '>= 1.16')
dependency('gstreamer-bad-audio-1.0', version: '>= 1.16')
cargo = find_program('cargo', required: true)
gresource = find_program('glib-compile-resources', required: true)
gschemas = find_program('glib-compile-schemas', required: true)
if get_option('profile') == 'development'
profile = '.Devel'
vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip()
if vcs_tag == ''
version_suffix = '-devel'
else
version_suffix = '-@0@'.format (vcs_tag)
endif
else
profile = ''
version_suffix = ''
endif
podcast_toml = files(
'Cargo.toml',
'Cargo.lock',
'podcasts-data/Cargo.toml',
'podcasts-downloader/Cargo.toml',
'podcasts-gtk/Cargo.toml',
)
application_id = 'org.gnome.Podcasts@0@'.format(profile)
i18n = import('i18n')
gnome = import('gnome')
subdir('podcasts-gtk/po')
podir = join_paths (meson.source_root (), 'podcasts-gtk', 'po')
podcasts_version = meson.project_version()
version_array = podcasts_version.split('.')
podcasts_major_version = version_array[0].to_int()
podcasts_minor_version = version_array[1].to_int()
podcasts_version_micro = version_array[2].to_int()
podcasts_prefix = get_option('prefix')
podcasts_bindir = join_paths(podcasts_prefix, get_option('bindir'))
podcasts_localedir = join_paths(podcasts_prefix, get_option('localedir'))
podcasts_conf = configuration_data()
podcasts_conf.set('appid', application_id)
podcasts_conf.set('bindir', podcasts_bindir)
podcasts_conf.set('BINDIR', podcasts_bindir)
datadir = get_option('datadir')
icondir = join_paths(datadir, 'icons')
subdir('podcasts-gtk/resources')
cargo = find_program('cargo', required: false)
gresource = find_program('glib-compile-resources', required: false)
cargo_vendor = find_program('cargo-vendor', required: false)
cargo_script = find_program('scripts/cargo.sh')
test_script = find_program('scripts/test.sh')
subdir('podcasts-data/src')
subdir('podcasts-downloader/src')
subdir('podcasts-gtk/src')
cargo_release = custom_target('cargo-build',
build_by_default: true,
build_always: true,
output: ['gnome-podcasts'],
install: true,
install_dir: podcasts_bindir,
command: [cargo_script, '@CURRENT_SOURCE_DIR@', '@OUTPUT@'])
meson.add_dist_script(
'scripts/dist-vendor.sh',
meson.source_root(),
join_paths(meson.build_root(), 'meson-dist', meson.project_name() + '-' + podcasts_version)
)
test(
'cargo-test',
test_script,
args: meson.build_root(),
workdir: meson.source_root(),
timeout: 3000
)
run_target('release', command: ['scripts/release.sh',
meson.project_name() + '-' + podcasts_version
])

View File

@ -1,9 +0,0 @@
option (
'profile',
type: 'combo',
choices: [
'default',
'development'
],
value: 'default'
)

View File

@ -1,72 +0,0 @@
{
"app-id" : "org.gnome.Podcasts.Devel",
"runtime" : "org.gnome.Platform",
"runtime-version" : "3.36",
"sdk" : "org.gnome.Sdk",
"sdk-extensions" : [
"org.freedesktop.Sdk.Extension.rust-stable"
],
"command" : "gnome-podcasts",
"tags" : [
"nightly"
],
"finish-args" : [
"--share=network",
"--share=ipc",
"--socket=x11",
"--socket=fallback-x11",
"--socket=wayland",
"--socket=pulseaudio",
"--env=USE_PLAYBING3=1"
],
"build-options" : {
"append-path" : "/usr/lib/sdk/rust-stable/bin",
"build-args" : [
"--share=network"
],
"env" : {
"CARGO_HOME" : "/run/build/Podcasts/cargo",
"RUSTFLAGS" : "",
"RUST_BACKTRACE" : "1"
}
},
"modules" : [
{
"name" : "libhandy",
"buildsystem" : "meson",
"config-opts" : [
"-Dintrospection=disabled",
"-Dgtk_doc=false",
"-Dtests=false",
"-Dexamples=false",
"-Dvapi=false",
"-Dglade_catalog=disabled"
],
"cleanup" : [
"/include",
"/lib/pkgconfig"
],
"sources" : [
{
"type" : "git",
"url" : "https://source.puri.sm/Librem5/libhandy.git",
"tag" : "v0.0.13"
}
]
},
{
"name" : "gnome-podcasts",
"buildsystem" : "meson",
"builddir" : "true",
"config-opts" : [
"-Dprofile=development"
],
"sources" : [
{
"type" : "git",
"url" : "https://gitlab.gnome.org/World/podcasts.git"
}
]
}
]
}

View File

@ -1,7 +1,7 @@
{
"app-id" : "org.gnome.Podcasts",
"runtime" : "org.gnome.Platform",
"runtime-version" : "3.36",
"runtime-version" : "3.28",
"sdk" : "org.gnome.Sdk",
"sdk-extensions" : [
"org.freedesktop.Sdk.Extension.rust-stable"
@ -10,15 +10,18 @@
"tags" : [
"nightly"
],
"desktop-file-name-suffix" : " ☢️",
"desktop-file-name-prefix" : "(Nightly) ",
"finish-args" : [
"--filesystem=xdg-run/dconf",
"--filesystem=~/.config/dconf:ro",
"--talk-name=ca.desrt.dconf",
"--env=DCONF_USER_CONFIG_DIR=.config/dconf",
"--share=network",
"--share=ipc",
"--socket=x11",
"--socket=fallback-x11",
"--socket=wayland",
"--socket=pulseaudio",
"--env=USE_PLAYBING3=1"
"--talk-name=org.freedesktop.Desktop"
],
"build-options" : {
"append-path" : "/usr/lib/sdk/rust-stable/bin",
@ -27,41 +30,19 @@
],
"env" : {
"CARGO_HOME" : "/run/build/Podcasts/cargo",
"RUST_BACKTRACE" : "1"
"RUST_BACKTRACE" : "1",
"DEBUG" : "true"
}
},
"modules" : [
{
"name" : "libhandy",
"buildsystem" : "meson",
"config-opts" : [
"-Dintrospection=disabled",
"-Dgtk_doc=false",
"-Dtests=false",
"-Dexamples=false",
"-Dvapi=false",
"-Dglade_catalog=disabled"
],
"cleanup" : [
"/include",
"/lib/pkgconfig"
],
"sources" : [
{
"type" : "git",
"url" : "https://source.puri.sm/Librem5/libhandy.git",
"tag" : "v0.0.13"
}
]
},
{
"name" : "gnome-podcasts",
"builddir" : "true",
"buildsystem" : "meson",
"sources" : [
{
"type" : "git",
"url" : "https://gitlab.gnome.org/World/podcasts.git"
"url" : "https://gitlab.gnome.org/World/podcasts.git",
"branch" : "master"
}
]
}

View File

@ -1,42 +1,46 @@
[package]
authors = ["Jordan Petridis <jpetridis@gnome.org>"]
authors = ["Jordan Petridis <jordanpetridis@protonmail.com>"]
name = "podcasts-data"
version = "0.1.0"
edition = "2018"
workspace = "../"
[dependencies]
ammonia = "3.1.0"
chrono = "0.4.11"
derive_builder = "0.9.0"
lazy_static = "1.4.0"
log = "0.4.8"
rayon = "1.3.1"
ammonia = "1.2.0"
chrono = "0.4.4"
derive_builder = "0.5.1"
lazy_static = "1.0.2"
log = "0.4.3"
rayon = "1.0.2"
rayon-futures = "0.1.0"
rfc822_sanitizer = "0.3.3"
rss = "1.9.0"
url = "2.1.1"
xdg = "2.2.0"
xml-rs = "0.8.3"
futures = "0.1.29"
hyper = "0.12.35"
http = "0.1.19"
tokio = "0.1.22"
hyper-tls = "0.3.2"
native-tls = "0.2.3"
num_cpus = "1.13.0"
failure = "0.1.8"
failure_derive = "0.1.8"
base64 = "0.12.2"
rss = "1.5.0"
url = "1.7.1"
xdg = "2.1.0"
xml-rs = "0.8.0"
futures = "0.1.23"
hyper = "0.11.27"
tokio-core = "0.1.17"
hyper-tls = "0.1.3"
native-tls = "0.1.5"
num_cpus = "1.8.0"
failure = "0.1.1"
failure_derive = "0.1.1"
[dependencies.diesel]
features = ["sqlite", "r2d2"]
version = "1.4.5"
version = "1.3.2"
[dependencies.diesel_migrations]
features = ["sqlite"]
version = "1.4.0"
version = "1.3.0"
[dev-dependencies]
rand = "0.7.2"
rand = "0.5.4"
tempdir = "0.3.7"
pretty_assertions = "0.6.1"
maplit = "1.0.2"
criterion = "0.2.4"
pretty_assertions = "0.5.1"
maplit = "1.0.1"
[[bench]]
name = "bench"
harness = false

View File

@ -0,0 +1,104 @@
#![allow(unused)]
#[macro_use]
extern crate criterion;
use criterion::Criterion;
// extern crate futures;
extern crate hyper;
extern crate hyper_tls;
extern crate podcasts_data;
extern crate rand;
extern crate tokio_core;
// extern crate rayon;
extern crate rss;
// use rayon::prelude::*;
// use futures::future::*;
use tokio_core::reactor::Core;
use podcasts_data::database::truncate_db;
use podcasts_data::pipeline;
use podcasts_data::FeedBuilder;
use podcasts_data::Source;
// use podcasts_data::errors::*;
use std::io::BufReader;
// RSS feeds
const INTERCEPTED: &[u8] = include_bytes!("../tests/feeds/2018-01-20-Intercepted.xml");
const INTERCEPTED_URL: &str = "https://web.archive.org/web/20180120083840if_/https://feeds.\
feedburner.com/InterceptedWithJeremyScahill";
const UNPLUGGED: &[u8] = include_bytes!("../tests/feeds/2018-01-20-LinuxUnplugged.xml");
const UNPLUGGED_URL: &str =
"https://web.archive.org/web/20180120110314if_/https://feeds.feedburner.com/linuxunplugged";
const TIPOFF: &[u8] = include_bytes!("../tests/feeds/2018-01-20-TheTipOff.xml");
const TIPOFF_URL: &str =
"https://web.archive.org/web/20180120110727if_/https://rss.acast.com/thetipoff";
// This feed has HUGE descripion and summary fields which can be very
// very expensive to parse.
const CODE: &[u8] = include_bytes!("../tests/feeds/2018-01-20-GreaterThanCode.xml");
const CODE_URL: &str =
"https://web.archive.org/web/20180120104741if_/https://www.greaterthancode.com/feed/podcast";
// Relative small feed
const STARS: &[u8] = include_bytes!("../tests/feeds/2018-01-20-StealTheStars.xml");
const STARS_URL: &str =
"https://web.archive.org/web/20180120104957if_/https://rss.art19.com/steal-the-stars";
static FEEDS: &[(&[u8], &str)] = &[
(INTERCEPTED, INTERCEPTED_URL),
(UNPLUGGED, UNPLUGGED_URL),
(TIPOFF, TIPOFF_URL),
(CODE, CODE_URL),
(STARS, STARS_URL),
];
fn bench_index_large_feed(c: &mut Criterion) {
truncate_db().unwrap();
let url = "https://www.greaterthancode.com/feed/podcast";
let mut core = Core::new().unwrap();
c.bench_function("index_large_feed", move |b| {
b.iter(|| {
let s = Source::from_url(url).unwrap();
// parse it into a channel
let chan = rss::Channel::read_from(BufReader::new(CODE)).unwrap();
let feed = FeedBuilder::default()
.channel(chan)
.source_id(s.id())
.build()
.unwrap();
core.run(feed.index()).unwrap();
})
});
truncate_db().unwrap();
}
fn bench_index_small_feed(c: &mut Criterion) {
truncate_db().unwrap();
let url = "https://rss.art19.com/steal-the-stars";
let mut core = Core::new().unwrap();
c.bench_function("index_small_feed", move |b| {
b.iter(|| {
let s = Source::from_url(url).unwrap();
// parse it into a channel
let chan = rss::Channel::read_from(BufReader::new(STARS)).unwrap();
let feed = FeedBuilder::default()
.channel(chan)
.source_id(s.id())
.build()
.unwrap();
core.run(feed.index()).unwrap();
})
});
truncate_db().unwrap();
}
criterion_group!(benches, bench_index_large_feed, bench_index_small_feed);
criterion_main!(benches);

View File

@ -1,22 +1,3 @@
// database.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
//! Database Setup. This is only public to help with some unit tests.
// Diesel embed_migrations! triggers the lint
#![allow(unused_imports)]
@ -28,10 +9,10 @@ use diesel::r2d2::ConnectionManager;
use std::io;
use std::path::PathBuf;
use crate::errors::DataError;
use errors::DataError;
#[cfg(not(test))]
use crate::xdg_dirs;
use xdg_dirs;
type Pool = r2d2::Pool<ConnectionManager<SqliteConnection>>;
@ -48,10 +29,12 @@ lazy_static! {
.unwrap();
}
#[cfg(test)]
extern crate tempdir;
#[cfg(test)]
lazy_static! {
pub(crate) static ref TEMPDIR: tempdir::TempDir =
{ tempdir::TempDir::new("podcasts_unit_test").unwrap() };
static ref TEMPDIR: tempdir::TempDir = { tempdir::TempDir::new("podcasts_unit_test").unwrap() };
static ref DB_PATH: PathBuf = TEMPDIR.path().join("podcasts.db");
}
@ -83,7 +66,7 @@ fn run_migration_on(connection: &SqliteConnection) -> Result<(), DataError> {
/// Reset the database into a clean state.
// Test share a Temp file db.
#[cfg(test)]
#[allow(dead_code)]
pub fn truncate_db() -> Result<(), DataError> {
let db = connection();
let con = db.get()?;

View File

@ -1,22 +1,3 @@
// dbqueries.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
//! Random CRUD helper functions.
use chrono::prelude::*;
@ -24,14 +5,15 @@ use diesel::prelude::*;
use diesel;
use diesel::dsl::exists;
use diesel::query_builder::AsQuery;
use diesel::select;
use crate::database::connection;
use crate::errors::DataError;
use crate::models::*;
use database::connection;
use errors::DataError;
use models::*;
pub fn get_sources() -> Result<Vec<Source>, DataError> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
@ -42,7 +24,7 @@ pub fn get_sources() -> Result<Vec<Source>, DataError> {
}
pub fn get_podcasts() -> Result<Vec<Show>, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -53,7 +35,7 @@ pub fn get_podcasts() -> Result<Vec<Show>, DataError> {
}
pub fn get_podcasts_filter(filter_ids: &[i32]) -> Result<Vec<Show>, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -65,7 +47,7 @@ pub fn get_podcasts_filter(filter_ids: &[i32]) -> Result<Vec<Show>, DataError> {
}
pub fn get_episodes() -> Result<Vec<Episode>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -76,7 +58,7 @@ pub fn get_episodes() -> Result<Vec<Episode>, DataError> {
}
pub(crate) fn get_downloaded_episodes() -> Result<Vec<EpisodeCleanerModel>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -99,7 +81,7 @@ pub(crate) fn get_downloaded_episodes() -> Result<Vec<EpisodeCleanerModel>, Data
// }
pub(crate) fn get_played_cleaner_episodes() -> Result<Vec<EpisodeCleanerModel>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -111,7 +93,7 @@ pub(crate) fn get_played_cleaner_episodes() -> Result<Vec<EpisodeCleanerModel>,
}
pub fn get_episode_from_rowid(ep_id: i32) -> Result<Episode, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -122,7 +104,7 @@ pub fn get_episode_from_rowid(ep_id: i32) -> Result<Episode, DataError> {
}
pub fn get_episode_widget_from_rowid(ep_id: i32) -> Result<EpisodeWidgetModel, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -136,7 +118,7 @@ pub fn get_episode_widget_from_rowid(ep_id: i32) -> Result<EpisodeWidgetModel, D
}
pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result<Option<String>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -151,7 +133,7 @@ pub fn get_episodes_widgets_filter_limit(
filter_ids: &[i32],
limit: u32,
) -> Result<Vec<EpisodeWidgetModel>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
let columns = (
@ -168,7 +150,7 @@ pub fn get_episodes_widgets_filter_limit(
}
pub fn get_podcast_from_id(pid: i32) -> Result<Show, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -179,7 +161,7 @@ pub fn get_podcast_from_id(pid: i32) -> Result<Show, DataError> {
}
pub fn get_podcast_cover_from_id(pid: i32) -> Result<ShowCoverModel, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -191,7 +173,7 @@ pub fn get_podcast_cover_from_id(pid: i32) -> Result<ShowCoverModel, DataError>
}
pub fn get_pd_episodes(parent: &Show) -> Result<Vec<Episode>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -212,7 +194,7 @@ pub fn get_pd_episodes_count(parent: &Show) -> Result<i64, DataError> {
}
pub fn get_pd_episodeswidgets(parent: &Show) -> Result<Vec<EpisodeWidgetModel>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
let columns = (
@ -228,7 +210,7 @@ pub fn get_pd_episodeswidgets(parent: &Show) -> Result<Vec<EpisodeWidgetModel>,
}
pub fn get_pd_unplayed_episodes(parent: &Show) -> Result<Vec<Episode>, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -253,7 +235,7 @@ pub fn get_pd_unplayed_episodes(parent: &Show) -> Result<Vec<Episode>, DataError
// }
pub fn get_source_from_uri(uri_: &str) -> Result<Source, DataError> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
@ -264,7 +246,7 @@ pub fn get_source_from_uri(uri_: &str) -> Result<Source, DataError> {
}
pub fn get_source_from_id(id_: i32) -> Result<Source, DataError> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
@ -275,7 +257,7 @@ pub fn get_source_from_id(id_: i32) -> Result<Source, DataError> {
}
pub fn get_podcast_from_source_id(sid: i32) -> Result<Show, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -286,7 +268,7 @@ pub fn get_podcast_from_source_id(sid: i32) -> Result<Show, DataError> {
}
pub fn get_episode_from_pk(title_: &str, pid: i32) -> Result<Episode, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -301,7 +283,7 @@ pub(crate) fn get_episode_minimal_from_pk(
title_: &str,
pid: i32,
) -> Result<EpisodeMinimal, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -313,23 +295,6 @@ pub(crate) fn get_episode_minimal_from_pk(
.map_err(From::from)
}
#[cfg(test)]
pub(crate) fn get_episode_cleaner_from_pk(
title_: &str,
pid: i32,
) -> Result<EpisodeCleanerModel, DataError> {
use crate::schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
episodes
.select((rowid, local_uri, played))
.filter(title.eq(title_))
.filter(show_id.eq(pid))
.get_result::<EpisodeCleanerModel>(&con)
.map_err(From::from)
}
pub(crate) fn remove_feed(pd: &Show) -> Result<(), DataError> {
let db = connection();
let con = db.get()?;
@ -344,25 +309,25 @@ pub(crate) fn remove_feed(pd: &Show) -> Result<(), DataError> {
}
fn delete_source(con: &SqliteConnection, source_id: i32) -> QueryResult<usize> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
diesel::delete(source.filter(id.eq(source_id))).execute(con)
}
fn delete_podcast(con: &SqliteConnection, show_id: i32) -> QueryResult<usize> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
diesel::delete(shows.filter(id.eq(show_id))).execute(con)
}
fn delete_podcast_episodes(con: &SqliteConnection, parent_id: i32) -> QueryResult<usize> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
diesel::delete(episodes.filter(show_id.eq(parent_id))).execute(con)
}
pub fn source_exists(url: &str) -> Result<bool, DataError> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
@ -373,7 +338,7 @@ pub fn source_exists(url: &str) -> Result<bool, DataError> {
}
pub(crate) fn podcast_exists(source_id_: i32) -> Result<bool, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -385,7 +350,7 @@ pub(crate) fn podcast_exists(source_id_: i32) -> Result<bool, DataError> {
#[cfg_attr(rustfmt, rustfmt_skip)]
pub(crate) fn episode_exists(title_: &str, show_id_: i32) -> Result<bool, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -398,22 +363,22 @@ pub(crate) fn episode_exists(title_: &str, show_id_: i32) -> Result<bool, DataEr
/// Check if the `episodes table contains any rows
///
/// Return true if `episodes` table is populated.
pub fn is_episodes_populated(filter_show_ids: &[i32]) -> Result<bool, DataError> {
use crate::schema::episodes::dsl::*;
pub fn is_episodes_populated() -> Result<bool, DataError> {
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
select(exists(episodes.filter(show_id.ne_all(filter_show_ids))))
select(exists(episodes.as_query()))
.get_result(&con)
.map_err(From::from)
}
/// Check if the `shows` table contains any rows
///
/// Return true if `shows` table is populated.
/// Return true if `shows table is populated.
pub fn is_podcasts_populated(filter_ids: &[i32]) -> Result<bool, DataError> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -423,22 +388,8 @@ pub fn is_podcasts_populated(filter_ids: &[i32]) -> Result<bool, DataError> {
.map_err(From::from)
}
/// Check if the `source` table contains any rows
///
/// Return true if `source` table is populated.
pub fn is_source_populated(filter_ids: &[i32]) -> Result<bool, DataError> {
use crate::schema::source::dsl::*;
let db = connection();
let con = db.get()?;
select(exists(source.filter(id.ne_all(filter_ids))))
.get_result(&con)
.map_err(From::from)
}
pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<(), DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -450,7 +401,7 @@ pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<(), DataError> {
}
pub fn update_none_to_played_now(parent: &Show) -> Result<usize, DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -466,27 +417,25 @@ pub fn update_none_to_played_now(parent: &Show) -> Result<usize, DataError> {
#[cfg(test)]
mod tests {
use super::*;
use crate::database::*;
use crate::pipeline;
use failure::Error;
use database::*;
use pipeline;
#[test]
fn test_update_none_to_played_now() -> Result<(), Error> {
truncate_db()?;
fn test_update_none_to_played_now() {
truncate_db().unwrap();
let url = "https://web.archive.org/web/20180120083840if_/https://feeds.feedburner.\
com/InterceptedWithJeremyScahill";
let source = Source::from_url(url)?;
let source = Source::from_url(url).unwrap();
let id = source.id();
pipeline::run(vec![source])?;
let pd = get_podcast_from_source_id(id)?;
pipeline::run(vec![source], true).unwrap();
let pd = get_podcast_from_source_id(id).unwrap();
let eps_num = get_pd_unplayed_episodes(&pd)?.len();
let eps_num = get_pd_unplayed_episodes(&pd).unwrap().len();
assert_ne!(eps_num, 0);
update_none_to_played_now(&pd)?;
let eps_num2 = get_pd_unplayed_episodes(&pd)?.len();
update_none_to_played_now(&pd).unwrap();
let eps_num2 = get_pd_unplayed_episodes(&pd).unwrap().len();
assert_eq!(eps_num2, 0);
Ok(())
}
}

View File

@ -1,26 +1,6 @@
// errors.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use diesel;
use diesel::r2d2;
use diesel_migrations::RunMigrationsError;
use http;
use hyper;
use native_tls;
use rss;
@ -29,11 +9,13 @@ use xml;
use std::io;
use crate::models::Source;
use models::Source;
#[fail(
display = "Request to {} returned {}. Context: {}",
url, status_code, context
url,
status_code,
context
)]
#[derive(Fail, Debug)]
pub struct HttpStatusError {
@ -64,9 +46,8 @@ pub enum DataError {
R2D2PoolError(#[cause] r2d2::PoolError),
#[fail(display = "Hyper Error: {}", _0)]
HyperError(#[cause] hyper::Error),
#[fail(display = "ToStr Error: {}", _0)]
HttpToStr(#[cause] http::header::ToStrError),
#[fail(display = "Failed to parse a url: {}", _0)]
// TODO: print the url too
UrlError(#[cause] url::ParseError),
#[fail(display = "TLS Error: {}", _0)]
TLSError(#[cause] native_tls::Error),
@ -80,12 +61,10 @@ pub enum DataError {
Bail(String),
#[fail(display = "{}", _0)]
HttpStatusGeneral(HttpStatusError),
#[fail(display = "Source redirects to a new url")]
FeedRedirect(Source),
#[fail(display = "Feed is up to date")]
FeedNotModified(Source),
#[fail(display = "FIXME: This should be better")]
F301(Source),
#[fail(
display = "Error occurred while Parsing an Episode. Reason: {}",
display = "Error occured while Parsing an Episode. Reason: {}",
reason
)]
ParseEpisodeError { reason: String, parent_id: i32 },
@ -93,33 +72,68 @@ pub enum DataError {
EpisodeNotChanged,
}
// Maps a type to a variant of the DataError enum
macro_rules! easy_from_impl {
($outer_type:ty, $from:ty => $to:expr) => (
impl From<$from> for $outer_type {
fn from(err: $from) -> Self {
$to(err)
}
}
);
($outer_type:ty, $from:ty => $to:expr, $($f:ty => $t:expr),+) => (
easy_from_impl!($outer_type, $from => $to);
easy_from_impl!($outer_type, $($f => $t),+);
);
impl From<RunMigrationsError> for DataError {
fn from(err: RunMigrationsError) -> Self {
DataError::DieselMigrationError(err)
}
}
easy_from_impl!(
DataError,
RunMigrationsError => DataError::DieselMigrationError,
diesel::result::Error => DataError::DieselResultError,
r2d2::Error => DataError::R2D2Error,
r2d2::PoolError => DataError::R2D2PoolError,
hyper::Error => DataError::HyperError,
http::header::ToStrError => DataError::HttpToStr,
url::ParseError => DataError::UrlError,
native_tls::Error => DataError::TLSError,
io::Error => DataError::IOError,
rss::Error => DataError::RssError,
xml::reader::Error => DataError::XmlReaderError,
String => DataError::Bail
);
impl From<diesel::result::Error> for DataError {
fn from(err: diesel::result::Error) -> Self {
DataError::DieselResultError(err)
}
}
impl From<r2d2::Error> for DataError {
fn from(err: r2d2::Error) -> Self {
DataError::R2D2Error(err)
}
}
impl From<r2d2::PoolError> for DataError {
fn from(err: r2d2::PoolError) -> Self {
DataError::R2D2PoolError(err)
}
}
impl From<hyper::Error> for DataError {
fn from(err: hyper::Error) -> Self {
DataError::HyperError(err)
}
}
impl From<url::ParseError> for DataError {
fn from(err: url::ParseError) -> Self {
DataError::UrlError(err)
}
}
impl From<native_tls::Error> for DataError {
fn from(err: native_tls::Error) -> Self {
DataError::TLSError(err)
}
}
impl From<io::Error> for DataError {
fn from(err: io::Error) -> Self {
DataError::IOError(err)
}
}
impl From<rss::Error> for DataError {
fn from(err: rss::Error) -> Self {
DataError::RssError(err)
}
}
impl From<xml::reader::Error> for DataError {
fn from(err: xml::reader::Error) -> Self {
DataError::XmlReaderError(err)
}
}
impl From<String> for DataError {
fn from(err: String) -> Self {
DataError::Bail(err)
}
}

View File

@ -1,24 +1,4 @@
// feed.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#![allow(clippy::unit_arg)]
#![cfg_attr(feature = "cargo-clippy", allow(unit_arg))]
//! Index Feeds.
use futures::future::*;
@ -26,10 +6,10 @@ use futures::prelude::*;
use futures::stream;
use rss;
use crate::dbqueries;
use crate::errors::DataError;
use crate::models::{Index, IndexState, Update};
use crate::models::{NewEpisode, NewEpisodeMinimal, NewShow, Show};
use dbqueries;
use errors::DataError;
use models::{Index, IndexState, Update};
use models::{NewEpisode, NewEpisodeMinimal, NewShow, Show};
/// Wrapper struct that hold a `Source` id and the `rss::Channel`
/// that corresponds to the `Source.uri` field.
@ -46,7 +26,7 @@ pub struct Feed {
impl Feed {
/// Index the contents of the RSS `Feed` into the database.
pub fn index(self) -> impl Future<Item = (), Error = DataError> + Send {
ok(self.parse_podcast())
self.parse_podcast_async()
.and_then(|pd| pd.to_podcast())
.and_then(move |pd| self.index_channel_items(pd))
}
@ -55,13 +35,16 @@ impl Feed {
NewShow::new(&self.channel, self.source_id)
}
fn parse_podcast_async(&self) -> impl Future<Item = NewShow, Error = DataError> + Send {
ok(self.parse_podcast())
}
fn index_channel_items(self, pd: Show) -> impl Future<Item = (), Error = DataError> + Send {
let stream = stream::iter_ok::<_, DataError>(self.channel.into_items());
// Parse the episodes
let episodes = stream.filter_map(move |item| {
NewEpisodeMinimal::new(&item, pd.id())
.and_then(move |ep| determine_ep_state(ep, &item))
glue(&item, pd.id())
.map_err(|err| error!("Failed to parse an episode: {}", err))
.ok()
});
@ -73,6 +56,10 @@ impl Feed {
}
}
fn glue(item: &rss::Item, id: i32) -> Result<IndexState<NewEpisode>, DataError> {
NewEpisodeMinimal::new(item, id).and_then(move |ep| determine_ep_state(ep, item))
}
fn determine_ep_state(
ep: NewEpisodeMinimal,
item: &rss::Item,
@ -100,22 +87,21 @@ fn filter_episodes<'a, S>(
where
S: Stream<Item = IndexState<NewEpisode>, Error = DataError> + Send + 'a,
{
stream
.filter_map(|state| match state {
IndexState::NotChanged => None,
// Update individual rows, and filter them
IndexState::Update((ref ep, rowid)) => {
ep.update(rowid)
.map_err(|err| error!("{}", err))
.map_err(|_| error!("Failed to index episode: {:?}.", ep.title()))
.ok();
stream.filter_map(|state| match state {
IndexState::NotChanged => None,
// Update individual rows, and filter them
IndexState::Update((ref ep, rowid)) => {
ep.update(rowid)
.map_err(|err| error!("{}", err))
.map_err(|_| error!("Failed to index episode: {:?}.", ep.title()))
.ok();
None
}
IndexState::Index(s) => Some(s),
})
// only Index is left, collect them for batch index
.collect()
None
},
IndexState::Index(s) => Some(s),
})
// only Index is left, collect them for batch index
.collect()
}
fn batch_insert_episodes(episodes: &[NewEpisode]) {
@ -141,14 +127,13 @@ fn batch_insert_episodes(episodes: &[NewEpisode]) {
#[cfg(test)]
mod tests {
use failure::Error;
use rss::Channel;
use tokio::{self, prelude::*};
use tokio_core::reactor::Core;
use crate::database::truncate_db;
use crate::dbqueries;
use crate::utils::get_feed;
use crate::Source;
use database::truncate_db;
use dbqueries;
use utils::get_feed;
use Source;
use std::fs;
use std::io::BufReader;
@ -186,8 +171,8 @@ mod tests {
};
#[test]
fn test_complete_index() -> Result<(), Error> {
truncate_db()?;
fn test_complete_index() {
truncate_db().unwrap();
let feeds: Vec<_> = URLS
.iter()
@ -198,43 +183,41 @@ mod tests {
})
.collect();
let mut core = Core::new().unwrap();
// Index the channels
let stream_ = stream::iter_ok(feeds).for_each(|x| x.index());
tokio::run(stream_.map_err(|_| ()));
let list: Vec<_> = feeds.into_iter().map(|x| x.index()).collect();
let _foo = core.run(join_all(list));
// Assert the index rows equal the controlled results
assert_eq!(dbqueries::get_sources()?.len(), 5);
assert_eq!(dbqueries::get_podcasts()?.len(), 5);
assert_eq!(dbqueries::get_episodes()?.len(), 354);
Ok(())
assert_eq!(dbqueries::get_sources().unwrap().len(), 5);
assert_eq!(dbqueries::get_podcasts().unwrap().len(), 5);
assert_eq!(dbqueries::get_episodes().unwrap().len(), 354);
}
#[test]
fn test_feed_parse_podcast() -> Result<(), Error> {
truncate_db()?;
fn test_feed_parse_podcast() {
truncate_db().unwrap();
let path = "tests/feeds/2018-01-20-Intercepted.xml";
let feed = get_feed(path, 42);
let file = fs::File::open(path)?;
let channel = Channel::read_from(BufReader::new(file))?;
let file = fs::File::open(path).unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(feed.parse_podcast(), pd);
Ok(())
}
#[test]
fn test_feed_index_channel_items() -> Result<(), Error> {
truncate_db()?;
fn test_feed_index_channel_items() {
truncate_db().unwrap();
let path = "tests/feeds/2018-01-20-Intercepted.xml";
let feed = get_feed(path, 42);
let pd = feed.parse_podcast().to_podcast()?;
let pd = feed.parse_podcast().to_podcast().unwrap();
feed.index_channel_items(pd).wait()?;
assert_eq!(dbqueries::get_podcasts()?.len(), 1);
assert_eq!(dbqueries::get_episodes()?.len(), 43);
Ok(())
feed.index_channel_items(pd).wait().unwrap();
assert_eq!(dbqueries::get_podcasts().unwrap().len(), 1);
assert_eq!(dbqueries::get_episodes().unwrap().len(), 43);
}
}

View File

@ -1,28 +1,10 @@
// lib.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#![recursion_limit = "1024"]
#![allow(unknown_lints)]
#![cfg_attr(
all(test, feature = "clippy"),
allow(option_unwrap_used, result_unwrap_used)
)]
#![cfg_attr(feature = "cargo-clippy", allow(option_map_unit_fn))]
#![cfg_attr(
feature = "clippy",
warn(
@ -41,8 +23,13 @@
)
)]
// Enable lint group collections
#![warn(nonstandard_style, bad_style, unused)]
#![warn(edition_2018, rust_2018_idioms)]
#![warn(
nonstandard_style,
edition_2018,
rust_2018_idioms,
bad_style,
unused
)]
// standalone lints
#![warn(
const_err,
@ -51,6 +38,8 @@
no_mangle_generic_items,
overflowing_literals,
plugin_as_library,
private_no_mangle_fns,
private_no_mangle_statics,
unconditional_recursion,
unions_with_drop_fields,
while_true,
@ -61,7 +50,9 @@
elided_lifetime_in_paths,
missing_copy_implementations
)]
#![allow(proc_macro_derive_resolution_fallback)]
#![deny(warnings)]
// warn when code is not using dyn Trait syntax. req rustc 1.27
// #![deny(bare_trait_object)]
//! FIXME: Docs
@ -80,7 +71,7 @@ extern crate diesel;
#[macro_use]
extern crate diesel_migrations;
// #[macro_use]
// extern crate failure;
extern crate failure;
#[macro_use]
extern crate failure_derive;
#[macro_use]
@ -88,6 +79,22 @@ extern crate lazy_static;
#[macro_use]
extern crate log;
extern crate ammonia;
extern crate chrono;
extern crate futures;
extern crate hyper;
extern crate hyper_tls;
extern crate native_tls;
extern crate num_cpus;
extern crate rayon;
extern crate rayon_futures;
extern crate rfc822_sanitizer;
extern crate rss;
extern crate tokio_core;
extern crate url;
extern crate xdg;
extern crate xml;
pub mod database;
#[allow(missing_docs)]
pub mod dbqueries;
@ -101,23 +108,23 @@ pub mod pipeline;
mod schema;
pub mod utils;
pub use crate::feed::{Feed, FeedBuilder};
pub use crate::models::Save;
pub use crate::models::{Episode, EpisodeWidgetModel, Show, ShowCoverModel, Source};
pub use feed::{Feed, FeedBuilder};
pub use models::Save;
pub use models::{Episode, EpisodeWidgetModel, Show, ShowCoverModel, Source};
// Set the user agent, See #53 for more
// Keep this in sync with Tor-browser releases
/// The user-agent to be used for all the requests.
/// It originates from the Tor-browser UA.
pub const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0";
pub const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0";
/// [XDG Base Directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths.
/// [XDG Base Direcotory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths.
#[allow(missing_debug_implementations)]
pub mod xdg_dirs {
use std::path::PathBuf;
use xdg;
lazy_static! {
lazy_static!{
pub(crate) static ref PODCASTS_XDG: xdg::BaseDirectories = {
xdg::BaseDirectories::with_prefix("gnome-podcasts").unwrap()
};
@ -137,7 +144,7 @@ pub mod xdg_dirs {
PODCASTS_XDG.create_cache_directory(PODCASTS_XDG.get_cache_home()).unwrap()
};
/// GNOME Podcasts Download Directory `PathBuf`.
/// GNOME Podcasts Download Direcotry `PathBuf`.
pub static ref DL_DIR: PathBuf = {
PODCASTS_XDG.create_data_directory("Downloads").unwrap()
};

View File

@ -1,19 +0,0 @@
data_sources = files(
'models/episode.rs',
'models/mod.rs',
'models/new_episode.rs',
'models/new_show.rs',
'models/new_source.rs',
'models/show.rs',
'models/source.rs',
'database.rs',
'dbqueries.rs',
'errors.rs',
'feed.rs',
'lib.rs',
'opml.rs',
'parser.rs',
'pipeline.rs',
'schema.rs',
'utils.rs',
)

View File

@ -1,31 +1,12 @@
// episode.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use chrono::prelude::*;
use diesel;
use diesel::prelude::*;
use diesel::SaveChangesDsl;
use crate::database::connection;
use crate::errors::DataError;
use crate::models::{Save, Show};
use crate::schema::episodes;
use database::connection;
use errors::DataError;
use models::{Save, Show};
use schema::episodes;
#[derive(Queryable, Identifiable, AsChangeset, Associations, PartialEq)]
#[table_name = "episodes"]
@ -72,6 +53,11 @@ impl Episode {
&self.title
}
/// Set the `title`.
pub fn set_title(&mut self, value: &str) {
self.title = value.to_string();
}
/// Get the value of the `uri`.
///
/// Represents the url(usually) that the media file will be located at.
@ -79,6 +65,11 @@ impl Episode {
self.uri.as_ref().map(|s| s.as_str())
}
/// Set the `uri`.
pub fn set_uri(&mut self, value: Option<&str>) {
self.uri = value.map(|x| x.to_string());
}
/// Get the value of the `local_uri`.
///
/// Represents the local uri,usually filesystem path,
@ -87,16 +78,31 @@ impl Episode {
self.local_uri.as_ref().map(|s| s.as_str())
}
/// Set the `local_uri`.
pub fn set_local_uri(&mut self, value: Option<&str>) {
self.local_uri = value.map(|x| x.to_string());
}
/// Get the `description`.
pub fn description(&self) -> Option<&str> {
self.description.as_ref().map(|s| s.as_str())
}
/// Set the `description`.
pub fn set_description(&mut self, value: Option<&str>) {
self.description = value.map(|x| x.to_string());
}
/// Get the Episode's `guid`.
pub fn guid(&self) -> Option<&str> {
self.guid.as_ref().map(|s| s.as_str())
}
/// Set the `guid`.
pub fn set_guid(&mut self, value: Option<&str>) {
self.guid = value.map(|x| x.to_string());
}
/// Get the `epoch` value.
///
/// Retrieved from the rss Item publish date.
@ -105,6 +111,11 @@ impl Episode {
self.epoch
}
/// Set the `epoch`.
pub fn set_epoch(&mut self, value: i32) {
self.epoch = value;
}
/// Get the `length`.
///
/// The number represents the size of the file in bytes.
@ -112,6 +123,11 @@ impl Episode {
self.length
}
/// Set the `length`.
pub fn set_length(&mut self, value: Option<i32>) {
self.length = value;
}
/// Get the `duration` value.
///
/// The number represents the duration of the item/episode in seconds.
@ -119,6 +135,11 @@ impl Episode {
self.duration
}
/// Set the `duration`.
pub fn set_duration(&mut self, value: Option<i32>) {
self.duration = value;
}
/// Epoch representation of the last time the episode was played.
///
/// None/Null for unplayed.
@ -126,10 +147,22 @@ impl Episode {
self.played
}
/// Set the `played` value.
pub fn set_played(&mut self, value: Option<i32>) {
self.played = value;
}
/// `Show` table foreign key.
pub fn show_id(&self) -> i32 {
self.show_id
}
/// Sets the `played` value with the current `epoch` timestap and save it.
pub fn set_played_now(&mut self) -> Result<(), DataError> {
let epoch = Utc::now().timestamp() as i32;
self.set_played(Some(epoch));
self.save().map(|_| ())
}
}
#[derive(Queryable, AsChangeset, PartialEq)]
@ -172,7 +205,7 @@ impl Save<usize> for EpisodeWidgetModel {
/// Helper method to easily save/"sync" current state of self to the
/// Database.
fn save(&self) -> Result<usize, Self::Error> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let tempdb = db.get()?;
@ -242,6 +275,11 @@ impl EpisodeWidgetModel {
self.duration
}
/// Set the `duration`.
pub fn set_duration(&mut self, value: Option<i32>) {
self.duration = value;
}
/// Epoch representation of the last time the episode was played.
///
/// None/Null for unplayed.
@ -250,7 +288,7 @@ impl EpisodeWidgetModel {
}
/// Set the `played` value.
fn set_played(&mut self, value: Option<i32>) {
pub fn set_played(&mut self, value: Option<i32>) {
self.played = value;
}
@ -285,7 +323,7 @@ impl Save<usize> for EpisodeCleanerModel {
/// Helper method to easily save/"sync" current state of self to the
/// Database.
fn save(&self) -> Result<usize, Self::Error> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let tempdb = db.get()?;
@ -409,6 +447,11 @@ impl EpisodeMinimal {
self.length
}
/// Set the `length`.
pub fn set_length(&mut self, value: Option<i32>) {
self.length = value;
}
/// Get the `duration` value.
///
/// The number represents the duration of the item/episode in seconds.

View File

@ -1,22 +1,3 @@
// mod.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
mod new_episode;
mod new_show;
mod new_source;
@ -58,7 +39,7 @@ pub trait Insert<T> {
pub trait Update<T> {
type Error;
fn update(&self, _: i32) -> Result<T, Self::Error>;
fn update(&self, i32) -> Result<T, Self::Error>;
}
// This might need to change in the future

View File

@ -1,35 +1,16 @@
// new_episode.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use ammonia;
use diesel;
use diesel::prelude::*;
use rfc822_sanitizer::parse_from_rfc2822_with_fallback as parse_rfc822;
use rss;
use crate::database::connection;
use crate::dbqueries;
use crate::errors::DataError;
use crate::models::{Episode, EpisodeMinimal, Index, Insert, Update};
use crate::parser;
use crate::schema::episodes;
use crate::utils::url_cleaner;
use database::connection;
use dbqueries;
use errors::DataError;
use models::{Episode, EpisodeMinimal, Index, Insert, Update};
use parser;
use schema::episodes;
use utils::url_cleaner;
#[derive(Insertable, AsChangeset)]
#[table_name = "episodes"]
@ -66,7 +47,7 @@ impl Insert<()> for NewEpisode {
type Error = DataError;
fn insert(&self) -> Result<(), DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -83,7 +64,7 @@ impl Update<()> for NewEpisode {
type Error = DataError;
fn update(&self, episode_id: i32) -> Result<(), DataError> {
use crate::schema::episodes::dsl::*;
use schema::episodes::dsl::*;
let db = connection();
let con = db.get()?;
@ -236,8 +217,7 @@ impl NewEpisodeMinimal {
let enc = item.enclosure();
// Get the url
let uri = enc
.map(|s| url_cleaner(s.url().trim()))
let uri = enc.map(|s| url_cleaner(s.url().trim()))
// Fallback to Rss.Item.link if enclosure is None.
.or_else(|| item.link().map(|s| url_cleaner(s.trim())));
@ -255,7 +235,7 @@ impl NewEpisodeMinimal {
return Err(err);
};
// Default to rfc2822 representation of epoch 0.
// Default to rfc2822 represantation of epoch 0.
let date = parse_rfc822(item.pub_date().unwrap_or("Thu, 1 Jan 1970 00:00:00 +0000"));
// Should treat information from the rss feeds as invalid by default.
// Case: "Thu, 05 Aug 2016 06:00:00 -0400" <-- Actually that was friday.
@ -330,11 +310,10 @@ impl NewEpisodeMinimal {
#[cfg(test)]
mod tests {
use crate::database::truncate_db;
use crate::dbqueries;
use crate::models::new_episode::{NewEpisodeMinimal, NewEpisodeMinimalBuilder};
use crate::models::*;
use failure::Error;
use database::truncate_db;
use dbqueries;
use models::new_episode::{NewEpisodeMinimal, NewEpisodeMinimalBuilder};
use models::*;
use rss::Channel;
@ -342,7 +321,7 @@ mod tests {
use std::io::BufReader;
// TODO: Add tests for other feeds too.
// Especially if you find an *interesting* generated feed.
// Especially if you find an *intresting* generated feed.
// Known prebuilt expected objects.
lazy_static! {
@ -507,72 +486,68 @@ mod tests {
}
#[test]
fn test_new_episode_minimal_intercepted() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_episode_minimal_intercepted() {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let episode = channel.items().iter().nth(14).unwrap();
let ep = NewEpisodeMinimal::new(&episode, 42)?;
let ep = NewEpisodeMinimal::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_MINIMAL_INTERCEPTED_1);
let episode = channel.items().iter().nth(15).unwrap();
let ep = NewEpisodeMinimal::new(&episode, 42)?;
let ep = NewEpisodeMinimal::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_MINIMAL_INTERCEPTED_2);
Ok(())
}
#[test]
fn test_new_episode_intercepted() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_episode_intercepted() {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let episode = channel.items().iter().nth(14).unwrap();
let ep = NewEpisode::new(&episode, 42)?;
let ep = NewEpisode::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_INTERCEPTED_1);
let episode = channel.items().iter().nth(15).unwrap();
let ep = NewEpisode::new(&episode, 42)?;
let ep = NewEpisode::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_INTERCEPTED_2);
Ok(())
}
#[test]
fn test_new_episode_minimal_lup() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_episode_minimal_lup() {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let episode = channel.items().iter().nth(18).unwrap();
let ep = NewEpisodeMinimal::new(&episode, 42)?;
let ep = NewEpisodeMinimal::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_MINIMAL_LUP_1);
let episode = channel.items().iter().nth(19).unwrap();
let ep = NewEpisodeMinimal::new(&episode, 42)?;
let ep = NewEpisodeMinimal::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_MINIMAL_LUP_2);
Ok(())
}
#[test]
fn test_new_episode_lup() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_episode_lup() {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let episode = channel.items().iter().nth(18).unwrap();
let ep = NewEpisode::new(&episode, 42)?;
let ep = NewEpisode::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_LUP_1);
let episode = channel.items().iter().nth(19).unwrap();
let ep = NewEpisode::new(&episode, 42)?;
let ep = NewEpisode::new(&episode, 42).unwrap();
assert_eq!(ep, *EXPECTED_LUP_2);
Ok(())
}
#[test]
fn test_minimal_into_new_episode() -> Result<(), Error> {
truncate_db()?;
fn test_minimal_into_new_episode() {
truncate_db().unwrap();
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let item = channel.items().iter().nth(14).unwrap();
let ep = EXPECTED_MINIMAL_INTERCEPTED_1
@ -589,44 +564,42 @@ mod tests {
.clone()
.into_new_episode(&item);
assert_eq!(ep, *EXPECTED_INTERCEPTED_2);
Ok(())
}
#[test]
fn test_new_episode_insert() -> Result<(), Error> {
truncate_db()?;
fn test_new_episode_insert() {
truncate_db().unwrap();
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let episode = channel.items().iter().nth(14).unwrap();
let new_ep = NewEpisode::new(&episode, 42)?;
new_ep.insert()?;
let ep = dbqueries::get_episode_from_pk(new_ep.title(), new_ep.show_id())?;
let new_ep = NewEpisode::new(&episode, 42).unwrap();
new_ep.insert().unwrap();
let ep = dbqueries::get_episode_from_pk(new_ep.title(), new_ep.show_id()).unwrap();
assert_eq!(new_ep, ep);
assert_eq!(&new_ep, &*EXPECTED_INTERCEPTED_1);
assert_eq!(&*EXPECTED_INTERCEPTED_1, &ep);
let episode = channel.items().iter().nth(15).unwrap();
let new_ep = NewEpisode::new(&episode, 42)?;
new_ep.insert()?;
let ep = dbqueries::get_episode_from_pk(new_ep.title(), new_ep.show_id())?;
let new_ep = NewEpisode::new(&episode, 42).unwrap();
new_ep.insert().unwrap();
let ep = dbqueries::get_episode_from_pk(new_ep.title(), new_ep.show_id()).unwrap();
assert_eq!(new_ep, ep);
assert_eq!(&new_ep, &*EXPECTED_INTERCEPTED_2);
assert_eq!(&*EXPECTED_INTERCEPTED_2, &ep);
Ok(())
}
#[test]
fn test_new_episode_update() -> Result<(), Error> {
truncate_db()?;
let old = EXPECTED_INTERCEPTED_1.clone().to_episode()?;
fn test_new_episode_update() {
truncate_db().unwrap();
let old = EXPECTED_INTERCEPTED_1.clone().to_episode().unwrap();
let updated = &*UPDATED_DURATION_INTERCEPTED_1;
updated.update(old.rowid())?;
let new = dbqueries::get_episode_from_pk(old.title(), old.show_id())?;
updated.update(old.rowid()).unwrap();
let new = dbqueries::get_episode_from_pk(old.title(), old.show_id()).unwrap();
// Assert that updating does not change the rowid and show_id
assert_ne!(old, new);
@ -635,12 +608,11 @@ mod tests {
assert_eq!(updated, &new);
assert_ne!(updated, &old);
Ok(())
}
#[test]
fn test_new_episode_index() -> Result<(), Error> {
truncate_db()?;
fn test_new_episode_index() {
truncate_db().unwrap();
let expected = &*EXPECTED_INTERCEPTED_1;
// First insert
@ -648,7 +620,7 @@ mod tests {
// Second identical, This should take the early return path
assert!(expected.index().is_ok());
// Get the episode
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id())?;
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id()).unwrap();
// Assert that NewPodcast is equal to the Indexed one
assert_eq!(*expected, old);
@ -657,33 +629,31 @@ mod tests {
// Update the podcast
assert!(updated.index().is_ok());
// Get the new Podcast
let new = dbqueries::get_episode_from_pk(expected.title(), expected.show_id())?;
let new = dbqueries::get_episode_from_pk(expected.title(), expected.show_id()).unwrap();
// Assert it's diff from the old one.
assert_ne!(new, old);
assert_eq!(*updated, new);
assert_eq!(new.rowid(), old.rowid());
assert_eq!(new.show_id(), old.show_id());
Ok(())
}
#[test]
fn test_new_episode_to_episode() -> Result<(), Error> {
fn test_new_episode_to_episode() {
let expected = &*EXPECTED_INTERCEPTED_1;
// Assert insert() produces the same result that you would get with to_podcast()
truncate_db()?;
expected.insert()?;
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id())?;
let ep = expected.to_episode()?;
truncate_db().unwrap();
expected.insert().unwrap();
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id()).unwrap();
let ep = expected.to_episode().unwrap();
assert_eq!(old, ep);
// Same as above, diff order
truncate_db()?;
let ep = expected.to_episode()?;
truncate_db().unwrap();
let ep = expected.to_episode().unwrap();
// This should error as a unique constrain violation
assert!(expected.insert().is_err());
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id())?;
let old = dbqueries::get_episode_from_pk(expected.title(), expected.show_id()).unwrap();
assert_eq!(old, ep);
Ok(())
}
}

View File

@ -1,35 +1,16 @@
// new_show.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use ammonia;
use diesel;
use diesel::prelude::*;
use rss;
use crate::errors::DataError;
use crate::models::Show;
use crate::models::{Index, Insert, Update};
use crate::schema::shows;
use errors::DataError;
use models::Show;
use models::{Index, Insert, Update};
use schema::shows;
use crate::database::connection;
use crate::dbqueries;
use crate::utils::url_cleaner;
use database::connection;
use dbqueries;
use utils::url_cleaner;
#[derive(Insertable, AsChangeset)]
#[table_name = "shows"]
@ -49,7 +30,7 @@ impl Insert<()> for NewShow {
type Error = DataError;
fn insert(&self) -> Result<(), Self::Error> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -65,7 +46,7 @@ impl Update<()> for NewShow {
type Error = DataError;
fn update(&self, show_id: i32) -> Result<(), Self::Error> {
use crate::schema::shows::dsl::*;
use schema::shows::dsl::*;
let db = connection();
let con = db.get()?;
@ -176,11 +157,10 @@ mod tests {
use super::*;
// use tokio_core::reactor::Core;
use failure::Error;
use rss::Channel;
use crate::database::truncate_db;
use crate::models::NewShowBuilder;
use database::truncate_db;
use models::NewShowBuilder;
use std::fs::File;
use std::io::BufReader;
@ -309,80 +289,73 @@ mod tests {
}
#[test]
fn test_new_podcast_intercepted() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_intercepted() {
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_INTERCEPTED, pd);
Ok(())
}
#[test]
fn test_new_podcast_lup() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_lup() {
let file = File::open("tests/feeds/2018-01-20-LinuxUnplugged.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_LUP, pd);
Ok(())
}
#[test]
fn test_new_podcast_thetipoff() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-TheTipOff.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_thetipoff() {
let file = File::open("tests/feeds/2018-01-20-TheTipOff.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_TIPOFF, pd);
Ok(())
}
#[test]
fn test_new_podcast_steal_the_stars() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-StealTheStars.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_steal_the_stars() {
let file = File::open("tests/feeds/2018-01-20-StealTheStars.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_STARS, pd);
Ok(())
}
#[test]
fn test_new_podcast_greater_than_code() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-01-20-GreaterThanCode.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_greater_than_code() {
let file = File::open("tests/feeds/2018-01-20-GreaterThanCode.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_CODE, pd);
Ok(())
}
#[test]
fn test_new_podcast_ellinofreneia() -> Result<(), Error> {
let file = File::open("tests/feeds/2018-03-28-Ellinofreneia.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_ellinofreneia() {
let file = File::open("tests/feeds/2018-03-28-Ellinofreneia.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let pd = NewShow::new(&channel, 42);
assert_eq!(*EXPECTED_ELLINOFRENEIA, pd);
Ok(())
}
#[test]
// This maybe could be a doc test on insert.
fn test_new_podcast_insert() -> Result<(), Error> {
truncate_db()?;
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml")?;
let channel = Channel::read_from(BufReader::new(file))?;
fn test_new_podcast_insert() {
truncate_db().unwrap();
let file = File::open("tests/feeds/2018-01-20-Intercepted.xml").unwrap();
let channel = Channel::read_from(BufReader::new(file)).unwrap();
let npd = NewShow::new(&channel, 42);
npd.insert()?;
let pd = dbqueries::get_podcast_from_source_id(42)?;
npd.insert().unwrap();
let pd = dbqueries::get_podcast_from_source_id(42).unwrap();
assert_eq!(npd, pd);
assert_eq!(*EXPECTED_INTERCEPTED, npd);
assert_eq!(&*EXPECTED_INTERCEPTED, &pd);
Ok(())
}
#[test]
@ -390,32 +363,31 @@ mod tests {
// Currently there's a test that only checks new description or title.
// If you have time and want to help, implement the test for the other fields
// too.
fn test_new_podcast_update() -> Result<(), Error> {
truncate_db()?;
let old = EXPECTED_INTERCEPTED.to_podcast()?;
fn test_new_podcast_update() {
truncate_db().unwrap();
let old = EXPECTED_INTERCEPTED.to_podcast().unwrap();
let updated = &*UPDATED_DESC_INTERCEPTED;
updated.update(old.id())?;
let new = dbqueries::get_podcast_from_source_id(42)?;
updated.update(old.id()).unwrap();
let new = dbqueries::get_podcast_from_source_id(42).unwrap();
assert_ne!(old, new);
assert_eq!(old.id(), new.id());
assert_eq!(old.source_id(), new.source_id());
assert_eq!(updated, &new);
assert_ne!(updated, &old);
Ok(())
}
#[test]
fn test_new_podcast_index() -> Result<(), Error> {
truncate_db()?;
fn test_new_podcast_index() {
truncate_db().unwrap();
// First insert
assert!(EXPECTED_INTERCEPTED.index().is_ok());
// Second identical, This should take the early return path
assert!(EXPECTED_INTERCEPTED.index().is_ok());
// Get the podcast
let old = dbqueries::get_podcast_from_source_id(42)?;
let old = dbqueries::get_podcast_from_source_id(42).unwrap();
// Assert that NewShow is equal to the Indexed one
assert_eq!(&*EXPECTED_INTERCEPTED, &old);
@ -424,30 +396,28 @@ mod tests {
// Update the podcast
assert!(updated.index().is_ok());
// Get the new Show
let new = dbqueries::get_podcast_from_source_id(42)?;
let new = dbqueries::get_podcast_from_source_id(42).unwrap();
// Assert it's diff from the old one.
assert_ne!(new, old);
assert_eq!(new.id(), old.id());
assert_eq!(new.source_id(), old.source_id());
Ok(())
}
#[test]
fn test_to_podcast() -> Result<(), Error> {
fn test_to_podcast() {
// Assert insert() produces the same result that you would get with to_podcast()
truncate_db()?;
EXPECTED_INTERCEPTED.insert()?;
let old = dbqueries::get_podcast_from_source_id(42)?;
let pd = EXPECTED_INTERCEPTED.to_podcast()?;
truncate_db().unwrap();
EXPECTED_INTERCEPTED.insert().unwrap();
let old = dbqueries::get_podcast_from_source_id(42).unwrap();
let pd = EXPECTED_INTERCEPTED.to_podcast().unwrap();
assert_eq!(old, pd);
// Same as above, diff order
truncate_db()?;
let pd = EXPECTED_INTERCEPTED.to_podcast()?;
truncate_db().unwrap();
let pd = EXPECTED_INTERCEPTED.to_podcast().unwrap();
// This should error as a unique constrain violation
assert!(EXPECTED_INTERCEPTED.insert().is_err());
let old = dbqueries::get_podcast_from_source_id(42)?;
let old = dbqueries::get_podcast_from_source_id(42).unwrap();
assert_eq!(old, pd);
Ok(())
}
}

View File

@ -1,32 +1,13 @@
// new_source.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use diesel;
use diesel::prelude::*;
use url::Url;
use crate::database::connection;
use crate::dbqueries;
use database::connection;
use dbqueries;
// use models::{Insert, Update};
use crate::errors::DataError;
use crate::models::Source;
use crate::schema::source;
use errors::DataError;
use models::Source;
use schema::source;
#[derive(Insertable)]
#[table_name = "source"]
@ -50,7 +31,7 @@ impl NewSource {
}
pub(crate) fn insert_or_ignore(&self) -> Result<(), DataError> {
use crate::schema::source::dsl::*;
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;

View File

@ -1,24 +1,9 @@
// show.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use diesel::SaveChangesDsl;
use crate::models::Source;
use crate::schema::shows;
use database::connection;
use errors::DataError;
use models::{Save, Source};
use schema::shows;
#[derive(Queryable, Identifiable, AsChangeset, Associations, PartialEq)]
#[belongs_to(Source, foreign_key = "source_id")]
@ -35,6 +20,19 @@ pub struct Show {
source_id: i32,
}
impl Save<Show> for Show {
type Error = DataError;
/// Helper method to easily save/"sync" current state of self to the
/// Database.
fn save(&self) -> Result<Show, Self::Error> {
let db = connection();
let tempdb = db.get()?;
self.save_changes::<Show>(&*tempdb).map_err(From::from)
}
}
impl Show {
/// Get the Feed `id`.
pub fn id(&self) -> i32 {
@ -53,11 +51,21 @@ impl Show {
&self.link
}
/// Set the Show/Feed `link`.
pub fn set_link(&mut self, value: &str) {
self.link = value.to_string();
}
/// Get the `description`.
pub fn description(&self) -> &str {
&self.description
}
/// Set the `description`.
pub fn set_description(&mut self, value: &str) {
self.description = value.to_string();
}
/// Get the `image_uri`.
///
/// Represents the uri(url usually) that the Feed cover image is located at.
@ -65,6 +73,11 @@ impl Show {
self.image_uri.as_ref().map(|s| s.as_str())
}
/// Set the `image_uri`.
pub fn set_image_uri(&mut self, value: Option<&str>) {
self.image_uri = value.map(|x| x.to_string());
}
/// `Source` table foreign key.
pub fn source_id(&self) -> i32 {
self.source_id

View File

@ -1,48 +1,25 @@
// source.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use diesel::SaveChangesDsl;
// use failure::ResultExt;
use rss::Channel;
use url::Url;
use hyper::client::HttpConnector;
use hyper::{Body, Client};
use hyper::header::{
ETag, EntityTag, HttpDate, IfModifiedSince, IfNoneMatch, LastModified, Location, UserAgent,
};
use hyper::{Client, Method, Request, Response, StatusCode, Uri};
use hyper_tls::HttpsConnector;
use http::header::{
HeaderValue, AUTHORIZATION, ETAG, IF_MODIFIED_SINCE, IF_NONE_MATCH, LAST_MODIFIED, LOCATION,
USER_AGENT as USER_AGENT_HEADER,
};
use http::{Request, Response, StatusCode, Uri};
// use futures::future::ok;
use futures::future::{loop_fn, Future, Loop};
use futures::prelude::*;
use base64::{encode_config, URL_SAFE};
use crate::database::connection;
use crate::errors::*;
use crate::feed::{Feed, FeedBuilder};
use crate::models::{NewSource, Save};
use crate::schema::source;
use crate::USER_AGENT;
use database::connection;
use errors::*;
use feed::{Feed, FeedBuilder};
use models::{NewSource, Save};
use schema::source;
use USER_AGENT;
use std::str::FromStr;
@ -67,7 +44,7 @@ impl Save<Source> for Source {
let db = connection();
let con = db.get()?;
self.save_changes::<Source>(&*con).map_err(From::from)
self.save_changes::<Source>(&con).map_err(From::from)
}
}
@ -114,34 +91,19 @@ impl Source {
/// Extract Etag and LastModifier from res, and update self and the
/// corresponding db row.
fn update_etag(mut self, res: &Response<Body>) -> Result<Self, DataError> {
fn update_etag(&mut self, res: &Response) -> Result<(), DataError> {
let headers = res.headers();
let etag = headers
.get(ETAG)
.and_then(|h| h.to_str().ok())
.map(From::from);
let lmod = headers
.get(LAST_MODIFIED)
.and_then(|h| h.to_str().ok())
.map(From::from);
let etag = headers.get::<ETag>().map(|x| x.tag());
let lmod = headers.get::<LastModified>().map(|x| format!("{}", x));
if (self.http_etag() != etag) || (self.last_modified != lmod) {
self.set_http_etag(etag);
self.set_last_modified(lmod);
self = self.save()?;
self.save()?;
}
Ok(self)
}
/// Clear the `HTTP` `Etag` and `Last-modified` headers.
/// This method does not sync the state of self in the database, call
/// .save() method explicitly
fn clear_etags(&mut self) {
debug!("Source etags before clear: {:#?}", &self);
self.http_etag = None;
self.last_modified = None;
Ok(())
}
fn make_err(self, context: &str, code: StatusCode) -> DataError {
@ -158,71 +120,41 @@ impl Source {
// 408: Timeout
// 410: Feed deleted
// TODO: Rething this api,
fn match_status(mut self, res: Response<Body>) -> Result<Response<Body>, DataError> {
fn match_status(mut self, res: Response) -> Result<Response, DataError> {
self.update_etag(&res)?;
let code = res.status();
if code.is_success() {
// If request is succesful save the etag
self = self.update_etag(&res)?
} else {
match code.as_u16() {
// Save etags if it returns NotModified
304 => self = self.update_etag(&res)?,
// Clear the Etag/lmod else
_ => {
self.clear_etags();
self = self.save()?;
}
};
};
match code.as_u16() {
304 => {
info!("304: Source, (id: {}), is up to date", self.id());
return Err(DataError::FeedNotModified(self));
match code {
StatusCode::NotModified => return Err(self.make_err("304: skipping..", code)),
StatusCode::MovedPermanently => {
error!("Feed was moved permanently.");
self.handle_301(&res)?;
return Err(DataError::F301(self));
}
301 | 302 | 308 => {
warn!("Feed was moved permanently.");
self = self.update_url(&res)?;
return Err(DataError::FeedRedirect(self));
}
307 => {
warn!("307: Temporary Redirect.");
// FIXME: How is it actually handling the redirect?
return Err(DataError::FeedRedirect(self));
}
401 => return Err(self.make_err("401: Unauthorized.", code)),
403 => return Err(self.make_err("403: Forbidden.", code)),
404 => return Err(self.make_err("404: Not found.", code)),
408 => return Err(self.make_err("408: Request Timeout.", code)),
410 => return Err(self.make_err("410: Feed was deleted..", code)),
StatusCode::TemporaryRedirect => debug!("307: Temporary Redirect."),
StatusCode::PermanentRedirect => warn!("308: Permanent Redirect."),
StatusCode::Unauthorized => return Err(self.make_err("401: Unauthorized.", code)),
StatusCode::Forbidden => return Err(self.make_err("403: Forbidden.", code)),
StatusCode::NotFound => return Err(self.make_err("404: Not found.", code)),
StatusCode::RequestTimeout => return Err(self.make_err("408: Request Timeout.", code)),
StatusCode::Gone => return Err(self.make_err("410: Feed was deleted..", code)),
_ => info!("HTTP StatusCode: {}", code),
};
Ok(res)
}
fn update_url(mut self, res: &Response<Body>) -> Result<Self, DataError> {
let code = res.status();
fn handle_301(&mut self, res: &Response) -> Result<(), DataError> {
let headers = res.headers();
info!("HTTP StatusCode: {}", code);
debug!("Headers {:#?}", headers);
if let Some(url) = headers.get(LOCATION) {
debug!("Previous Source: {:#?}", &self);
self.set_uri(url.to_str()?.into());
self.clear_etags();
self = self.save()?;
debug!("Updated Source: {:#?}", &self);
info!(
"Feed url of Source {}, was updated successfully.",
self.id()
);
if let Some(url) = headers.get::<Location>() {
self.set_uri(url.to_string());
self.http_etag = None;
self.last_modified = None;
self.save()?;
info!("Feed url was updated succesfully.");
}
Ok(self)
Ok(())
}
/// Construct a new `Source` with the given `uri` and index it.
@ -245,15 +177,16 @@ impl Source {
pub fn into_feed(
self,
client: Client<HttpsConnector<HttpConnector>>,
ignore_etags: bool,
) -> impl Future<Item = Feed, Error = DataError> {
let id = self.id();
let response = loop_fn(self, move |source| {
source
.request_constructor(&client.clone())
.request_constructor(&client.clone(), ignore_etags)
.then(|res| match res {
Ok(response) => Ok(Loop::Break(response)),
Err(err) => match err {
DataError::FeedRedirect(s) => {
DataError::F301(s) => {
info!("Following redirect...");
Ok(Loop::Continue(s))
}
@ -273,38 +206,31 @@ impl Source {
})
}
// TODO: make ignore_etags an Enum for better ergonomics.
// #bools_are_just_2variant_enmus
fn request_constructor(
self,
client: &Client<HttpsConnector<HttpConnector>>,
) -> impl Future<Item = Response<Body>, Error = DataError> {
ignore_etags: bool,
) -> impl Future<Item = Response, Error = DataError> {
// FIXME: remove unwrap somehow
let uri = Uri::from_str(self.uri()).unwrap();
let mut req = Request::get(uri).body(Body::empty()).unwrap();
if let Ok(url) = Url::parse(self.uri()) {
if let Some(password) = url.password() {
let mut auth = "Basic ".to_owned();
auth.push_str(&encode_config(
&format!("{}:{}", url.username(), password),
URL_SAFE,
));
req.headers_mut()
.insert(AUTHORIZATION, HeaderValue::from_str(&auth).unwrap());
}
}
let mut req = Request::new(Method::Get, uri);
// Set the UserAgent cause ppl still seem to check it for some reason...
req.headers_mut()
.insert(USER_AGENT_HEADER, HeaderValue::from_static(USER_AGENT));
req.headers_mut().set(UserAgent::new(USER_AGENT));
if let Some(etag) = self.http_etag() {
req.headers_mut()
.insert(IF_NONE_MATCH, HeaderValue::from_str(etag).unwrap());
}
if !ignore_etags {
if let Some(etag) = self.http_etag() {
let tag = vec![EntityTag::new(true, etag.to_owned())];
req.headers_mut().set(IfNoneMatch::Items(tag));
}
if let Some(lmod) = self.last_modified() {
req.headers_mut()
.insert(IF_MODIFIED_SINCE, HeaderValue::from_str(lmod).unwrap());
if let Some(lmod) = self.last_modified() {
if let Ok(date) = lmod.parse::<HttpDate>() {
req.headers_mut().set(IfModifiedSince(date));
}
}
}
client
@ -314,10 +240,9 @@ impl Source {
}
}
fn response_to_channel(
res: Response<Body>,
) -> impl Future<Item = Channel, Error = DataError> + Send {
res.into_body()
#[allow(needless_pass_by_value)]
fn response_to_channel(res: Response) -> impl Future<Item = Channel, Error = DataError> + Send {
res.body()
.concat2()
.map(|x| x.into_iter())
.map_err(From::from)
@ -329,30 +254,29 @@ fn response_to_channel(
#[cfg(test)]
mod tests {
use super::*;
use failure::Error;
use num_cpus;
use tokio;
use tokio_core::reactor::Core;
use crate::database::truncate_db;
use crate::utils::get_feed;
use database::truncate_db;
use utils::get_feed;
#[test]
fn test_into_feed() -> Result<(), Error> {
truncate_db()?;
fn test_into_feed() {
truncate_db().unwrap();
let mut rt = tokio::runtime::Runtime::new()?;
let https = HttpsConnector::new(num_cpus::get())?;
let client = Client::builder().build::<_, Body>(https);
let mut core = Core::new().unwrap();
let client = Client::configure()
.connector(HttpsConnector::new(4, &core.handle()).unwrap())
.build(&core.handle());
let url = "https://web.archive.org/web/20180120083840if_/https://feeds.feedburner.\
com/InterceptedWithJeremyScahill";
let source = Source::from_url(url)?;
let source = Source::from_url(url).unwrap();
let id = source.id();
let feed = source.into_feed(client);
let feed = rt.block_on(feed)?;
let feed = source.into_feed(client, true);
let feed = core.run(feed).unwrap();
let expected = get_feed("tests/feeds/2018-01-20-Intercepted.xml", id);
assert_eq!(expected, feed);
Ok(())
}
}

View File

@ -1,49 +1,23 @@
// opml.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
//! FIXME: Docs
// #![allow(unused)]
use crate::dbqueries;
use crate::errors::DataError;
use crate::models::Source;
use xml::{
common::XmlVersion,
reader,
writer::{events::XmlEvent, EmitterConfig},
};
use errors::DataError;
use models::Source;
use xml::reader;
use std::collections::HashSet;
use std::fs;
use std::io::{Read, Write};
use std::io::Read;
use std::path::Path;
use std::fs::File;
// use std::fs::{File, OpenOptions};
// use std::io::BufReader;
use failure::Error;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
// FIXME: Make it a Diesel model
/// Represents an `outline` xml element as per the `OPML` [specification][spec]
/// not `RSS` related sub-elements are omitted.
/// not `RSS` related sub-elements are ommited.
///
/// [spec]: http://dev.opml.org/spec2.html
pub struct Opml {
@ -82,88 +56,7 @@ pub fn import_from_file<P: AsRef<Path>>(path: P) -> Result<Vec<Source>, DataErro
import_to_db(content.as_slice()).map_err(From::from)
}
/// Export a file to `P`, taking the feeds from the database and outputting
/// them in opml format.
pub fn export_from_db<P: AsRef<Path>>(path: P, export_title: &str) -> Result<(), Error> {
let file = File::create(path)?;
export_to_file(&file, export_title)
}
/// Export from `Source`s and `Show`s into `F` in OPML format
pub fn export_to_file<F: Write>(file: F, export_title: &str) -> Result<(), Error> {
let config = EmitterConfig::new().perform_indent(true);
let mut writer = config.create_writer(file);
let mut events: Vec<XmlEvent<'_>> = Vec::new();
// Set up headers
let doc = XmlEvent::StartDocument {
version: XmlVersion::Version10,
encoding: Some("UTF-8"),
standalone: Some(false),
};
events.push(doc);
let opml: XmlEvent<'_> = XmlEvent::start_element("opml")
.attr("version", "2.0")
.into();
events.push(opml);
let head: XmlEvent<'_> = XmlEvent::start_element("head").into();
events.push(head);
let title_ev: XmlEvent<'_> = XmlEvent::start_element("title").into();
events.push(title_ev);
let title_chars: XmlEvent<'_> = XmlEvent::characters(export_title).into();
events.push(title_chars);
// Close <title> & <head>
events.push(XmlEvent::end_element().into());
events.push(XmlEvent::end_element().into());
let body: XmlEvent<'_> = XmlEvent::start_element("body").into();
events.push(body);
for event in events {
writer.write(event)?;
}
// FIXME: Make this a model of a joined query (http://docs.diesel.rs/diesel/macro.joinable.html)
let shows = dbqueries::get_podcasts()?.into_iter().map(|show| {
let source = dbqueries::get_source_from_id(show.source_id()).unwrap();
(source, show)
});
for (ref source, ref show) in shows {
let title = show.title();
let link = show.link();
let xml_url = source.uri();
let s_ev: XmlEvent<'_> = XmlEvent::start_element("outline")
.attr("text", title)
.attr("title", title)
.attr("type", "rss")
.attr("xmlUrl", xml_url)
.attr("htmlUrl", link)
.into();
let end_ev: XmlEvent<'_> = XmlEvent::end_element().into();
writer.write(s_ev)?;
writer.write(end_ev)?;
}
// Close <body> and <opml>
let end_bod: XmlEvent<'_> = XmlEvent::end_element().into();
writer.write(end_bod)?;
let end_opml: XmlEvent<'_> = XmlEvent::end_element().into();
writer.write(end_opml)?;
Ok(())
}
/// Extracts the `outline` elements from a reader `R` and returns a `HashSet` of `Opml` structs.
/// Extracts the `outline` elemnts from a reader `R` and returns a `HashSet` of `Opml` structs.
pub fn extract_sources<R: Read>(reader: R) -> Result<HashSet<Opml>, reader::Error> {
let mut list = HashSet::new();
let parser = reader::EventReader::new(reader);
@ -209,56 +102,19 @@ pub fn extract_sources<R: Read>(reader: R) -> Result<HashSet<Opml>, reader::Erro
mod tests {
use super::*;
use chrono::Local;
use failure::Error;
use futures::Future;
use crate::database::{truncate_db, TEMPDIR};
use crate::utils::get_feed;
const URLS: &[(&str, &str)] = {
&[
(
"tests/feeds/2018-01-20-Intercepted.xml",
"https://web.archive.org/web/20180120083840if_/https://feeds.feedburner.\
com/InterceptedWithJeremyScahill",
),
(
"tests/feeds/2018-01-20-LinuxUnplugged.xml",
"https://web.archive.org/web/20180120110314if_/https://feeds.feedburner.\
com/linuxunplugged",
),
(
"tests/feeds/2018-01-20-TheTipOff.xml",
"https://web.archive.org/web/20180120110727if_/https://rss.acast.com/thetipoff",
),
(
"tests/feeds/2018-01-20-StealTheStars.xml",
"https://web.archive.org/web/20180120104957if_/https://rss.art19.\
com/steal-the-stars",
),
(
"tests/feeds/2018-01-20-GreaterThanCode.xml",
"https://web.archive.org/web/20180120104741if_/https://www.greaterthancode.\
com/feed/podcast",
),
(
"tests/feeds/2019-01-27-ACC.xml",
"https://web.archive.org/web/20190127005213if_/https://anticapitalistchronicles.libsyn.com/rss"
),
]
};
#[test]
fn test_extract() -> Result<(), Error> {
fn test_extract() {
let int_title = String::from("Intercepted with Jeremy Scahill");
let int_url = String::from("https://feeds.feedburner.com/InterceptedWithJeremyScahill");
let int_desc = String::from(
"The people behind The Intercepts fearless reporting and incisive \
commentaryJeremy Scahill, Glenn Greenwald, Betsy Reed and othersdiscuss the \
crucial issues of our time: national security, civil liberties, foreign policy, \
and criminal justice. Plus interviews with artists, thinkers, and newsmakers \
who challenge our preconceptions about the world we live in.",
);
let int_desc =
String::from(
"The people behind The Intercepts fearless reporting and incisive \
commentaryJeremy Scahill, Glenn Greenwald, Betsy Reed and othersdiscuss the \
crucial issues of our time: national security, civil liberties, foreign policy, \
and criminal justice. Plus interviews with artists, thinkers, and newsmakers \
who challenge our preconceptions about the world we live in.",
);
let dec_title = String::from("Deconstructed with Mehdi Hasan");
let dec_url = String::from("https://rss.prod.firstlook.media/deconstructed/podcast.rss");
@ -306,50 +162,6 @@ mod tests {
url: dec_url
},
];
assert_eq!(extract_sources(sample1.as_bytes())?, map);
Ok(())
}
#[test]
fn text_export() -> Result<(), Error> {
truncate_db()?;
URLS.iter().for_each(|&(path, url)| {
// Create and insert a Source into db
let s = Source::from_url(url).unwrap();
let feed = get_feed(path, s.id());
feed.index().wait().unwrap();
});
let mut map: HashSet<Opml> = HashSet::new();
let shows = dbqueries::get_podcasts()?.into_iter().map(|show| {
let source = dbqueries::get_source_from_id(show.source_id()).unwrap();
(source, show)
});
for (ref source, ref show) in shows {
let title = show.title().to_string();
// description is an optional field that we don't export
let description = String::new();
let url = source.uri().to_string();
map.insert(Opml {
title,
description,
url,
});
}
let opml_path = TEMPDIR.path().join("podcasts.opml");
export_from_db(opml_path.as_path(), "GNOME Podcasts Subscriptions")?;
let opml_file = File::open(opml_path.as_path())?;
assert_eq!(extract_sources(&opml_file)?, map);
// extract_sources drains the reader its passed
let mut opml_file = File::open(opml_path.as_path())?;
let mut opml_str = String::new();
opml_file.read_to_string(&mut opml_str)?;
assert_eq!(opml_str, include_str!("../tests/export_test.opml"));
Ok(())
assert_eq!(extract_sources(sample1.as_bytes()).unwrap(), map);
}
}

View File

@ -1,22 +1,3 @@
// parser.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use rss::extension::itunes::ITunesItemExtension;
/// Parses an Item Itunes extension and returns it's duration value in seconds.
@ -96,4 +77,5 @@ mod tests {
let item = Some(&extension);
assert_eq!(parse_itunes_duration(item), Some(6970));
}
}

View File

@ -1,38 +1,42 @@
// pipeline.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
// FIXME:
//! Docs.
use futures::{future::ok, lazy, prelude::*, stream::FuturesUnordered};
use tokio;
use futures::future::*;
use futures::prelude::*;
use futures::stream::*;
use hyper::client::HttpConnector;
use hyper::{Body, Client};
use hyper::Client;
use hyper_tls::HttpsConnector;
use tokio_core::reactor::Core;
use num_cpus;
use rayon;
use rayon_futures::ScopeFutureExt;
use crate::errors::DataError;
use crate::Source;
use errors::DataError;
use Source;
use std::iter::FromIterator;
// use std::sync::{Arc, Mutex};
// http://gtk-rs.org/tuto/closures
#[macro_export]
macro_rules! clone {
(@param _) => ( _ );
(@param $x:ident) => ( $x );
($($n:ident),+ => move || $body:expr) => (
{
$( let $n = $n.clone(); )+
move || $body
}
);
($($n:ident),+ => move |$($p:tt),+| $body:expr) => (
{
$( let $n = $n.clone(); )+
move |$(clone!(@param $p),)+| $body
}
);
}
type HttpsClient = Client<HttpsConnector<HttpConnector>>;
@ -42,55 +46,47 @@ type HttpsClient = Client<HttpsConnector<HttpConnector>>;
/// Messy temp diagram:
/// Source -> GET Request -> Update Etags -> Check Status -> Parse `xml/Rss` ->
/// Convert `rss::Channel` into `Feed` -> Index Podcast -> Index Episodes.
pub fn pipeline<'a, S>(sources: S, client: HttpsClient) -> impl Future<Item = (), Error = ()> + 'a
pub fn pipeline<'a, S>(
sources: S,
ignore_etags: bool,
client: &HttpsClient,
) -> impl Future<Item = Vec<()>, Error = DataError> + 'a
where
S: Stream<Item = Source, Error = DataError> + Send + 'a,
S: Stream<Item = Source, Error = DataError> + 'a,
{
sources
.and_then(move |s| s.into_feed(client.clone()))
.map_err(|err| {
match err {
// Avoid spamming the stderr when its not an eactual error
DataError::FeedNotModified(_) => (),
_ => error!("Error: {}", err),
}
})
.and_then(move |feed| {
let fut = lazy(|| feed.index().map_err(|err| error!("Error: {}", err)));
tokio::spawn(fut);
Ok(())
})
// For each terminates the stream at the first error so we make sure
// we pass good values regardless
.then(move |_| ok(()))
// Convert the stream into a Future to later execute as a tokio task
.for_each(move |_| ok(()))
.and_then(clone!(client => move |s| s.into_feed(client.clone(), ignore_etags)))
.and_then(|feed| rayon::scope(|s| s.spawn_future(feed.index())))
// the stream will stop at the first error so
// we ensure that everything will succeded regardless.
.map_err(|err| error!("Error: {}", err))
.then(|_| ok::<(), DataError>(()))
.collect()
}
/// Creates a tokio `reactor::Core`, and a `hyper::Client` and
/// runs the pipeline to completion. The `reactor::Core` is dropped afterwards.
pub fn run<S>(sources: S) -> Result<(), DataError>
pub fn run<S>(sources: S, ignore_etags: bool) -> Result<(), DataError>
where
S: IntoIterator<Item = Source>,
{
let https = HttpsConnector::new(num_cpus::get())?;
let client = Client::builder().build::<_, Body>(https);
let mut core = Core::new()?;
let handle = core.handle();
let client = Client::configure()
.connector(HttpsConnector::new(num_cpus::get(), &handle)?)
.build(&handle);
let foo = sources.into_iter().map(ok::<_, _>);
let stream = FuturesUnordered::from_iter(foo);
let p = pipeline(stream, client);
tokio::run(p);
Ok(())
let stream = iter_ok::<_, DataError>(sources);
let p = pipeline(stream, ignore_etags, &client);
core.run(p).map(|_| ())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::database::truncate_db;
use crate::dbqueries;
use crate::Source;
use failure::Error;
use database::truncate_db;
use dbqueries;
use Source;
// (path, url) tuples.
const URLS: &[&str] = &[
@ -105,29 +101,28 @@ mod tests {
#[test]
/// Insert feeds and update/index them.
fn test_pipeline() -> Result<(), Error> {
truncate_db()?;
fn test_pipeline() {
truncate_db().unwrap();
let bad_url = "https://gitlab.gnome.org/World/podcasts.atom";
// if a stream returns error/None it stops
// bad we want to parse all feeds regardless if one fails
Source::from_url(bad_url)?;
Source::from_url(bad_url).unwrap();
URLS.iter().for_each(|url| {
// Index the urls into the source table.
Source::from_url(url).unwrap();
});
let sources = dbqueries::get_sources()?;
run(sources)?;
let sources = dbqueries::get_sources().unwrap();
run(sources, true).unwrap();
let sources = dbqueries::get_sources()?;
let sources = dbqueries::get_sources().unwrap();
// Run again to cover Unique constrains erros.
run(sources)?;
run(sources, true).unwrap();
// Assert the index rows equal the controlled results
assert_eq!(dbqueries::get_sources()?.len(), 6);
assert_eq!(dbqueries::get_podcasts()?.len(), 5);
assert_eq!(dbqueries::get_episodes()?.len(), 354);
Ok(())
assert_eq!(dbqueries::get_sources().unwrap().len(), 6);
assert_eq!(dbqueries::get_podcasts().unwrap().len(), 5);
assert_eq!(dbqueries::get_episodes().unwrap().len(), 354);
}
}

View File

@ -1,22 +1,3 @@
// utils.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
//! Helper utilities for accomplishing various tasks.
use chrono::prelude::*;
@ -24,10 +5,10 @@ use rayon::prelude::*;
use url::{Position, Url};
use crate::dbqueries;
use crate::errors::DataError;
use crate::models::{EpisodeCleanerModel, Save, Show};
use crate::xdg_dirs::DL_DIR;
use dbqueries;
use errors::DataError;
use models::{EpisodeCleanerModel, Save, Show};
use xdg_dirs::DL_DIR;
use std::fs;
use std::path::Path;
@ -56,7 +37,7 @@ fn download_checker() -> Result<(), DataError> {
Ok(())
}
/// Delete watched `episodes` that have exceeded their lifetime after played.
/// Delete watched `episodes` that have exceded their liftime after played.
fn played_cleaner(cleanup_date: DateTime<Utc>) -> Result<(), DataError> {
let mut episodes = dbqueries::get_played_cleaner_episodes()?;
let now_utc = cleanup_date.timestamp() as i32;
@ -68,7 +49,7 @@ fn played_cleaner(cleanup_date: DateTime<Utc>) -> Result<(), DataError> {
let limit = ep.played().unwrap();
if now_utc > limit {
delete_local_content(ep)
.map(|_| info!("Episode {:?} was deleted successfully.", ep.local_uri()))
.map(|_| info!("Episode {:?} was deleted succesfully.", ep.local_uri()))
.map_err(|err| error!("Error: {}", err))
.map_err(|_| error!("Failed to delete file: {:?}", ep.local_uri()))
.ok();
@ -122,7 +103,7 @@ pub fn url_cleaner(s: &str) -> String {
// https://rust-lang-nursery.github.io/rust-cookbook/net.html
// #remove-fragment-identifiers-and-query-pairs-from-a-url
match Url::parse(s) {
Ok(parsed) => parsed[..Position::AfterQuery].to_owned(),
Ok(parsed) => parsed[..Position::AfterPath].to_owned(),
_ => s.trim().to_owned(),
}
}
@ -144,23 +125,24 @@ pub fn get_download_folder(pd_title: &str) -> Result<String, DataError> {
// TODO: Write Tests
pub fn delete_show(pd: &Show) -> Result<(), DataError> {
dbqueries::remove_feed(pd)?;
info!("{} was removed successfully.", pd.title());
info!("{} was removed succesfully.", pd.title());
let fold = get_download_folder(pd.title())?;
fs::remove_dir_all(&fold)?;
info!("All the content at, {} was removed successfully", &fold);
info!("All the content at, {} was removed succesfully", &fold);
Ok(())
}
#[cfg(test)]
use crate::Feed;
use Feed;
#[cfg(test)]
/// Helper function that open a local file, parse the rss::Channel and gives back a Feed object.
/// Alternative Feed constructor to be used for tests.
pub fn get_feed(file_path: &str, id: i32) -> Feed {
use crate::feed::FeedBuilder;
use feed::FeedBuilder;
use rss::Channel;
use std::fs;
use std::io::BufReader;
// open the xml file
@ -176,26 +158,27 @@ pub fn get_feed(file_path: &str, id: i32) -> Feed {
#[cfg(test)]
mod tests {
extern crate tempdir;
use self::tempdir::TempDir;
use super::*;
use chrono::Duration;
use failure::Error;
use tempdir::TempDir;
use crate::database::truncate_db;
use crate::models::NewEpisodeBuilder;
use database::truncate_db;
use models::NewEpisodeBuilder;
use std::fs::File;
use std::io::Write;
fn helper_db() -> Result<TempDir, Error> {
fn helper_db() -> TempDir {
// Clean the db
truncate_db()?;
truncate_db().unwrap();
// Setup tmp file stuff
let tmp_dir = TempDir::new("podcasts_test")?;
let tmp_dir = TempDir::new("podcasts_test").unwrap();
let valid_path = tmp_dir.path().join("virtual_dl.mp3");
let bad_path = tmp_dir.path().join("invalid_thing.mp3");
let mut tmp_file = File::create(&valid_path)?;
writeln!(tmp_file, "Foooo")?;
let mut tmp_file = File::create(&valid_path).unwrap();
writeln!(tmp_file, "Foooo").unwrap();
// Setup episodes
let n1 = NewEpisodeBuilder::default()
@ -203,31 +186,33 @@ mod tests {
.show_id(0)
.build()
.unwrap()
.to_episode()?;
.to_episode()
.unwrap();
let n2 = NewEpisodeBuilder::default()
.title("bar_baz".to_string())
.show_id(1)
.build()
.unwrap()
.to_episode()?;
.to_episode()
.unwrap();
let mut ep1 = dbqueries::get_episode_cleaner_from_pk(n1.title(), n1.show_id())?;
let mut ep2 = dbqueries::get_episode_cleaner_from_pk(n2.title(), n2.show_id())?;
let mut ep1 = dbqueries::get_episode_from_pk(n1.title(), n1.show_id()).unwrap();
let mut ep2 = dbqueries::get_episode_from_pk(n2.title(), n2.show_id()).unwrap();
ep1.set_local_uri(Some(valid_path.to_str().unwrap()));
ep2.set_local_uri(Some(bad_path.to_str().unwrap()));
ep1.save()?;
ep2.save()?;
ep1.save().unwrap();
ep2.save().unwrap();
Ok(tmp_dir)
tmp_dir
}
#[test]
fn test_download_checker() -> Result<(), Error> {
let tmp_dir = helper_db()?;
download_checker()?;
let episodes = dbqueries::get_downloaded_episodes()?;
fn test_download_checker() {
let tmp_dir = helper_db();
download_checker().unwrap();
let episodes = dbqueries::get_downloaded_episodes().unwrap();
let valid_path = tmp_dir.path().join("virtual_dl.mp3");
assert_eq!(episodes.len(), 1);
@ -236,75 +221,69 @@ mod tests {
episodes.first().unwrap().local_uri()
);
let _tmp_dir = helper_db()?;
download_checker()?;
let episode = dbqueries::get_episode_cleaner_from_pk("bar_baz", 1)?;
let _tmp_dir = helper_db();
download_checker().unwrap();
let episode = dbqueries::get_episode_from_pk("bar_baz", 1).unwrap();
assert!(episode.local_uri().is_none());
Ok(())
}
#[test]
fn test_download_cleaner() -> Result<(), Error> {
let _tmp_dir = helper_db()?;
fn test_download_cleaner() {
let _tmp_dir = helper_db();
let mut episode: EpisodeCleanerModel =
dbqueries::get_episode_cleaner_from_pk("foo_bar", 0)?.into();
dbqueries::get_episode_from_pk("foo_bar", 0).unwrap().into();
let valid_path = episode.local_uri().unwrap().to_owned();
delete_local_content(&mut episode)?;
delete_local_content(&mut episode).unwrap();
assert_eq!(Path::new(&valid_path).exists(), false);
Ok(())
}
#[test]
fn test_played_cleaner_expired() -> Result<(), Error> {
let _tmp_dir = helper_db()?;
let mut episode = dbqueries::get_episode_cleaner_from_pk("foo_bar", 0)?;
fn test_played_cleaner_expired() {
let _tmp_dir = helper_db();
let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap();
let cleanup_date = Utc::now() - Duration::seconds(1000);
let epoch = cleanup_date.timestamp() as i32 - 1;
episode.set_played(Some(epoch));
episode.save()?;
episode.save().unwrap();
let valid_path = episode.local_uri().unwrap().to_owned();
// This should delete the file
played_cleaner(cleanup_date)?;
played_cleaner(cleanup_date).unwrap();
assert_eq!(Path::new(&valid_path).exists(), false);
Ok(())
}
#[test]
fn test_played_cleaner_none() -> Result<(), Error> {
let _tmp_dir = helper_db()?;
let mut episode = dbqueries::get_episode_cleaner_from_pk("foo_bar", 0)?;
fn test_played_cleaner_none() {
let _tmp_dir = helper_db();
let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap();
let cleanup_date = Utc::now() - Duration::seconds(1000);
let epoch = cleanup_date.timestamp() as i32 + 1;
episode.set_played(Some(epoch));
episode.save()?;
episode.save().unwrap();
let valid_path = episode.local_uri().unwrap().to_owned();
// This should not delete the file
played_cleaner(cleanup_date)?;
played_cleaner(cleanup_date).unwrap();
assert_eq!(Path::new(&valid_path).exists(), true);
Ok(())
}
#[test]
fn test_url_cleaner() -> Result<(), Error> {
let good_url = "http://traffic.megaphone.fm/FL8608731318.mp3?updated=1484685184";
let bad_url = "http://traffic.megaphone.fm/FL8608731318.mp3?updated=1484685184#foobar";
fn test_url_cleaner() {
let good_url = "http://traffic.megaphone.fm/FL8608731318.mp3";
let bad_url = "http://traffic.megaphone.fm/FL8608731318.mp3?updated=1484685184";
assert_eq!(url_cleaner(bad_url), good_url);
assert_eq!(url_cleaner(good_url), good_url);
assert_eq!(url_cleaner(&format!(" {}\t\n", bad_url)), good_url);
Ok(())
}
#[test]
// This test needs access to local system so we ignore it by default.
#[ignore]
fn test_get_dl_folder() -> Result<(), Error> {
fn test_get_dl_folder() {
let foo_ = format!("{}/{}", DL_DIR.to_str().unwrap(), "foo");
assert_eq!(get_download_folder("foo")?, foo_);
assert_eq!(get_download_folder("foo").unwrap(), foo_);
let _ = fs::remove_dir_all(foo_);
Ok(())
}
}

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<opml version="2.0">
<head>
<title>GNOME Podcasts Subscriptions</title>
</head>
<body>
<outline text="David Harvey&apos;s Anti-Capitalist Chronicles" title="David Harvey&apos;s Anti-Capitalist Chronicles" type="rss" xmlUrl="https://web.archive.org/web/20190127005213if_/https://anticapitalistchronicles.libsyn.com/rss" htmlUrl="https://www.democracyatwork.info/acc" />
<outline text="Greater Than Code" title="Greater Than Code" type="rss" xmlUrl="https://web.archive.org/web/20180120104741if_/https://www.greaterthancode.com/feed/podcast" htmlUrl="https://www.greaterthancode.com/" />
<outline text="Intercepted with Jeremy Scahill" title="Intercepted with Jeremy Scahill" type="rss" xmlUrl="https://web.archive.org/web/20180120083840if_/https://feeds.feedburner.com/InterceptedWithJeremyScahill" htmlUrl="https://theintercept.com/podcasts" />
<outline text="LINUX Unplugged Podcast" title="LINUX Unplugged Podcast" type="rss" xmlUrl="https://web.archive.org/web/20180120110314if_/https://feeds.feedburner.com/linuxunplugged" htmlUrl="http://www.jupiterbroadcasting.com/" />
<outline text="Steal the Stars" title="Steal the Stars" type="rss" xmlUrl="https://web.archive.org/web/20180120104957if_/https://rss.art19.com/steal-the-stars" htmlUrl="http://tor-labs.com/" />
<outline text="The Tip Off" title="The Tip Off" type="rss" xmlUrl="https://web.archive.org/web/20180120110727if_/https://rss.acast.com/thetipoff" htmlUrl="http://www.acast.com/thetipoff" />
</body>
</opml>

View File

@ -1,176 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<atom:link href="https://anticapitalistchronicles.libsyn.com/rss" rel="self" type="application/rss+xml"/>
<title>David Harvey's Anti-Capitalist Chronicles</title>
<pubDate>Thu, 17 Jan 2019 05:00:00 +0000</pubDate>
<lastBuildDate>Thu, 17 Jan 2019 05:06:40 +0000</lastBuildDate>
<generator>Libsyn WebEngine 2.0</generator>
<link>https://www.democracyatwork.info/acc</link>
<language>en</language>
<copyright><![CDATA[Democracy at Work 2018]]></copyright>
<docs>https://www.democracyatwork.info/acc</docs>
<managingEditor>info@democracyatwork.info (info@democracyatwork.info)</managingEditor>
<itunes:summary><![CDATA[The Anti-Capitalist Chronicles look at capitalism through a Marxist lens. Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc]]></itunes:summary>
<image>
<url>https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png</url>
<title>David Harvey's Anti-Capitalist Chronicles</title>
<link><![CDATA[https://www.democracyatwork.info/acc]]></link>
</image>
<itunes:author>David Harvey</itunes:author>
<itunes:keywords>capitalism,economics,marxism,politics</itunes:keywords>
<itunes:category text="News &amp; Politics"/>
<itunes:category text="Education"></itunes:category>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png" />
<itunes:explicit>clean</itunes:explicit>
<itunes:owner>
<itunes:name><![CDATA[Democracy at Work]]></itunes:name>
<itunes:email>acc@democracyatwork.info</itunes:email>
</itunes:owner>
<description><![CDATA[The Anti-Capitalist Chronicles look at capitalism through a Marxist lens. Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc ]]></description>
<itunes:subtitle><![CDATA[]]></itunes:subtitle>
<itunes:type>episodic</itunes:type>
<item>
<title>The significance of China in the Global Economy</title>
<itunes:title>The significance of China in the Global Economy</itunes:title>
<pubDate>Thu, 17 Jan 2019 05:00:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[b64981bbe26247e19e66f1c9c14a332a]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/the-significance-of-china-in-the-global-economy]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png" />
<description><![CDATA[<p>The Chinese economy is now the 2nd largest in the world. Prof. Harvey argues that China's expansion saved capitalism after the 2008 crash.</p>]]></description>
<content:encoded><![CDATA[<p>The Chinese economy is now the 2nd largest in the world. Prof. Harvey argues that China's expansion saved capitalism after the 2008 crash.</p>]]></content:encoded>
<enclosure length="106240847" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/ACC_S1_E07.mp3?dest-id=796288" />
<itunes:duration>44:15</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[The Chinese economy is now the 2nd largest in the world. Prof. Harvey argues that China's expansion saved capitalism after the 2008 crash.]]></itunes:subtitle>
<itunes:summary>The Chinese economy is now the 2nd largest in the world. Prof. Harvey argues that China's expansion saved capitalism after the 2008 crash.</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>7</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>Does Socialism Affect Freedom?</title>
<itunes:title>Does Socialism Affect Freedom? </itunes:title>
<pubDate>Thu, 03 Jan 2019 05:00:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[3fe5b10d8f6045d7a65bc3de64f23277]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/does-socialism-affect-freedom]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png" />
<description><![CDATA[<p>Does socialism require the surrender of individual freedom? The realm of freedom begins when the realm of necessity is left behind. Is freedom of the market real freedom?  And what about justice?  Prof. Harvey tries to answer these questions and more.</p>]]></description>
<content:encoded><![CDATA[<p>Does socialism require the surrender of individual freedom? The realm of freedom begins when the realm of necessity is left behind. Is freedom of the market real freedom?  And what about justice?  Prof. Harvey tries to answer these questions and more.</p>]]></content:encoded>
<enclosure length="60112942" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep06_Does_socialism_affect_freedom.mp3?dest-id=796288" />
<itunes:duration>25:02</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[Does socialism require the surrender of individual freedom? The realm of freedom begins when the realm of necessity is left behind. Is freedom of the market real freedom?  And what about justice?  Prof. Harvey tries to answer these questions...]]></itunes:subtitle>
<itunes:summary>Does socialism require the surrender of individual freedom? The realm of freedom begins when the realm of necessity is left behind. Is freedom of the market real freedom?  And what about justice?  Prof. Harvey tries to answer these questions and more.</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>6</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>The Value of Everything</title>
<itunes:title>"The Value of Everything</itunes:title>
<pubDate>Thu, 13 Dec 2018 05:00:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[6ca8e36116924b4f8b1ebeb1b6c35bae]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/the-value-of-everything]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png" />
<description><![CDATA[<p>Prof. Harvey talks about Mariana Mazzucato's new book "The Value of Everything: Making and Taking in the Global Economy."</p>]]></description>
<content:encoded><![CDATA[<p>Prof. Harvey talks about Mariana Mazzucato's new book "The Value of Everything: Making and Taking in the Global Economy."</p>]]></content:encoded>
<enclosure length="60810663" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep05_2018.10_pt2.mp3?dest-id=796288" />
<itunes:duration>25:19</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[Prof. Harvey talks about Mariana Mazzucato's new book "The Value of Everything: Making and Taking in the Global Economy."]]></itunes:subtitle>
<itunes:summary>Prof. Harvey talks about Mariana Mazzucato's new book "The Value of Everything: Making and Taking in the Global Economy."</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>5</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>The Brazilian Elections</title>
<itunes:title>The Brazilian Elections</itunes:title>
<pubDate>Thu, 29 Nov 2018 05:00:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[f76a6e81de1c44db847b5424f7b338de]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/the-brazilian-elections]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/9/2/b/092b811513b710af/ACC_Logo_Final_LibsynSize.png" />
<description><![CDATA[<p>Prof. Harvey talks about the recent Brazilian elections and the growing alliance between Neo-liberalism and Right-Wing Populism.</p>]]></description>
<content:encoded><![CDATA[<p>Prof. Harvey talks about the recent Brazilian elections and the growing alliance between Neo-liberalism and Right-Wing Populism.</p>]]></content:encoded>
<enclosure length="72984484" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep04_2018.10_pt1.mp3?dest-id=796288" />
<itunes:duration>30:23</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[Prof. Harvey talks about the recent Brazilian elections and the growing alliance between Neo-liberalism and Right-Wing Populism.]]></itunes:subtitle>
<itunes:summary>Prof. Harvey talks about the recent Brazilian elections and the growing alliance between Neo-liberalism and Right-Wing Populism.</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>4</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>The Financialization of Power</title>
<itunes:title>The Financialization of Power</itunes:title>
<pubDate>Thu, 15 Nov 2018 13:10:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[e4641accc886461dbcbef94775532adc]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/the-financialization-of-power]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/a/4/d/7/a4d743af97f5ad8e/ACC_Logo_IconOnly_LibsynSize.png" />
<description><![CDATA[<p>Financial services become part of GDP in the 1970s and legitimize the power of financial institutions. </p>]]></description>
<content:encoded><![CDATA[<p>Financial services become part of GDP in the 1970s and legitimize the power of financial institutions. </p>]]></content:encoded>
<enclosure length="46686237" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep03_2018.09.mp3?dest-id=796288" />
<itunes:duration>19:27</itunes:duration>
<itunes:explicit>no</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[Financial services become part of GDP in the 1970s and legitimize the power of financial institutions. ]]></itunes:subtitle>
<itunes:summary>Financial services become part of GDP in the 1970s and legitimize the power of financial institutions. </itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>3</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>Contradictions of Neo-Liberalism</title>
<itunes:title>The Contradictions of Neo-Liberalism</itunes:title>
<pubDate>Thu, 15 Nov 2018 13:05:00 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[a4f0d0206b8d4572b8e54764a39c8a48]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/contradictions-of-neo-liberalism]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/9/b/e/d/9bed97160a2d6344/ACC_Logo_IconOnly_LibsynSize.png" />
<description><![CDATA[<p>The crash of 2008 challenges Neo-Liberalism.</p>]]></description>
<content:encoded><![CDATA[<p>The crash of 2008 challenges Neo-Liberalism.</p>]]></content:encoded>
<enclosure length="45500801" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep02_2018.09.mp3?dest-id=796288" />
<itunes:duration>18:58</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[The crash of 2008 challenges Neo-Liberalism.]]></itunes:subtitle>
<itunes:summary>The crash of 2008 challenge Neo-Liberalism.</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>2</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
<item>
<title>A brief history of Neo-Liberalism</title>
<itunes:title>A brief history of Neo-Liberalism</itunes:title>
<pubDate>Mon, 12 Nov 2018 22:01:39 +0000</pubDate>
<guid isPermaLink="false"><![CDATA[3daeb566cd964764a5847da4f2a6a309]]></guid>
<link><![CDATA[http://anticapitalistchronicles.libsyn.com/a-brief-history-of-neo-liberalism]]></link>
<itunes:image href="https://ssl-static.libsyn.com/p/assets/0/7/e/0/07e073ebe1b26e3f/ACC_Logo_IconOnly_LibsynSize.png" />
<description><![CDATA[<p>Prof. David Harvey's pilot episode. He provides a quick history of the rise and growth of Neo-Liberalism. </p> <p>Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc</p>]]></description>
<content:encoded><![CDATA[<p>Prof. David Harvey's pilot episode. He provides a quick history of the rise and growth of Neo-Liberalism. </p> <p>Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc</p>]]></content:encoded>
<enclosure length="47001933" type="audio/mpeg" url="https://traffic.libsyn.com/secure/anticapitalistchronicles/acc_ep01_2018.09.mp3?dest-id=796288" />
<itunes:duration>19:35</itunes:duration>
<itunes:explicit>clean</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[Prof. David Harvey's pilot episode. He provides a quick history of the rise and growth of Neo-Liberalism.  Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc]]></itunes:subtitle>
<itunes:summary>Prof. David Harvey's pilot episode. He provides a quick history of the rise and growth of Neo-Liberalism.
Support the show on Patreon and get early access to episodes and more: https://www.patreon.com/davidharveyacc</itunes:summary>
<itunes:season>1</itunes:season>
<itunes:episode>1</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<itunes:author>Democracy at Work</itunes:author>
</item>
</channel>
</rss>

View File

@ -43,9 +43,3 @@ Raw file: https://web.archive.org/web/20180120104741if_/https://www.greaterthanc
Web view: https://web.archive.org/web/20180328083913/https://ellinofreneia.sealabs.net/audio/podcast.rss
Raw file: https://web.archive.org/web/20180328083913if_/https://ellinofreneia.sealabs.net/audio/podcast.rss
#### David Harvey's Anti-Capitalist Chronicles
Web view: https://web.archive.org/web/20190127005213/https://anticapitalistchronicles.libsyn.com/rss
Raw file: https://web.archive.org/web/20190127005213if_/https://anticapitalistchronicles.libsyn.com/rss

View File

@ -1,20 +1,22 @@
[package]
authors = ["Jordan Petridis <jpetridis@gnome.org>"]
authors = ["Jordan Petridis <jordanpetridis@protonmail.com>"]
name = "podcasts-downloader"
version = "0.1.0"
edition = "2018"
workspace = "../"
[dependencies]
log = "0.4.8"
mime_guess = "2.0.3"
reqwest = "0.9.22"
error-chain = "0.12.0"
hyper = "0.11.27"
log = "0.4.3"
mime_guess = "1.8.6"
reqwest = "0.8.6"
tempdir = "0.3.7"
glob = "0.3.0"
failure = "0.1.8"
failure_derive = "0.1.8"
glob = "0.2.11"
failure = "0.1.1"
failure_derive = "0.1.1"
[dependencies.podcasts-data]
path = "../podcasts-data"
[dev-dependencies]
pretty_assertions = "0.6.1"
pretty_assertions = "0.5.1"

View File

@ -1,26 +1,7 @@
// downloader.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
use glob::glob;
use hyper::header::*;
use mime_guess;
use reqwest;
use reqwest::header::*;
use reqwest::RedirectPolicy;
use tempdir::TempDir;
@ -34,19 +15,16 @@ use podcasts_data::xdg_dirs::PODCASTS_CACHE;
use podcasts_data::{EpisodeWidgetModel, Save, ShowCoverModel};
// use failure::Error;
use crate::errors::DownloadError;
use errors::DownloadError;
// TODO: Replace path that are of type &str with std::path.
// TODO: Have a convention/document absolute/relative paths, if they should end
// with / or not.
pub trait DownloadProgress {
fn get_downloaded(&self) -> u64;
fn set_downloaded(&mut self, downloaded: u64);
fn get_size(&self) -> u64;
fn set_size(&mut self, bytes: u64);
fn should_cancel(&self) -> bool;
fn cancel(&mut self);
}
// Adapted from https://github.com/mattgathu/rget .
@ -54,17 +32,17 @@ pub trait DownloadProgress {
// Sorry to those who will have to work with that code.
// Would much rather use a crate,
// or bindings for a lib like youtube-dl(python),
// But can't seem to find one.
// But cant seem to find one.
// TODO: Write unit-tests.
fn download_into(
dir: &str,
file_title: &str,
url: &str,
progress: Option<Arc<Mutex<dyn DownloadProgress>>>,
progress: Option<Arc<Mutex<DownloadProgress>>>,
) -> Result<String, DownloadError> {
info!("GET request to: {}", url);
// Haven't included the loop check as
// Steal the Stars would trigger it as
// Steal the Stars would tigger it as
// it has a loop back before giving correct url
let policy = RedirectPolicy::custom(|attempt| {
info!("Redirect Attempt URL: {:?}", attempt.url());
@ -85,29 +63,16 @@ fn download_into(
info!("Status Resp: {}", resp.status());
if !resp.status().is_success() {
if let Some(ref prog) = progress {
if let Ok(mut m) = prog.lock() {
m.cancel();
}
}
return Err(DownloadError::UnexpectedResponse(resp.status()));
}
let headers = resp.headers().clone();
let ct_len = headers
.get(CONTENT_LENGTH)
.and_then(|h| h.to_str().ok())
.and_then(|len| len.parse().ok());
let ct_type = headers
.get(CONTENT_TYPE)
.and_then(|h| h.to_str().ok())
.map(From::from);
ct_len.map(|x| info!("File Length: {}", x));
let ct_len = headers.get::<ContentLength>().map(|ct_len| **ct_len);
let ct_type = headers.get::<ContentType>();
ct_len.map(|x| info!("File Lenght: {}", x));
ct_type.map(|x| info!("Content Type: {}", x));
let ext = get_ext(ct_type).unwrap_or_else(|| String::from("unknown"));
let ext = get_ext(ct_type.cloned()).unwrap_or_else(|| String::from("unknown"));
info!("Extension: {}", ext);
// Construct a temp file to save desired content.
@ -117,10 +82,9 @@ fn download_into(
let out_file = format!("{}/temp.part", tempdir.path().to_str().unwrap(),);
ct_len.map(|x| {
if let Some(ref p) = progress {
if let Ok(mut m) = p.lock() {
m.set_size(x);
}
if let Some(p) = progress.clone() {
let mut m = p.lock().unwrap();
m.set_size(x);
}
});
@ -131,34 +95,34 @@ fn download_into(
let target = format!("{}/{}.{}", dir, file_title, ext);
// Rename/move the tempfile into a permanent place upon success.
rename(out_file, &target)?;
info!("Downloading of {} completed successfully.", &target);
info!("Downloading of {} completed succesfully.", &target);
Ok(target)
}
/// Determine the file extension from the http content-type header.
fn get_ext(content: Option<&str>) -> Option<String> {
let mut iter = content?.split("/");
let type_ = iter.next()?;
let subtype = iter.next()?;
mime_guess::get_extensions(type_, subtype).and_then(|c| {
if c.contains(&&subtype) {
Some(subtype.to_string())
} else {
Some(c.first()?.to_string())
}
})
fn get_ext(content: Option<ContentType>) -> Option<String> {
let cont = content.clone()?;
content
.and_then(|c| mime_guess::get_extensions(c.type_().as_ref(), c.subtype().as_ref()))
.and_then(|c| {
if c.contains(&cont.subtype().as_ref()) {
Some(cont.subtype().as_ref().to_string())
} else {
Some(c.first().unwrap().to_string())
}
})
}
// TODO: Write unit-tests.
// TODO: Refactor... Somehow.
/// Handles the I/O of fetching a remote file and saving into a Buffer and A
/// File.
#[allow(clippy::needless_pass_by_value)]
#[allow(needless_pass_by_value)]
fn save_io(
file: &str,
resp: &mut reqwest::Response,
content_lenght: Option<u64>,
progress: Option<Arc<Mutex<dyn DownloadProgress>>>,
progress: Option<Arc<Mutex<DownloadProgress>>>,
) -> Result<(), DownloadError> {
info!("Downloading into: {}", file);
let chunk_size = match content_lenght {
@ -199,7 +163,7 @@ fn save_io(
pub fn get_episode(
ep: &mut EpisodeWidgetModel,
download_folder: &str,
progress: Option<Arc<Mutex<dyn DownloadProgress>>>,
progress: Option<Arc<Mutex<DownloadProgress>>>,
) -> Result<(), DownloadError> {
// Check if its alrdy downloaded
if ep.local_uri().is_some() {
@ -219,10 +183,10 @@ pub fn get_episode(
progress,
)?;
// If download succeeds set episode local_uri to dlpath.
// If download succedes set episode local_uri to dlpath.
ep.set_local_uri(Some(&path));
// Over-write episode length
// Over-write episode lenght
let size = fs::metadata(path);
if let Ok(s) = size {
ep.set_length(Some(s.len() as i32))
@ -272,7 +236,6 @@ pub fn cache_image(pd: &ShowCoverModel) -> Result<String, DownloadError> {
#[cfg(test)]
mod tests {
use super::*;
use failure::Error;
use podcasts_data::dbqueries;
use podcasts_data::pipeline;
use podcasts_data::Source;
@ -283,17 +246,17 @@ mod tests {
// This test inserts an rss feed to your `XDG_DATA/podcasts/podcasts.db` so we make it explicit
// to run it.
#[ignore]
fn test_cache_image() -> Result<(), Error> {
fn test_cache_image() {
let url = "https://web.archive.org/web/20180120110727if_/https://rss.acast.com/thetipoff";
// Create and index a source
let source = Source::from_url(url)?;
let source = Source::from_url(url).unwrap();
// Copy it's id
let sid = source.id();
// Convert Source it into a future Feed and index it
pipeline::run(vec![source])?;
pipeline::run(vec![source], true).unwrap();
// Get the Podcast
let pd = dbqueries::get_podcast_from_source_id(sid)?.into();
let pd = dbqueries::get_podcast_from_source_id(sid).unwrap().into();
let img_path = cache_image(&pd);
let foo_ = format!(
@ -301,8 +264,7 @@ mod tests {
PODCASTS_CACHE.to_str().unwrap(),
pd.title()
);
assert_eq!(img_path?, foo_);
fs::remove_file(foo_)?;
Ok(())
assert_eq!(img_path.unwrap(), foo_);
fs::remove_file(foo_).unwrap();
}
}

View File

@ -1,25 +1,3 @@
// errors.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#![allow(bare_trait_objects)]
use podcasts_data::errors::DataError;
use reqwest;
use std::io;
@ -44,24 +22,20 @@ pub enum DownloadError {
InvalidCachedImageLocation,
}
// Maps a type to a variant of the DataError enum
macro_rules! easy_from_impl {
($outer_type:ty, $from:ty => $to:expr) => (
impl From<$from> for $outer_type {
fn from(err: $from) -> Self {
$to(err)
}
}
);
($outer_type:ty, $from:ty => $to:expr, $($f:ty => $t:expr),+) => (
easy_from_impl!($outer_type, $from => $to);
easy_from_impl!($outer_type, $($f => $t),+);
);
impl From<reqwest::Error> for DownloadError {
fn from(err: reqwest::Error) -> Self {
DownloadError::RequestError(err)
}
}
easy_from_impl!(
DownloadError,
reqwest::Error => DownloadError::RequestError,
io::Error => DownloadError::IoError,
DataError => DownloadError::DataError
);
impl From<io::Error> for DownloadError {
fn from(err: io::Error) -> Self {
DownloadError::IoError(err)
}
}
impl From<DataError> for DownloadError {
fn from(err: DataError) -> Self {
DownloadError::DataError(err)
}
}

View File

@ -1,27 +1,17 @@
// lib.rs
//
// Copyright 2017 Jordan Petridis <jpetridis@gnome.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#![recursion_limit = "1024"]
#![allow(unknown_lints)]
#![allow(clippy::blacklisted_name)]
#![cfg_attr(
feature = "cargo-clippy",
allow(blacklisted_name, option_map_unit_fn)
)]
// Enable lint group collections
#![warn(nonstandard_style, edition_2018, rust_2018_idioms, bad_style, unused)]
#![warn(
nonstandard_style,
edition_2018,
rust_2018_idioms,
bad_style,
unused
)]
// standalone lints
#![warn(
const_err,
@ -30,6 +20,8 @@
no_mangle_generic_items,
overflowing_literals,
plugin_as_library,
private_no_mangle_fns,
private_no_mangle_statics,
unconditional_recursion,
unions_with_drop_fields,
while_true,
@ -39,7 +31,9 @@
elided_lifetime_in_paths,
missing_copy_implementations
)]
#![deny(warnings)]
extern crate failure;
#[macro_use]
extern crate failure_derive;
#[macro_use]
@ -49,5 +43,12 @@ extern crate log;
#[macro_use]
extern crate pretty_assertions;
extern crate glob;
extern crate hyper;
extern crate mime_guess;
extern crate podcasts_data;
extern crate reqwest;
extern crate tempdir;
pub mod downloader;
pub mod errors;

View File

@ -1,5 +0,0 @@
downloader_sources = files(
'downloader.rs',
'errors.rs',
'lib.rs'
)

View File

@ -1,56 +1,40 @@
[package]
authors = ["Jordan Petridis <jpetridis@gnome.com>"]
authors = ["Jordan Petridis <jordanpetridis@protonmail.com>"]
build = "build.rs"
name = "podcasts-gtk"
version = "0.1.0"
edition = "2018"
workspace = "../"
[dependencies]
chrono = "0.4.11"
crossbeam-channel = "0.3.9"
gdk = "0.12.1"
gdk-pixbuf = "0.8.0"
gobject-sys = "0.9.1"
glib-sys = "0.9.1"
gst = { version = "0.15.7", package = "gstreamer" }
gst-player = { version = "0.15.5", package = "gstreamer-player" }
chrono = "0.4.4"
crossbeam-channel = "0.2.3"
gdk = "0.8.0"
gdk-pixbuf = "0.4.0"
glib = "0.5.0"
gstreamer = "0.11.4"
gstreamer-player = "0.11.3"
humansize = "1.1.0"
lazy_static = "1.4.0"
log = "0.4.8"
loggerv = "0.7.2"
open = "1.4.0"
rayon = "1.3.1"
url = "2.1.0"
failure = "0.1.8"
failure_derive = "0.1.8"
fragile = "1.0.0"
regex = "1.3.9"
reqwest = "0.9.22"
serde_json = "1.0.55"
html2text = "0.1.12"
mpris-player = "0.5.0"
pango = "0.8.0"
glib = "0.9.3"
lazy_static = "1.0.2"
log = "0.4.3"
loggerv = "0.7.1"
open = "1.2.1"
rayon = "1.0.2"
send-cell = "0.1.3"
url = "1.7.1"
failure = "0.1.1"
failure_derive = "0.1.1"
regex = "1.0.2"
reqwest = "0.8.6"
serde_json = "1.0.24"
html2text = "0.1.8"
[dependencies.gettext-rs]
git = "https://github.com/danigm/gettext-rs"
branch = "no-gettext"
features = ["gettext-system"]
[dependencies.gtk]
features = ["v3_22"]
version = "0.4.1"
[dependencies.gio]
features = ["v2_50"]
version = "0.8.1"
[dependencies.gtk]
features = ["v3_24"]
version = "0.8.1"
[dependencies.libhandy]
version = "0.5.0"
features = [ "v0_0_10"]
# [dependencies.mpris-player]
# version = "0.4.0"
# git = "https://gitlab.gnome.org/World/Rust/mpris-player"
version = "0.4.1"
[dependencies.podcasts-data]
path = "../podcasts-data"
@ -59,4 +43,4 @@ path = "../podcasts-data"
path = "../podcasts-downloader"
[dev-dependencies]
pretty_assertions = "0.6.1"
pretty_assertions = "0.5.1"

13
podcasts-gtk/build.rs Normal file
View File

@ -0,0 +1,13 @@
use std::process::Command;
fn main() {
// Rerun the build script when files in the resources folder are changed.
println!("cargo:rerun-if-changed=resources");
println!("cargo:rerun-if-changed=resources/*");
Command::new("glib-compile-resources")
.args(&["--generate", "resources.xml"])
.current_dir("resources")
.status()
.unwrap();
}

View File

@ -1,27 +0,0 @@
# please keep this list sorted alphabetically
#
ca
cs
da
de
en_GB
es
eu
fi
fr
fur
gl
hr
hu
id
it
ko
lv
nl
pl
pt_BR
sk
sv
tr
uk
zh_CN

View File

@ -1,47 +0,0 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml
podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in
podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in
# ui files
podcasts-gtk/resources/gtk/empty_view.ui
podcasts-gtk/resources/gtk/episode_widget.ui
podcasts-gtk/resources/gtk/hamburger.ui
podcasts-gtk/resources/gtk/headerbar.ui
podcasts-gtk/resources/gtk/help-overlay.ui
podcasts-gtk/resources/gtk/home_episode.ui
podcasts-gtk/resources/gtk/home_view.ui
podcasts-gtk/resources/gtk/inapp_notif.ui
podcasts-gtk/resources/gtk/player_dialog.ui
podcasts-gtk/resources/gtk/player_rate.ui
podcasts-gtk/resources/gtk/player_toolbar.ui
podcasts-gtk/resources/gtk/secondary_menu.ui
podcasts-gtk/resources/gtk/show_menu.ui
podcasts-gtk/resources/gtk/show_widget.ui
# rust files
podcasts-gtk/src/app.rs
podcasts-gtk/src/headerbar.rs
podcasts-gtk/src/main.rs
podcasts-gtk/src/manager.rs
podcasts-gtk/src/settings.rs
podcasts-gtk/src/stacks/content.rs
podcasts-gtk/src/stacks/home.rs
podcasts-gtk/src/stacks/mod.rs
podcasts-gtk/src/stacks/populated.rs
podcasts-gtk/src/stacks/show.rs
podcasts-gtk/src/static_resource.rs.in
podcasts-gtk/src/utils.rs
podcasts-gtk/src/widgets/aboutdialog.rs
podcasts-gtk/src/widgets/appnotif.rs
podcasts-gtk/src/widgets/base_view.rs
podcasts-gtk/src/widgets/empty.rs
podcasts-gtk/src/widgets/episode.rs
podcasts-gtk/src/widgets/home_view.rs
podcasts-gtk/src/widgets/mod.rs
podcasts-gtk/src/widgets/player.rs
podcasts-gtk/src/widgets/show_menu.rs
podcasts-gtk/src/widgets/show.rs
podcasts-gtk/src/widgets/shows_view.rs
podcasts-gtk/src/window.rs

View File

@ -1,404 +0,0 @@
# Catalan translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-09-23 15:55+0000\n"
"PO-Revision-Date: 2018-09-23 23:03-0500\n"
"Language-Team: Catalan <gnome@llistes.softcatala.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
"X-Generator: Poedit 2.1.1\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posició superior de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posició esquerra de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Alçada de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Amplada de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Estat de maximització de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Habilita o inhabilita el tema fosc"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Si s'ha d'actualitzar periòdicament el contingut"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Quants períodes de temps esperar entre les actualitzacions automàtiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Quin període de temps esperar entre les actualitzacions automàtiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Si s'ha d'actualitzar el contingut després d'iniciar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Quants períodes de temps esperar entre les neteges automàtiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Quin període de temps esperar entre les neteges automàtiques"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Escolteu els vostres podcasts predilectes, sense sortir del vostre escriptori."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplicació de podcasts per al GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Aquest programa no té cap episodi encara"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Si sospiteu que això és un error, considereu crear un informe."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Cerqueu-vos alguns programes"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Afegeix programes nous mitjançant l'URL del canal"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importa programes des d'un altre dispositiu"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180
msgid "Calculating episode size…"
msgstr "S'està calculant la mida de l'episodi…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220
msgid "Play this episode"
msgstr "Reprodueix aquest episodi"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241
msgid "Cancel the download proccess"
msgstr "Cancel·la el procés de baixada"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264
msgid "Download this episode"
msgstr "Baixa aquest episodi"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Comprova si hi ha episodis nous"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importa programes"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Preferències"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "_Dreceres de teclat"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "_Quant a"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Afegeix un canal nou"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Introduïu l'adreça del canal que s'ha d'afegir"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Afegeix"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Ja us heu subscrit a aquest canal."
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Títol del programa"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Enrere"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "General"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Comprova si hi ha episodis nous"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Preferències"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Surt de l'aplicació"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Avui"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Ahir"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Aquesta setmana"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Aquest mes"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Més antics"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Una notificació d'acció dins l'aplicació"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Desfés"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Rebobina 10 segons"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Reprodueix"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Posa en pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Avança 10 segons"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Canvia la velocitat de la reproducció"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "Velocitat d'1,5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "Velocitat d'1,25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Velocitat normal"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Preferències"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Aparença"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Tema fosc"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Suprimeix els episodis reproduïts"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Després"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Marca tots els episodis com a reproduïts"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Lloc web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Cancel·la la subscripció"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Obre el lloc web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Marca'ls tots com a reproduïts"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Cancel·la la subscripció"
#: podcasts-gtk/src/app.rs:332
msgid "Fetching new episodes"
msgstr "S'estan recuperant els episodis nous"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "Ja us heu subscrit a aquest programa"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "L'URL no és vàlid"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Segons"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minuts"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Hores"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Dies"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Setmanes"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "Nous"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "Programes"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "Seleccioneu el fitxer des del qual voleu importar els programes."
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "_Importa"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "Fitxer OPML"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "No s'ha pogut analitzar el fitxer importat"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "No s'ha pogut accedir al fitxer seleccionat."
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "Client de podcasts per a l'escriptori GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "Més informació sobre el GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2018"
#: podcasts-gtk/src/widgets/episode.rs:130
msgid "{} min"
msgstr "{} m"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "El reproductor multimèdia ha sigut incapaç d'executar cap acció."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "S'han marcat tots els episodis com a escoltats"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "Heu cancel·lat la subscripció a {}"

View File

@ -1,405 +0,0 @@
# Czech translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Marek Černocký <marek@manet.cz>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-10-05 11:47+0000\n"
"PO-Revision-Date: 2018-10-07 16:42+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.7\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Horní souřadnice naposledy otevřeného hlavního okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Levá souřadnice naposledy otevřeného hlavního okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Výška naposledy otevřeného hlavního okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Šířka naposledy otevřeného hlavního okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Stav maximalizace naposledy otevřeného hlavního okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Vypnutý nebo zapnutý tmavý motiv"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Zda pravidelně aktualizovat obsah"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Kolik časových jednotek čekat mezi automatickými aktualizacemi"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Jaká je časová jednotka pro čekání mezi automatickými aktualizacemi"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Zda aktualizovat obsah po spuštění"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Kolik časových jednotek čekat mezi automatickými vymazáními"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Jaká je časová jednotka pro čekání mezi automatickými vymazáními"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:92 podcasts-gtk/src/app.rs:416
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "Podcasty"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Poslouchejte své oblíbené podcasty přímo z počítače"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "podcast;RSS;pořad;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcastová aplikace pro GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Pořad zatím nemá žádné epizody"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Pokud si myslíte, že se jedná o chybu, zvažte její nahlášení."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Doplňte si pořady"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Přidat nové pořady pomocí URL kanálu"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Naimportovat pořady z jiného zařízení"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180
msgid "Calculating episode size…"
msgstr "Počítá se velikost epizody…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220
msgid "Play this episode"
msgstr "Přehrát tuto epizodu"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241
msgid "Cancel the download process"
msgstr "Zrušit probíhající stahování"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264
msgid "Download this episode"
msgstr "Stáhnout tuto epizodu"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Vy_hledat nové epizody"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Na_importovat pořady"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Předvolby"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts"
msgstr "_Klávesové zkratky"
#: podcasts-gtk/resources/gtk/hamburger.ui:35
msgid "_About Podcasts"
msgstr "O _aplikaci Podcasty"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Přidat nový kanál"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Zadejte adresu kanálu, který chcete přidat"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Přidat"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Z tohoto kanálu již odebíráte!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Název pořadu"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Zpět"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Obecné"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Vyhledat nové epizody"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Předvolby"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Ukončit aplikaci"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Dnes"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Včera"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Tento týden"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Tento měsíc"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Starší"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Oznámení o činnosti v aplikaci"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Zpět"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Převinout zpět o 10 sekund"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Přehrát"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pozastavit"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Posunou rychle vpřed o 10 sekund"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Změnit rychlost přehrávání"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1,5 násobek rychlosti"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1,25 násobek rychlosti"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Normální rychlost"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Předvolby"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Vzhled"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Tmavý motiv"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Smazat přehrané epizody"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Po uplynutí"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Oz_načit všechny epizody jako přehrané"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Webové stránky"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "O_dhlásit odběr"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Otevřít webové stránky"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Označit vše jako přehrané"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Odhlásit odběr"
#: podcasts-gtk/src/app.rs:333
msgid "Fetching new episodes"
msgstr "Stahují se nové epizody"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "Již jste přihlášeni k odběru tohoto pořadu"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "Neplatná adresa URL"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "sekund"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "minut"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "hodin"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "dnů"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "týdnů"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "Nový"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "Pořady"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "Výběr soubor pro import pořadu"
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "Na_importovat"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "Soubor OPML"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "Selhalo zpracování naimportovaného souboru"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "K vybranému souboru není přístup"
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcastový klient pro uživatelské prostředí GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "Dozvědět se více o Podcastech GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "Marek Černocký <marek@manet.cz>"
#: podcasts-gtk/src/widgets/episode.rs:130
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:363
msgid "The media player was unable to execute an action."
msgstr "Multimediální přehrávač nebyl schopen provést žádnou činnost."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "Všechny epizody byly označené jak přehrané"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "Byl odhlášen odběr z {}"

View File

@ -1,377 +0,0 @@
# Danish translation for podcasts.
# Copyright (C) 2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# scootergrisen, 2019.
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-05-19 10:38+0000\n"
"PO-Revision-Date: 2019-05-22 14:50+0200\n"
"Last-Translator: scootergrisen\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Øverste placering af hovedvindue som sidst var åbent"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Venstre placering af hovedvindue som sidst var åbent"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Højde på hovedvindue som sidst var åbent"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Bredde på hovedvindue som sidst var åbent"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Maksimeret tilstand på hovedvindue som sidst var åbent"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Aktivér eller deaktivér mørkt tema"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Om indholdet jævnligt skal opdateres"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Hvor lang tid der skal gå mellem automatiske opdateringer"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Hvor lang tid der skal gå mellem automatiske opdateringer"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Om indholdet skal opdateres efter opstart"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Hvor lang tid der skal gå mellem automatiske oprydninger"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Hvor lang tid der skal gå mellem automatiske oprydninger"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433
#: podcasts-gtk/src/widgets/aboutdialog.rs:56
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Lyt til dine favorit podcasts fra dit skrivebord."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast-program til GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Udsendelsen har endnu ikke nogen episoder"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Hvis du tror det er en fejl, så overvej venligst at skrive en fejlrapport."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Hent nogen udsendelser"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Tilføj nye udsendelser via feed-URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importér udsendelser fra en anden enhed"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Du har allerede lyttet til episoden."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Udregner episodestørrelse …"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Afspil episoden"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Annuller downloadprocessen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Download episoden"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Søg efter nye episoder"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importér udsendelser"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Eksportér udsendelser"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Tastaturgenveje"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Om Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Tilføj et nyt feed"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Indtast adresse på feed der skal tilføjes"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Tilføj"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Du har allerede abonneret på feedet!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Vis titel"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Tilbage"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Generelt"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Søg efter nye episoder"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Afslut programmet"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "I dag"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "I går"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Denne uge"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Denne måned"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Ældre"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "En notifikation om programindbygget handling"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Fortryd"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Spol 10 sekunder tilbage"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Afspil"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Spol 10 sekunder fremad"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Skift afspilningshastigheden"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1,5 hastighed"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1,25 hastighed"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Normal hastighed"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Markér alle episoder som afspillet"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Websted"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Afmeld abonnement"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Åbn websted"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Markér alle som afspillet"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Afmeld abonnement"
#: podcasts-gtk/src/app.rs:351
msgid "Fetching new episodes"
msgstr "Henter nye episoder"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Du har allerede abonneret på udsendelsen"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Ugyldig URL"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nyt"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Udsendelser"
#: podcasts-gtk/src/utils.rs:397
msgid "Select the file from which to you want to import shows."
msgstr "Vælg den fil du vil importere udsendelser fra."
#: podcasts-gtk/src/utils.rs:400
msgid "_Import"
msgstr "_Importér"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457
msgid "OPML file"
msgstr "OPML-fil"
#: podcasts-gtk/src/utils.rs:426
msgid "Failed to parse the imported file"
msgstr "Kunne ikke fortolke den importerede fil"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed."
msgstr "Kunne ikke tilgå den valgte fil."
#: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Eksportér udsendelser til …"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "_Eksportér"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "_Annuller"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "Abonneringer for GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Kunne ikke eksportere podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast-klient til GNOME-skrivebordet."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Lær mere om GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "scootergrisen"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534
msgid "The media player was unable to execute an action."
msgstr "Medieafspilleren kunne ikke udføre en handling."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Markerede alle episoder som hørt"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Afmeldte abonnement fra {}"

View File

@ -1,430 +0,0 @@
# German translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2018.
# Tim Sabsch <tim@sabsch.com>, 2018-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-04-06 16:50+0000\n"
"PO-Revision-Date: 2020-05-09 16:54+0200\n"
"Last-Translator: Onno Giesmann <nutzer3105@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Obere Position des zuletzt geöffneten Hauptfensters"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Linke Position des zuletzt geöffneten Hauptfensters"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Höhe des zuletzt geöffneten Hauptfensters"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Breite des zuletzt geöffneten Hauptfensters"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Maximierungsstatus des zuletzt geöffneten Hauptfensters"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Dunkles Thema aktivieren oder deaktivieren"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr ""
"Legt fest, ob Inhalte in regelmäßigen Abständen aktualisiert werden sollen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Zeitintervall zwischen automatischen Aktualisierungsvorgängen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Zeitintervall zwischen automatischen Aktualisierungsvorgängen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Legt fest, ob Inhalte beim Programmstart aktualisiert werden sollen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Zeitintervall zwischen automatischen Löschvorgängen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Zeitintervall zwischen automatischen Löschvorgängen"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Hören Sie Ihre Lieblings-Podcasts direkt in Ihrer Arbeitsumgebung."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast-Anwendung für GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Dieser Podcast hat noch keine Folgen"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Falls Sie meinen, dass es sich um einen Fehler handeln könnte, schreiben Sie "
"bitte einen Fehlerbericht."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Podcasts abonnieren"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Neue Podcasts mittels Quellen-Adresse hinzufügen"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Podcasts von einem anderen Gerät importieren"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Sie haben sich diese Folge bereits angehört."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Größe der Folge wird ermittelt …"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Diese Folge abspielen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Herunterladen abbrechen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Diese Folge herunterladen"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Auf neue Folgen _prüfen"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Podcasts _importieren"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "Podcasts e_xportieren"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Tasten_kürzel"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "Info zu _Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Neue Quelle hinzufügen"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Hinzuzufügende Quellen-Adresse eingeben"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Hinzufügen"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Titel anzeigen"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Zurück"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Allgemein"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Auf neue Folgen prüfen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Die Anwendung beenden"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Heute"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Gestern"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Diese Woche"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Diesen Monat"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Älter"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Eine anwendungsinterne Aktionsmeldung"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Rückgängig"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Läuft gerade"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Die Wiedergabegeschwindigkeit ändern"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1,5-fache Geschwindigkeit"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1,25-fache Geschwindigkeit"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Normale Geschwindigkeit"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "10 Sekunden zurückspulen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Wiedergeben"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "10 Sekunden vorspulen"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Alle Folgen als angehört _markieren"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Internetseite"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "Ab_bestellen"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Internetseite öffnen"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Alle als angehört markieren"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Abbestellen"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Weiterlesen"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes"
msgstr "Neue Folgen werden abgerufen"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Neu"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Podcasts"
#: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows."
msgstr "Wählen Sie die Datei aus, aus der Sie Podcasts importieren wollen."
#: podcasts-gtk/src/utils.rs:401
msgid "_Import"
msgstr "_Importieren"
#: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file"
msgstr "OPML-Datei"
#: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file"
msgstr "Die importierte Datei konnte nicht ausgewertet werden"
#: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed."
msgstr "Auf die gewählte Datei konnte nicht zugegriffen werden."
#: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Podcasts exportieren nach …"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "E_xportieren"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "A_bbrechen"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcasts Abonnements"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Export der Podcasts ist fehlgeschlagen"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast-Client für die GNOME-Arbeitsumgebung."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Erfahren Sie mehr über GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Tim Sabsch <tim@sabsch.com>\n"
"Onno Giesmann <nutzer3105@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action."
msgstr "Die Medienwiedergabe konnte eine Aktion nicht ausführen."
#: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened"
msgstr "Alle Folgen als angehört markieren"
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}"
msgstr "Abonnement von {} gekündigt"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Einstellungen"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Sie haben diese Quelle bereits abonniert!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Einstellungen"
#~ msgid "Preferences"
#~ msgstr "Einstellungen"
#~ msgid "Appearance"
#~ msgstr "Erscheinungsbild"
#~ msgid "Dark Theme"
#~ msgstr "Dunkles Thema"
#~ msgid "Delete played episodes"
#~ msgstr "Angehörte Folgen löschen"
#~ msgid "After"
#~ msgstr "Nach"
#~ msgid "Invalid URL"
#~ msgstr "Ungültige Adresse"
#~ msgid "Seconds"
#~ msgstr "Sekunden"
#~ msgid "Minutes"
#~ msgstr "Minuten"
#~ msgid "Hours"
#~ msgstr "Stunden"
#~ msgid "Days"
#~ msgstr "Tage"
#~ msgid "Weeks"
#~ msgstr "Wochen"
#~ msgid "_About"
#~ msgstr "I_nfo"

View File

@ -1,433 +0,0 @@
# British English translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# zbrown <zbrown@gnome.org>, 2018.
# FULL NAME <EMAIL@ADDRESS>, 2018.
# Zander Brown <zbrown@gnome.org>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-03-03 16:03+0000\n"
"PO-Revision-Date: 2019-03-16 11:46+0000\n"
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
"Language-Team: British English <en_GB@li.org>\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);;\n"
"X-Generator: Poedit 2.2.1\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Top position of the last open main window"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Left position of the last open main window"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Height of the last open main window"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Width of the last open main window"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Maximised state of the last open main window"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Enable or disable dark theme"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Whether to periodically refresh content"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "How many periods of time to wait between automatic refreshes"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "What period of time to wait between automatic refreshes"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Whether to refresh content after startup"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "How many periods of time to wait between automatic cleanups"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "What period of time to wait between automatic cleanups"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:124 podcasts-gtk/src/app.rs:463
#: podcasts-gtk/src/widgets/aboutdialog.rs:56
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Listen to your favorite podcasts, right from your desktop."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast app for GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "This show does not have episodes yet"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "If you think this is an error, please consider writing a bug report."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Get some shows"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Add new shows via feed URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Import shows from another device"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180
msgid "Calculating episode size…"
msgstr "Calculating episode size…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220
msgid "Play this episode"
msgstr "Play this episode"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241
msgid "Cancel the download process"
msgstr "Cancel download"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264
msgid "Download this episode"
msgstr "Download this episode"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Check for New Episodes"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Import Shows"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
#| msgid "_Import Shows"
msgid "_Export Shows"
msgstr "_Export Shows"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Preferences"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts"
msgstr "_Keyboard Shortcuts"
#: podcasts-gtk/resources/gtk/hamburger.ui:35
msgid "_About Podcasts"
msgstr "_About Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Add a new feed"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Enter feed address to add"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Add"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "You are already subscribed to that feed!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Show Title"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Back"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "General"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Check for new episodes"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Preferences"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Quit the application"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Today"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Yesterday"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "This Week"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "This Month"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Older"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "An in-app action notification"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Undo"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Rewind 10 seconds"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Play"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Fast forward 10 seconds"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Change the playback speed"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1.5 speed rate"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1.25 speed rate"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Normal speed"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Preferences"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Appearance"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Dark Theme"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Delete played episodes"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "After"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Mark All Episodes as Played"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Website"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Unsubscribe"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Open Website"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Mark All as Played"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Unsubscribe"
#: podcasts-gtk/src/app.rs:378
msgid "Fetching new episodes"
msgstr "Fetching new episodes"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "You are already subscribed to this show"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Invalid URL"
#: podcasts-gtk/src/prefs.rs:78
msgid "Seconds"
msgstr "Seconds"
#: podcasts-gtk/src/prefs.rs:79
msgid "Minutes"
msgstr "Minutes"
#: podcasts-gtk/src/prefs.rs:80
msgid "Hours"
msgstr "Hours"
#: podcasts-gtk/src/prefs.rs:81
msgid "Days"
msgstr "Days"
#: podcasts-gtk/src/prefs.rs:82
msgid "Weeks"
msgstr "Weeks"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "New"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Shows"
#: podcasts-gtk/src/utils.rs:387
msgid "Select the file from which to you want to import shows."
msgstr "Select the file from which to you want to import shows."
#: podcasts-gtk/src/utils.rs:390
msgid "_Import"
msgstr "_Import"
#: podcasts-gtk/src/utils.rs:399 podcasts-gtk/src/utils.rs:447
msgid "OPML file"
msgstr "OPML file"
#: podcasts-gtk/src/utils.rs:416
msgid "Failed to parse the imported file"
msgstr "Failed to parse the imported file"
#: podcasts-gtk/src/utils.rs:421 podcasts-gtk/src/utils.rs:465
msgid "Selected file could not be accessed."
msgstr "Selected file could not be accessed."
#: podcasts-gtk/src/utils.rs:435
msgid "Export shows to…"
msgstr "Export shows to…"
#: podcasts-gtk/src/utils.rs:438
#| msgid "_Import"
msgid "_Export"
msgstr "_Export"
#: podcasts-gtk/src/utils.rs:439
msgid "_Cancel"
msgstr "_Cancel"
#: podcasts-gtk/src/utils.rs:459
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcasts Subscriptions"
#: podcasts-gtk/src/utils.rs:460
msgid "Failed to export podcasts"
msgstr "Failed to export podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast Client for the GNOME Desktop."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Learn more about GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Zander Brown"
#: podcasts-gtk/src/widgets/episode.rs:145
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:536
msgid "The media player was unable to execute an action."
msgstr "The media player was unable to execute an action."
#: podcasts-gtk/src/widgets/show_menu.rs:175
msgid "Marked all episodes as listened"
msgstr "Marked all episodes as listened"
#: podcasts-gtk/src/widgets/show_menu.rs:180
msgid "Unsubscribed from {}"
msgstr "Unsubscribed from {}"

View File

@ -1,461 +0,0 @@
# Spanish translations for gnome-podcasts package.
# Copyright (C) 2018 THE gnome-podcasts'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-podcasts package.
# Automatically generated, 2018.
# Daniel Garcia Moreno <danigm@wadobo.com>, 2018.
# Rodrigo <rodhos92@gmail.com>, 2018.
# Rodrigo Lledó <rodhos92@gmail.com>, 2019.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2018-2020.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-podcasts\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-07 13:18+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.34.0\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posición superior de la última ventana abierta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posición izquierda de la última ventana abierta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Altura de la última ventana abierta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Anchura de la última ventana abierta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Estado de maximizado de la última ventana abierta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Activar o desactivar el tema oscuro"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Indica si se debe actualizar el contenido periódicamente"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
"Cuántos periodos de tiempo hay que esperar entre actualizaciones automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr ""
"Qué periodo de tiempo hay que esperar entre actualizaciones automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Indica si se debe actualizar el contenido al iniciar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Cuántos periodos de tiempo hay que esperar entre limpiezas automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Cuántos periodos de tiempo hay que esperar entre limpiezas automáticas"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Escuche sus podcasts favoritos, directamente desde su escritorio."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplicación de Podcast para GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Este programa no tiene episodios todavía"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Si cree que esto es un error considere abrir un informe de error."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Consiga algún programa"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Añadir un programa nuevo a través de canal URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importar programas de otro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Ya ha escuchado este episodio."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Calculando tamaño del episodio…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Reproducir este episodio"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Cancelar el proceso de descarga"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Descargar este episodio"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Comprobar si hay nuevos episodios"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importar programas"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Exportar programas"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Atajos de _teclado"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Acerca de Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Añadir un canal nuevo"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Introduzca la dirección del canal que añadir"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Añadir"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Título del programa"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Atrás"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "General"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Comprobar si hay episodios nuevos"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Salir de la aplicación"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Hoy"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Ayer"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Esta semana"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Este mes"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Antiguo"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Una notificación de acción dentro de la aplicación"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Deshacer"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Reproduciendo ahora"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Cambiar velocidad de reproducción"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "velocidad 1.5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "velocidad 1.25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Velocidad normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Retroceder 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproducir"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Avanzar 10 segundos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Marcar todos los episodios como reproducidos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Página _Web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Cancelar suscripción"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Abrir Web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Marcar todo como reproducido"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Cancelar suscripción"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leer más"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Obteniendo nuevos episodios"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nuevo"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Programas"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Selecciona el fichero desde el que quiere importar programas."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importar"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "fichero OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Fallo al analizar el fichero importado"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "No se ha podido acceder al archivo seleccionado."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Exportar programas a…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Exportar"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Cancelar"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Suscripciones a podcasts de GNOME"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Falló al exportar podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Aplicación de Podcast para el escritorio GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Aprenda más sobre GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Daniel Mustieles <daniel.mustieles@gmail.com>, 2018-2019\n"
"Daniel García Moreno <danigm@wadobo.com>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "El reproductor no ha podido reproducir una acción."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Marcar todos los episodios como escuchados"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Suscripción cancelada para {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Ya está suscrito a este programa"
#~ msgid "Invalid URL"
#~ msgstr "URL no válido"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "¡Ya está suscrito a este canal!"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Preferencias"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Preferencias"
#~ msgid "Preferences"
#~ msgstr "Preferencias"
#~ msgid "Appearance"
#~ msgstr "Aspecto"
#~ msgid "Dark Theme"
#~ msgstr "Tema oscuro"
#~ msgid "Delete played episodes"
#~ msgstr "Eliminar episodios reproducidos"
#~ msgid "After"
#~ msgstr "Después"
#~ msgid "Seconds"
#~ msgstr "Segundos"
#~ msgid "Minutes"
#~ msgstr "Minutos"
#~ msgid "Hours"
#~ msgstr "Horas"
#~ msgid "Days"
#~ msgstr "Días"
#~ msgid "Weeks"
#~ msgstr "Semanas"
#~ msgid "_About"
#~ msgstr "_Acerca de"
#~ msgid "org.gnome.Podcasts"
#~ msgstr "org.gnome.Podcasts"
#~ msgid "Mark all episodes as listened"
#~ msgstr "Marcar todos los episodios como escuchados"
#~ msgid "Episode Title"
#~ msgstr "Título del episodio"
#~ msgid "3 Jan"
#~ msgstr "3 Jan"
#~ msgid "·"
#~ msgstr "·"
#~ msgid "42 min"
#~ msgstr "42 min"
#~ msgid "0 MB"
#~ msgstr "0 MB"
#~ msgid "/"
#~ msgstr "/"
#~ msgid "© 2017, 2018 Jordan Petridis"
#~ msgstr "© 2017, 2018 Jordan Petridis"

View File

@ -1,362 +0,0 @@
# Basque translation for podcasts.
# Copyright (C) 2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Asier Sarasua Garmendia <asier.sarasua@gmail.com>, 2019.
#
msgid ""
msgstr "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-10-10 13:08+0000\n"
"PO-Revision-Date: 2019-10-18 10:00+0100\n"
"Last-Translator: Asier Sarasua Garmendia <asier.sarasua@gmail.com>\n"
"Language-Team: Basque <librezale@librezale.eus>\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Irekitako azken leiho nagusiaren goiko posizioa"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Irekitako azken leiho nagusiaren ezkerreko posizioa"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Irekitako azken leiho nagusiaren altuera"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Irekitako azken leiho nagusiaren zabalera"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Irekitako azken leiho nagusiaren egoera maximizatua"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Gaitu edo desgaitu gai iluna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Edukia aldizka freskatuko den ala ez"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Zenbat denbora-tarte itxarongo den freskatze automatikoen artean"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Zenbat denbora itxarongo den freskatze automatikoen artean"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Abioaren ondoren edukia freskatuko den ala ez"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Zenbat denbora-tarte itxarongo den garbitze automatikoen artean"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Zenbat denbora itxarongo den garbitze automatikoen artean"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:327 podcasts-gtk/src/widgets/aboutdialog.rs:56
msgid "Podcasts"
msgstr "Podcast-ak"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Entzun zure podcast gogokoenak zuzenean zure mahaigainetik."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast-en aplikazioa GNOMErako"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Saio honek ez du pasarterik oraindik"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Errorea dela uste baduzu, idatzi akatsaren jakinarazpen bat."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Eskuratu zenbait saio"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Gehitu saio berriak jarioen URL baten bidez"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Inportatu saioak beste gailu batetik"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Dagoeneko entzun duzu pasarte hau"
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Pasartearen tamaina kalkulatzen…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Erreproduzitu pasarte hau"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Utzi deskarga-prozesua"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Deskargatu pasarte hau"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Begiratu pasarte berriak dauden"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Inportatu saioak"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Esportatu saioak"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Las_ter-teklak"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "Podcasts aplikazioari _buruz"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177
msgid "Add a new feed"
msgstr "Gehitu jario berria"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Sartu gehituko den jarioaren helbidea"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Gehitu"
#: podcasts-gtk/resources/gtk/headerbar.ui:157
msgid "Show Title"
msgstr "Erakutsi titulua"
#: podcasts-gtk/resources/gtk/headerbar.ui:198
msgid "Back"
msgstr "Atzera"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Orokorra"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Begiratu pasarte berriak dauden"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Irten aplikaziotik"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Gaur"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Atzo"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Aste honetan"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Hilabete honetan"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Zaharragoa"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Aplikazioaren jakinarazpen bat"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Desegin"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Joan 10 segundo atzera"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Erreproduzitu"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausatu"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Joan 10 segundo aurrera"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Aldatu erreprodukzioaren abiadura"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1.5 abiadura-tasa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1.25 abiadura-tasa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Abiadura normala"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Markatu pasarte guztiak erreproduzitu gisa"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Webgunea"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "Harpidetza _kendu"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Ireki webgunea"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Markatu dena erreproduzitu gisa"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Harpidetza kendu"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Pasarte berriak eskuratzen"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Berria"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Saioak"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Hautatu saioak inportatzeko erabiliko duzun fitxategia."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Inportatu"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML fitxategia"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Huts egin du inportatuko fitxategia analizatzeak"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Hautatutako fitxategia ezin da eskuratu."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Esportatu saioak hona…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Esportatu"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Utzi"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcasts harpidetzak"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Huts egin du podcast-ak esportatzeak"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast-en bezeroa GNOME mahaigainerako."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Ikasi gehiago GNOME Podcasts aplikazioari buruz"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Asier Sarasua Garmendia <asier.sarasua@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:535
msgid "The media player was unable to execute an action."
msgstr "Multimedia-erreproduzigailuak ezin izan da ekintza bat exekutatu."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Markatu pasarte guztiak entzundako gisa"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Kendu {} podcast-eko harpidetza"

View File

@ -1,432 +0,0 @@
# Finnish translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-23 13:44+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: Finnish <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Viimeksi avoinna olleen pääikkunan yläsijainti"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Viimeksi avoinna olleen pääikkunan vasen sijainti"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Viimeksi avoinna olleen pääikkunan korkeus"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Viimeksi avoinna olleen pääikkunan leveys"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr ""
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Ota käyttöön tai poista käytöstä tumma teema"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Päivitetäänkö sisältö säännöllisesti"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr ""
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Päivitetäänkö sisältö sovelluksen käynnistyttyä"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr ""
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr ""
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcastit"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Kuuntele suosikkipodcastejasi suoraan työpöydältäsi."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast-sovellus Gnomelle"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Tässä ohjelmassa ei ole vielä yhtäkään jaksoa"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Jos tämä on mielestäsi virhe, teethän bugiraportin."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Hanki ohjelmia"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Lisää uusia ohjelmia syötteen osoitteen avulla"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Tuo ohjelmia toiselta laitteelta"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Olet jo kuunnellut tämän jakson."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Lasketaan jakson kokoa…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Toista tämä jakso"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Peru lataaminen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Lataa tämä jakso"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Ta_rkista uudet jaksot"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Tu_o jaksoja"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Vie jaksoja"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Pikanäppäimet"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Tietoja - Podcastit"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Lisää uusi syöte"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Anna lisättävän syötteen osoite"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Lisää"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Ohjelman nimi"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Takaisin"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Yleiset"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Tarkista uudet jaksot"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Lopeta sovellus"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Tänään"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Eilen"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Tällä viikolla"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Tässä kuussa"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Vanhemmat"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Sovelluksen sisäinen ilmoitus"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Kumoa"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Nyt toistetaan"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Vaihda toistonopeutta"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1,5-kertainen nopeus"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1,25-kertainen nopeus"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Tavallinen nopeus"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Siirry taakse 10 sekuntia"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Toista"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Keskeytä"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Siirry eteen 10 sekuntia"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Merkitse kaikki jaksot toistetuiksi"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Verkkosivusto"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Lopeta tilaus"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Avaa verkkosivusto"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Merkitse kaikki toistetuiksi"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Lopeta tilaus"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lue lisää"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Noudetaan uusia jaksoja"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Uudet"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Ohjelmat"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Valitse tiedosto, josta haluat tuoda ohjelmia."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Tuo"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML-tiedosto"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Tuotua tiedostoa ei voitu jäsentää"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Valittua tiedostoa ei voitu käyttää."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Vie jaksot…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Vie"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Peru"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Gnomen podcastsovelluksen tilaukset"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Podcastien vienti epäonnistui"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast-sovellus Gnome-työpöydlle."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Lisätietoja Gnomen podcast-sovelluksesta"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Jiri Grönroos"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Mediasoitin ei kyennyt suorittamaan toimintoa."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Merkitse kaikki jaksot toistetuiksi"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Lopeta syötteen {} tilaus"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Olet jo tilannut kyseisen syötteen!"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Olet jo tilannut tämän ohjelman"
#~ msgid "Invalid URL"
#~ msgstr "Virheellinen osoite"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Asetukset"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Asetukset"
#~ msgid "Preferences"
#~ msgstr "Asetukset"
#~ msgid "Appearance"
#~ msgstr "Ulkoasu"
#~ msgid "Dark Theme"
#~ msgstr "Tumma teema"
#~ msgid "Delete played episodes"
#~ msgstr "Poista toistetut jaksot"
#~ msgid "After"
#~ msgstr "Viive"
#~ msgid "Seconds"
#~ msgstr "sekuntia"
#~ msgid "Minutes"
#~ msgstr "minuuttia"
#~ msgid "Hours"
#~ msgstr "tuntia"
#~ msgid "Days"
#~ msgstr "päivää"
#~ msgid "Weeks"
#~ msgstr "viikkoa"
#~ msgid "_About"
#~ msgstr "_Tietoja"
#~ msgid "org.gnome.Podcasts"
#~ msgstr "org.gnome.Podcasts"
#~ msgid "Episode Title"
#~ msgstr "Jakson nimi"

View File

@ -1,424 +0,0 @@
# French translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# arverne73 <arverne@wanadoo.fr>, 2018.
# Alexandre Franke <alexandre.franke@gmail.com>, 2018, 2020
# Thibault Martin <mail@thibaultmart.in>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-06-03 20:13+0000\n"
"PO-Revision-Date: 2020-06-19 17:15+0200\n"
"Last-Translator: Thibault Martin <mail@thibaultmart.in>\n"
"Language-Team: French <gnomefr@traduc.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Gtranslator 3.36.0\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Position supérieure de la dernière fenêtre principale ouverte"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Position gauche de la dernière fenêtre principale ouverte"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Hauteur de la dernière fenêtre principale ouverte"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Largeur de la dernière fenêtre principale ouverte"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "État maximisé de la dernière fenêtre principale ouverte"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Activer ou désactiver le thème sombre"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Indique sil faut actualiser périodiquement le contenu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Nombre de délais à attendre entre les actualisations automatiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Délai entre les actualisations automatiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Indique sil faut actualiser le contenu au démarrage"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Nombre de périodes de délai entre les nettoyages automatiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Délai entre les nettoyages automatiques"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Écouter vos podcasts favoris directement sur votre bureau."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;Baladodiffusion;Émissions;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Application de podcast pour GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Cette émission na pas encore dépisode"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Si vous pensez quil sagit dune erreur, faites un rapport de bogue."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Obtenir des émissions"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Ajouter de nouvelles émissions via une URL de flux"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importer des émissions à partir dun autre appareil"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Vous avez déjà écouté cet épisode."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Calcul de la taille de lépisode…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Lire cet épisode"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Annuler le téléchargement"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Télécharger cet épisode"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Chercher de nouveaux épisodes"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importer les émissions"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Exporter les émissions"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Raccourcis clavier"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "À _propos de Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Ajouter un nouveau flux"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Entrer ladresse du flux à ajouter"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Ajouter"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Titre de lémission"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Retour"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Général"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Chercher de nouveaux épisodes"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Quitter lapplication"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Aujourdhui"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Hier"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Cette semaine"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Ce mois-ci"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Plus ancien"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Une notification daction intégrée à lapplication"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Annuler"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Lecture en cours"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Changer la vitesse de lecture"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Débit × 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Débit × 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Vitesse normale"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Reculer de 10 secondes"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Lire"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Avancer de 10 secondes"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Marquer tous les épisodes comme lus"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Site _Web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "Se _désabonner"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Aller sur le site Web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Marquer tout comme lu"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Se désabonner"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "En savoir plus"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes"
msgstr "Récupérer les nouveaux épisodes"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nouveau"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Émissions"
#: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows."
msgstr "Sélectionnez le fichier à partir duquel importer les émissions."
#: podcasts-gtk/src/utils.rs:401
msgid "_Import"
msgstr "_Importer"
#: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file"
msgstr "Fichier OPML"
#: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file"
msgstr "Échec de lanalyse du fichier importé"
#: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed."
msgstr "Le fichier sélectionné nest pas accessible."
#: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Exporter les émissions vers…"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "_Exporter"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "A_nnuler"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "Abonnements GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Échec de lexportation des podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Client de podcast pour le bureau GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "En apprendre plus sur GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Alexandre Franke\n"
"Thibault Martin"
#: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action."
msgstr "Le lecteur na pas pu réaliser laction."
#: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened"
msgstr "Marquer tous les épisodes comme écoutés"
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}"
msgstr "Se désabonner de {}"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Préférences"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Vous êtes déjà abonné à ce flux !"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Préférences"
#~ msgid "Preferences"
#~ msgstr "Préférences"
#~ msgid "Appearance"
#~ msgstr "Apparence"
#~ msgid "Dark Theme"
#~ msgstr "Thème sombre"
#~ msgid "Delete played episodes"
#~ msgstr "Supprimer les épisodes lus"
#~ msgid "After"
#~ msgstr "Après"
#~ msgid "Invalid URL"
#~ msgstr "URL non valide"
#~ msgid "Seconds"
#~ msgstr "Secondes"
#~ msgid "Minutes"
#~ msgstr "Minutes"
#~ msgid "Hours"
#~ msgstr "Heures"
#~ msgid "Days"
#~ msgstr "Jours"
#~ msgid "Weeks"
#~ msgstr "Semaines"

View File

@ -1,420 +0,0 @@
# Friulian translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Fabio Tomat <f.t.public@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-12-08 20:03+0000\n"
"PO-Revision-Date: 2020-01-21 11:00+0100\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.4\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posizion superiôr dal ultin barcon principâl viert"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posizion de çampe dal ultin barcon principâl viert"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Altece dal ultin barcon principâl viert"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Largjece dal ultin barcon principâl viert"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Stât slargjât dal ultin barcon principâl viert"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Abilite o disabilite il teme scûr"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Indiche se inzornâ in maniere periodiche il contignût"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Trops periodis di timp di spietâ tra i inzornaments automatics"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Ce periodi di timp di spietâ tra i inzornaments automatics"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Indiche se inzornâ il contignût dopo dal inviament"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Trops periodis di timp di spietâ tra lis netisiis automatichis"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Ce periodi di timp di spietâ tra lis netisiis automatichis"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Scolte i tiei podcast preferîts, daurman dal to scritori."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;Regjistrazion;Trasmission;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplicazion podcast par GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Chest spetacul nol à ancjemò episodis"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Se tu pensis che chest al sedi un erôr, considere di scrivi une segnalazion "
"di erôr."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Oten cualchi spetacul"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Zonte gnûfs spetacui vie URL di feed"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Impuarte i spetacui di un altri dispositîf"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Tu âs za scoltât chest episodi."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Calcul de dimension dal episodi…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Viôt chest episodi"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Anule il procès di discjariament"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Discjarie chest episodi"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Controle par gnûfs episodis"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Impuarte spetacui"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Espuarte spetacui"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Scurtis tastiere"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Informazions su Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Zonte un gnûf feed"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Inserìs la direzion dal feed di zontâ"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Zonte"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Titul dal spetacul"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Indaûr"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Gjenerâl"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Controle se a son gnûfs episodis"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Jes de aplicazion"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Vuê"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Îr"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Cheste setemane"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Chest mês"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Plui vecjo"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Une notifiche di aplicazion in-app"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Disfe"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Torne indaûr di 10 seconts"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Riprodûs"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Va indenant di 10 minûts"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Cambie la velocitât di riproduzion"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "rapuart di velocitât 1.5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "rapuart di velocitât 1.25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Velocitât normâl"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Segne ducj i episodis come viodûts"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Sît _web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Anule sotscrizion"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Vierç sît web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Segne dut come viodût"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Anule sotscrizion"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lei di plui"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Daûr a recuperâ i gnûfs episodis"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Gnûf"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Spetacui"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Selezione il file che di chei si desidere impuartâ i spetacui."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Impuarte"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "File OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "No si è rivâts a analizâ il file impuartât"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Il file selezionât nol pues jessi doprât."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "_Espuarte spetacui su…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Espuarte"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Anule"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Sotscrizions di GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "No si è rivâts a espuartâ i podcast"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Client podcast pal scritori GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Plui informazions su GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Fabio Tomat <f.t.public@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:539
msgid "The media player was unable to execute an action."
msgstr "Il riprodutôr multimediâl nol è stât bon di eseguî une azion."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Segnât ducj i episodis come scoltâts"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Sotscrizion anulade di {}"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Preferencis"
#~ msgid "_About"
#~ msgstr "_Informazions"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Tu sês za sotscrit a chest feed!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Preferencis"
#~ msgid "Preferences"
#~ msgstr "Preferencis"
#~ msgid "Appearance"
#~ msgstr "Aspiet"
#~ msgid "Dark Theme"
#~ msgstr "Teme scûr"
#~ msgid "Delete played episodes"
#~ msgstr "Elimine i episodis viodûts"
#~ msgid "After"
#~ msgstr "Dopo"
#~ msgid "Invalid URL"
#~ msgstr "URL no valit"
#~ msgid "Seconds"
#~ msgstr "Seconts"
#~ msgid "Minutes"
#~ msgstr "Minûts"
#~ msgid "Hours"
#~ msgstr "Oris"
#~ msgid "Days"
#~ msgstr "Diis"
#~ msgid "Weeks"
#~ msgstr "Setemanis"

View File

@ -1,407 +0,0 @@
# Spanish translations for gnome-podcasts package.
# Copyright (C) 2018 THE gnome-podcasts'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-podcasts package.
# Automatically generated, 2018.
# Fran Dieguez <frandieguez@gnome.org>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: gnome-podcasts\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-22 06:50+0300\n"
"PO-Revision-Date: 2018-08-30 10:39+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.7.1\n"
"X-Project-Style: gnome\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posición superior da última xanela aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posición esquerda da última xanela aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Alto da última xanela aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Anchura da última xanela aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Estado de maximizado da última xanela aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Activar o desactivar el tema oscuro"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Se refrescar o contido periodicamente"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Cantos periodos de tempo a esperar entre refrescos automáticos"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Qué periodo de tempo hai que esperar entre refrescos automáticos"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Se refrescar o contido ao iniciar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Cantos periodos de tempo hai que esperar entre limpados automáticos"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Cantos periodos de tiempo hai que esperar entre limpiados automáticos"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml:4
#: podcasts-gtk/src/app.rs:92 podcasts-gtk/src/app.rs:406
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr ""
"Escoita os teus podcasts favoritos, directamente desde o teu escritorio."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop:6
msgid "org.gnome.Podcasts"
msgstr "org.gnome.Podcasts"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml:8
msgid "Podcast app for GNOME"
msgstr "Aplicativo de Podcast para GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml:31
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Este programa aínda non ten episodios"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Se cres que isto é un erro, por favor, considera abrir un informe de erro."
#: podcasts-gtk/resources/gtk/empty_view.ui:107
msgid "Get some shows"
msgstr "Obter algúns programas"
#: podcasts-gtk/resources/gtk/empty_view.ui:144
msgid "Add new shows via feed URL"
msgstr "Engadir novo programa a través do URL da canle"
#: podcasts-gtk/resources/gtk/empty_view.ui:173
msgid "Import shows from another device"
msgstr "Importar programas desde outro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:177
msgid "Calculating episode size…"
msgstr "Calculando tamaño do episodio…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:212
msgid "Cancel"
msgstr "Cancelar"
#: podcasts-gtk/resources/gtk/episode_widget.ui:230
msgid "Download this episode"
msgstr "Descargar este episodio"
#: podcasts-gtk/resources/gtk/episode_widget.ui:254
msgid "Play this episode"
msgstr "Reproducir este episodio"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Comprobar se hai novos episodios"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importar programas"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Preferencias"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "Atallos de _teclado"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "_Sobre"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Engadir unha nova canle"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Escriba o enderezo da canle a engadir"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Engadir"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Xa estás suscrito a esta canle!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Título do Programa"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Atrás"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Xeral"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Comprobar se hai novos episodios"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Preferencias"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Saír do aplicativo"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Hoxe"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Onte"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Esta semana"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Este mes"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Antigo"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Unha notificación de acción en aplicativo"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Desfacer"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Atrás 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Reproducir"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Adiante 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Cambiar velocidade de reprodución"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "velocidade 1.5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "velocidade 1.25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Velocidade normal"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Preferencias"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Aspecto"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Tema escuro"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Eliminar episodios reproducidos"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Despois"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Marcar todos os episodios como reproducidos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Páxina _Web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Cancelar subscrición"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Abrir sitio web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Marcar todo como reproducido"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Cancelar subscrición"
#: podcasts-gtk/src/app.rs:331
msgid "Fetching new episodes"
msgstr "Obtendo novos episodios"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "Xa estás subscrito a este programa"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "URL non válida"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Segundos"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minutos"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Horas"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Días"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Semanas"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "Novo"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "Programas"
#: podcasts-gtk/src/utils.rs:350
msgid "Select the file from which to you want to import shows."
msgstr "Seleccione o fichero desde o cal queres importar programas."
#: podcasts-gtk/src/utils.rs:353
msgid "_Import"
msgstr "_Importar"
#: podcasts-gtk/src/utils.rs:362
msgid "OPML file"
msgstr "Fichero OPML"
#: podcasts-gtk/src/utils.rs:379
msgid "Failed to parse the imported file"
msgstr "Produciuse un fallo ao leer o fichero importado"
#: podcasts-gtk/src/utils.rs:384
msgid "Selected file could not be accessed."
msgstr "O fichero seleccionado non é accesíbel."
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "Aplicativo de Podcast para o ambiente GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:35
msgid "Learn more about GNOME Podcasts"
msgstr "Saber máis sobre Podcasts de GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:40
msgid "translator-credits"
msgstr "Fran Dieguez <frandieguez@gnome.org>, 2018"
#: podcasts-gtk/src/widgets/episode.rs:129
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "O reprodutor non puido reproducir unha acción."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "Marcar todos os episodios como escoitados"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "Subscrición cancelada para {}"

View File

@ -1,432 +0,0 @@
# Croatian translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-03-15 15:53+0100\n"
"Last-Translator: gogo <linux.hr@protonmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.0.6\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Gornji položaj posljednjeg otvorenog prozora"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Lijevi položaj posljednjeg otvorenog prozora"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Visina posljednjeg otvorenog prozora"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Širina posljednjeg otvorenog prozora"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Stanje uvećanja posljednjeg otvorenog prozora"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Omogući ili onemogući tamnu temu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Treba li povremeno osvježiti sadržaj"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
"Koliko vremenskih razdoblja treba pričekati između automatskih osvježavanja"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr ""
"Koliko vremensko razdoblje treba pričekati između automatskih osvježavanja"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Treba li osvježiti sadržaj nakon pokretanja"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr ""
"Koliko vremenskih razdoblja treba pričekati između automatskih čišćenja"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Koliko vremensko razdoblje treba pričekati između automatskih čišćenja"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcasti"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Slušajte svoje omiljene podcaste."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast aplikacija za GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Ova emisjia još nema epizoda"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Ako mislite da je ovo greška, prijavite izvještaj greške."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Nabavite nove emisije"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Dodaj novu emisiju putem kanala ili URL-a"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Uvezi emisije iz drugog uređaja"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Već ste poslušali ovu epizodu."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Izračunavanje veličine emisjie…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Slušaj ovu epizodu"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Prekini preuzimanja"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Preuzmi ovu epizodu"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Provjeri ima li novih epizoda"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Uvezi emisije"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Izvezi emisije"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Prečaci tipkovnice"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_O Podcasti"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Dodaj novi kanal"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Upišite adresu kanala za dodavanje"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Dodaj"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Prikaži naslov"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Natrag"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Općenito"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Provjeri ima li novih epizoda"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Zatvori aplikaciju"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Danas"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Jučer"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Ovaj tjedan"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Ovaj mjesec"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Starije"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Obavijesti radnja iz aplikacije"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Vrati"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Trenutna reprodukcija"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Promijeni brzinu reprodukcije"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1.5 brže"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1.25 brže"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Normalna brzina"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Premotaj 10 sekundi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproduciraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pauziraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Brzo premotaj 10 sekundi"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Označi se epizode kao odslušane"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Web stranica"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Ukini pretplatu"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Otvori web stranicu"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Označi sve kao odslušano"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Ukini pretplatu"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Pročitaj više"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Preuzimanje novi epizoda"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Novo"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Emisije"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Odaberite datoteku iz koje želite uvesti emisije."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Uvoz"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML datoteka"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Neuspjela obrada uvezene datoteke"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Nemoguć pristup dabranoj datoteci."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "_Izvezi emisije u…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Uvoz"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Odustani"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcast pretplate"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Neuspjeli uvoz podcasta"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast klijent za GNOME radnu površinu."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Saznajte više o GNOME Podcasti"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Launchpad Contributions:\n"
" gogo https://launchpad.net/~trebelnik-stefina"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Medijski reproduktor nije uspio izvršiti radnju."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Označi sve epizodae kao odslušane"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Ukini pretplatu za {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Već ste pretplaćeni na ovu emisiju"
#~ msgid "Invalid URL"
#~ msgstr "Nevažeći URL"
#~ msgid "_Preferences"
#~ msgstr "_Osobitosti"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Već ste pretplaćeni na ovaj kanal!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Osobitosti"
#~ msgid "Preferences"
#~ msgstr "Osobitosti"
#~ msgid "Appearance"
#~ msgstr "Izgled"
#~ msgid "Dark Theme"
#~ msgstr "Tamna tema"
#~ msgid "Delete played episodes"
#~ msgstr "Obriši poslušane epizode"
#~ msgid "After"
#~ msgstr "Poslije"
#~ msgid "Seconds"
#~ msgstr "Sekunda"
#~ msgid "Minutes"
#~ msgstr "Minuta"
#~ msgid "Hours"
#~ msgstr "Sata"
#~ msgid "Days"
#~ msgstr "Dana"
#~ msgid "Weeks"
#~ msgstr "Tjedana"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_About"
#~ msgstr "_O programu"

View File

@ -1,375 +0,0 @@
# Hungarian translation for podcasts.
# Copyright (C) 2018, 2019, 2020 Free Software Foundation, Inc.
# This file is distributed under the same license as the podcasts package.
#
# Meskó Balázs <mesko.balazs at fsf dot hu>, 2018.
# Balázs Úr <ur.balazs at fsf dot hu>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-17 23:31+0100\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 19.04.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "A legutóbbi nyitott főablak fenti pozíciója"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "A legutóbbi nyitott főablak bal oldali pozíciója"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "A legutóbbi nyitott főablak magassága"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "A legutóbbi nyitott főablak szélessége"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "A legutóbbi nyitott főablak maximalizálási állapota"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Sötét téma engedélyezése vagy letiltása"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Időközönként frissüljön-e a tartalom"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Mennyi időközt várjon az automatikus frissítések között"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Milyen időközöket várjon az automatikus frissítések között"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Indításkor frissüljön-e a tartalom"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Mennyi időközt várjon az automatikus tisztítások között"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Milyen időközöket várjon az automatikus tisztítások között"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcastok"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Hallgassa kedvenc podcastjait, közvetlenül az asztalán."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast alkalmazás a GNOME-hoz"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Ennek a műsornak még nincsenek epizódjai"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Ha úgy gondolja hogy ez hiba, akkor írjon egy hibajelentést."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Szerezzen be néhány műsort"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Új műsorok hozzáadása csatorna URL-ből"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Műsorok importálása egy másik eszközről"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Már meghallgatta ezt az epizódot."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Epizódméret kiszámítása…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Ezen epizód lejátszása"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "A letöltési folyamat megszakítása"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Ezen epizód letöltése"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Új epizódok _keresése"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Műsorok _importálása"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "Műsorok _exportálása"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Gyorsbille_ntyűk"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "A Podcastok _névjegye"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Új csatorna hozzáadása"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Adja meg a hozzáadandó csatorna címét"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Hozzáadás"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Műsor címe"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Vissza"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Általános"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Új epizódok keresése"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Kilépés az alkalmazásból"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Ma"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Tegnap"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Ezen a héten"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Ebben a hónapban"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Régebbi"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Alkalmazáson belüli műveletértesítések"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Visszavonás"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Most játssza"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Lejátszási sebesség módosítása"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1,5-szeres sebesség"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1,25-szörös sebesség"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Normál sebesség"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Visszatekerés 10 másodperccel"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Lejátszás"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Szünet"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Előretekerés 10 másodperccel"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Összes epizód meg_jelölése lejátszottként"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Webhely"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Leiratkozás"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Webhely megnyitása"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Összes megjelölése lejátszottként"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Leiratkozás"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Olvassa tovább"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Új epizódok lekérése"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Új"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Műsorok"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Válasszon egy fájlt, amelyből műsorokat akar importálni."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importálás"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML fájl"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Az importált fájl feldolgozása meghiúsult"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "A kiválasztott fájlok nem érhetőek el."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Műsorok exportálása ide…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Exportálás"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Mégse"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcastok feliratkozások"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "A podcastok exportálása meghiúsult"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcast-kliens a GNOME asztali környezethez."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "További tudnivalók a GNOME Podcastokról"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Meskó Balázs <mesko dot balazs at fsf dot hu>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} perc"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "A médialejátszó nem tudott végrehajtani egy műveletet."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Összes epizód megjelölve meghallgatottként"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Leiratkozott innen: {}"

View File

@ -1,427 +0,0 @@
# Indonesian translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018-2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-13 19:33+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posisi atas dari jendela utama terbuka terakhir"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posisi kiri dari jendela utama terbuka terakhir"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Tinggi dari jendela utama terbuka terakhir"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Lebar dari jendela utama terbuka terakhir"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Keadaan dimaksimalkan dari jendela utama terbuka terakhir"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Aktifkan atau nonaktifkan tema gelap"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Apakah akan menyegarkan konten secara berkala"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Berapa banyak periode waktu untuk menunggu antara penyegaran otomatis"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Berapa lama waktu untuk menunggu antara penyegaran otomatis"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Apakah akan menyegarkan konten setelah awal mula"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Berapa lama waktu menunggu antara pembersihan otomatis"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Berapa lama waktu untuk menunggu di antara pembersihan otomatis"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcast"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Dengarkan podcast favorit Anda, langsung dari destop Anda."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplikasi Podcast untuk GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Acara ini belum memiliki episode"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Jika Anda pikir ini adalah kesalahan, silakan mempertimbangkan untuk menulis "
"laporan kutu."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Dapatkan beberapa acara"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Tambahkan acara baru melalui URL feed"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Impor acara dari perangkat lain"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Anda sudah mendengarkan episode ini."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Menghitung ukuran episode…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Putar episode ini"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Batalkan proses pengunduhan"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Unduh episode ini"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Periksa Episode _Baru"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Impor Acara"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Ekspor Acara"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Pintasan Papan _Ketik"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "Tent_ang Podcast"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Tambahkan feed baru"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Masukkan alamat feed untuk ditambahkan"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Tambah"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Tampilkan Judul"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Kembali"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Umum"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Periksa episode baru"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Keluar dari aplikasi"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Hari ini"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Kemarin"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Minggu Ini"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Bulan ini"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Lebih lama"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Notifikasi aksi dalam aplikasi"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Tak Jadi"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Sedang Diputar"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Ubah kecepatan pemutaran"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "Ubah kecepatan pemutaran"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "tingkat kecepatan 1.5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "tingkat kecepatan 1.25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Kecepatan normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Putar mundur 10 detik"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Putar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Jeda"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Maju cepat 10 detik"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Tandai Se_mua Episode sebagai Sudah Diputar"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Situs _Web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Berhenti Berlangganan"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Buka Situs Web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Tandai Semua sebagai Sudah Diputar"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Berhenti Berlangganan"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Baca Lebih Lanjut"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Mengambil episode baru"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Baru"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Acara"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Pilih berkas dari mana Anda ingin mengimpor acara."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Impor"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "Berkas OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Gagal mengurai berkas yang diimpor"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Berkas yang dipilih tidak dapat diakses."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Ekspor acara ke…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Ekspor"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Batal"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Berlangganan GNOME Podcast"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Gagal mengekspor podcast"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Klien Podcast untuk Destop GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Pelajari lebih lanjut tentang GNOME Podcast"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018-2020."
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} mnt"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Pemutar media tidak dapat melakukan aksi."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Tandai semua episode sebagai sudah didengarkan"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Berhenti berlangganan dari {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Anda sudah berlangganan ke acara ini"
#~ msgid "Invalid URL"
#~ msgstr "URL tak valid"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Preferensi"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Anda sudah berlangganan feed itu!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Preferensi"
#~ msgid "Preferences"
#~ msgstr "Preferensi"
#~ msgid "Appearance"
#~ msgstr "Penampilan"
#~ msgid "Dark Theme"
#~ msgstr "Tema Gelap"
#~ msgid "Delete played episodes"
#~ msgstr "Hapus episode yang diputar"
#~ msgid "After"
#~ msgstr "Sesudah"
#~ msgid "Seconds"
#~ msgstr "Detik"
#~ msgid "Minutes"
#~ msgstr "Menit"
#~ msgid "Hours"
#~ msgstr "Jam"
#~ msgid "Days"
#~ msgstr "Hari"
#~ msgid "Weeks"
#~ msgstr "Minggu"
#~ msgid "_About"
#~ msgstr "Tent_ang"

View File

@ -1,374 +0,0 @@
# Italian translation for podcasts.
# Copyright (C) 2018, 2019, 2020 podcasts's Free Software Foundation, Inc.
# This file is distributed under the same license as the podcasts package.
# Milo Casagrande <milo@milo.name>, 2018, 2019, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-03-06 09:41+0100\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italian <gnome-it-list@gnome.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.4\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posizione superiore dell'ultima finestra principale aperta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posizione sinistra dell'ultima finestra principale aperta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Altezza dell'ultima finestra principale aperta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Larghezza dell'ultima finestra principale aperta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Stato di massimizzazione dell'ultima finestra principale aperta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Abilita/Disabilita il tema scuro"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Indica se aggiornare i contenuti periodicamente"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Quanto tempo aspettare tra gli aggiornamenti automatici"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Che periodo di tempo aspettare tra gli aggiornamenti automatici"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Indica se aggiornare i contenuti dopo l'avvio"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Quanto tempo aspettare tra la pulizia automatica"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Che periodi di tempo aspettare tra la pulizia automatica"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcast"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Ascoltare i propri podcast preferiti, direttamente proprio computer."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Applicazione per podcast per GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Questo show non ha ancora episodi"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Se considerate questo evento un errore, inviare una segnalazione."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Ottieni show"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Aggiungi nuovi show via URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importa show da un altro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Questo episodio è già stato ascoltato."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Calcolo dimensione episodio…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Riproduci questo episodio"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Annulla lo scaricamento"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Scarica questo episodio"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Controlla per _nuovi episodi"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importa show"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Esporta show"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Scorciatoie da tastiera"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "I_nformazioni su Podcast"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Aggiungi nuovo feed"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Inserire un indirizzo da aggiungere"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Aggiungi"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Titolo show"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Indietro"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Generale"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Controlla presenza nuovi episodi"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Esce dall'applicazione"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Oggi"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Ieri"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Questa settimana"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Questo mese"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Più vecchi"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Una notifica"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Annulla"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "In riproduzione"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Modifica la velocità di riproduzione"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1,5 volte la velocità"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1,25 volte la velocità"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Velocità normale"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Indietro 10 secondi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Riproduci"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Avanti veloce 10 secondi"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Segna tutti gli episodi come ascoltati"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Sito _web"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Annulla abbonamento"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Apri sito web"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Segna tutti ascoltati"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Annulla abbonamento"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leggi altro"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Scaricamento nuovi episodi"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nuovo"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Show"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Selezionare il file da cui importare gli show."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importa"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "File OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Analisi del file importato non riuscita"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Impossibile accedere al file selezionato."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Esporta show su…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Esporta"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "A_nnulla"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Abbonamenti Podcast GNOME"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Esportazioni podcast non riuscita"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Client podcast per l'ambiente grafico GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Maggiori informazioni su Podcast GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Milo Casagrande <milo@milo.name>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Il riproduttore multimediale non può eseguire un'azione."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Episodi segnati come letti"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Abbonamento a {} annullato"

View File

@ -1,405 +0,0 @@
# Korean translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Seong-ho Cho <shcho@gnome.org>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-08-30 10:43+0000\n"
"PO-Revision-Date: 2018-08-30 21:26+0900\n"
"Language-Team: Korean <gnome-kr@googlegroups.com>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Last-Translator: Seong-ho Cho <shcho@gnome.org>\n"
"X-Generator: Poedit 2.0.6\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "최근 연 메인 창 상단 위치"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "최근 연 메인 창 좌측 위치"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "최근 연 메인 창 높이"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "최근 연 메인 창 너비"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "최근 연 메인 창 최대화 상태"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "어두움 테마 사용 함/안함"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "주기적으로 내용 새로 고침 여부"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "자동 새로 고침 기다림 주기 시간 간격"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "자동 새로 고침 기다림 주기 시간"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "시작 후 내용 새로 고침 여부"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "자동 정리 기다림 주기 시간 간격"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "자동 정리 기다림 주기 시간"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "팟캐스트"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "데스크톱에서 바로 원하는 팟캐스트를 듣습니다."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;팟캐스트;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "그놈용 팟캐스트 앱"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:31
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "아직 보여줄 에피소드가 없습니다"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "오류인 것 같다면 오류 보고서 작성을 고려하십시오."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "일부 쇼 가져오기"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "피드 URL 주소로 새 쇼 추가"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "다른 장치에서 쇼 가져오기"
#: podcasts-gtk/resources/gtk/episode_widget.ui:177
msgid "Calculating episode size…"
msgstr "에피소드 용량 계산 중…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:212
msgid "Cancel"
msgstr "취소"
#: podcasts-gtk/resources/gtk/episode_widget.ui:230
msgid "Download this episode"
msgstr "이 에피소드 다운로드"
#: podcasts-gtk/resources/gtk/episode_widget.ui:254
msgid "Play this episode"
msgstr "이 에피소드 재생"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "새 에피소드 확인(_C)"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "쇼 가져오기(_I)"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "기본 설정(_P)"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "키보드 바로 가기 키(_K)"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "정보(_A)"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "새 피드 추가"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "추가할 피드 주소를 입력하십시오"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "추가"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "해당 피드에 이미 가입했습니다!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "제목 표시"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "뒤로"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "일반"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "새 에피소드 확인"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "기본 설정"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "프로그램 끝내기"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "오늘"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "어제"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "금주"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "이번 달"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "이전"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "앱 동작 알림"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "실행 취소"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "10초 되감기"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "재생"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "일시 정지"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "10초 빨리감기"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "재생 속도 조절"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1.5배 속도"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1.25배 속도"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "일반 속도"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "기본 설정"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "모양새"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "어두움 테마"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "재생한 에피소드 삭제"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "다음"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "모든 에피소드를 재생 상태로 표시(_M)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "웹사이트(_W)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "가입 취소(_U)"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "웹사이트 열기"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "모두 재생한 항목으로 표시"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "가입 취소"
#: podcasts-gtk/src/app.rs:332
msgid "Fetching new episodes"
msgstr "새 에피소드 가져오는 중"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "이미 이 쇼에 가입했습니다"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "잘못된 URL 주소"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "초"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "분"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "시간"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "일"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "주"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "새 항목"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "쇼"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "가져올 쇼의 파일을 선택하십시오."
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "가져오기(_I)"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "OPML 파일"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "가져온 파일 해석에 실패했습니다"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "선택한 파일에 접근할 수 없습니다."
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "그놈 데스크톱용 팟캐스트 클라이언트."
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "그놈 팟캐스트에 대해 더 알아보세요"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "조성호 <shcho@gnome.org>, 2018."
#: podcasts-gtk/src/widgets/episode.rs:129
msgid "{} min"
msgstr "{}분"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "미디어 재생기에서 이 동작을 수행할 수 없습니다."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "모든 에피소드를 감청 상태로 표시했습니다"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "{}에서 가입 취소했습니다"

View File

@ -1,407 +0,0 @@
# Latvian translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
#
# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-09-10 07:51+0000\n"
"PO-Revision-Date: 2018-09-10 20:15+0200\n"
"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
"Language: lv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :"
" 2);\n"
"X-Generator: Lokalize 2.0\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Augšējais novietojums pēdējam atvērtajam galvenajam logam"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Kreisais novietojums pēdējam atvērtajam galvenajam logam"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Pēdējā atvērtā galvenā loga augstums"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Pēdējā atvērtā galvenā loga platums"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Pēdējā atvērtā galvenā loga maksimizēšanas stāvoklis"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Ieslēgt vai izslēgt tumšo motīvu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Vai ik pa laikam atsvaidzināt saturu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Cik laika periodus gaidīt starp automātisko atsvaidzināšanu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Cik ilgi gaidīt starp automātisko atsvaidzināšanu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Vai atsvaidzināt saturu pēc palaišanas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Cik laika periodus gaidīt starp automātisko uzkopšanu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Cik ilgi gaidīt starp automātisko uzkopšanu"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "Podraides"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Klausieties savas iecienītās podraides savā darbvirsmā."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Aplāde;Podraide;Podkāsts;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podraižu lietotne GNOME videi"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Šim raidījumam vēl nav epizožu"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Ja domājat, ka šī ir kļūda, apsveriet sūtīt kļūdas ziņojumu."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Tikt pie dažiem raidījumiem"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Pievienojiet jaunus raidījumus ar plūsmu URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importēt raidījumus no citas ierīces"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180
msgid "Calculating episode size…"
msgstr "Aprēķina epizodes izmēru…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220
msgid "Play this episode"
msgstr "Atskaņot šo epizodi"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241
msgid "Cancel the download proccess"
msgstr "Atcelt lejupielādēšanu"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264
msgid "Download this episode"
msgstr "Lejupielādēt šo epizodi"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Pārbaudīt jau_nos raidījumus"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importēt raidījumus"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Iestatījumi"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "_Tastatūras īsinājumtaustiņi"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "P_ar"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Pievienot jaunu plūsmu"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Ievadiet pievienojamās plūsmas adresi"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Pievienot"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Jūs jau esat abonējis šo plūsmu!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Rādīt virsrakstu"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Atpakaļ"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Vispārīgi"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Pārbaudīt jaunos raidījumus"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Iestatījumi"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Iziet no lietotnes"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Šodien"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Vakar"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Šonedēļ"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Šomēnes"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Vecākas"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Paziņojumi lietotnē"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Atsaukt"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Attīt 10 sekundes"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Atskaņot"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pauzēt"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Patīt uz priekšu 10 sekundes"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Mainīt atskaņošanas ātrumu"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1,5 ātrums"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1,25 ātrums"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Normāls ātrums"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Iestatījumi"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Izskats"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Tumšais motīvs"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Dzēst atskaņotās epizodes"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Pēc"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Atzī_mēt visas epizodes kā atskaņotas"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Tīmekļa vietne"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "An_ulēt abonementu"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Atvērt tīmekļa vietni"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Atzīmēt visu kā atskaņotu"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Anulēt abonementu"
#: podcasts-gtk/src/app.rs:332
msgid "Fetching new episodes"
msgstr "Saņem jaunas epizodes"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "Jūs jau esat abonējis šo raidījumu"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "Nederīgs URL"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Sekundes"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minūtes"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Stundas"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Dienas"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Nedēļas"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "Jauns"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "Raidījumi"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "Izvēlieties datni, no kuras vēlaties importēt raidījumus."
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "_Importēt"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "OPML datne"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "Neizdevās parsēt importēto datni"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "Nevarēja piekļūt izvēlētajai datnei."
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podraižu klients GNOME darbvirsmai."
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "Uzziniet vairāk par GNOME podraidēm"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:130
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "Mediju atskaņotājs nevarēja izpildīt darbību."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "Visas epizodes ir atzīmētas kā noklausītas"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "Anulēt abonementu"

View File

@ -1,4 +0,0 @@
i18n.gettext(meson.project_name(),
args: ['--keyword=i18n', '--keyword=i18n_f', '--keyword=i18n_k',
'--keyword=ni18n:1,2', '--keyword=ni18n_f:1,2', '--keyword=ni18n_k:1,2'],
preset: 'glib')

View File

@ -1,423 +0,0 @@
# Dutch translation for podcasts.
# Copyright (C) 2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Nathan Follens <nthn@unseen.is>, 2019-2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-26 14:31+0100\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Toppositie van laatst geopend hoofdvenster"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Linkerpositie van laatst geopend hoofdvenster"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Hoogte van laatst geopend hoofdvenster"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Breedte van laatst geopend hoofdvenster"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Gemaximaliseerde status van laatst geopend hoofdvenster"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Donker thema in- of uitschakelen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Of inhoud automatisch vernieuwd moet worden"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Hoeveel tijd te wachten tussen automatisch vernieuwen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Hoe lang te wachten tussen automatisch vernieuwen"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Of inhoud vernieuwd moet worden na opstarten"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Hoeveel tijd te wachten tussen automatische opruimbeurten"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Hoe lang te wachten tussen automatische opruimbeurten"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Luister naar uw favoriete podcasts, rechtstreeks vanop uw bureaublad."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Podcast-toepassing voor Gnome"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Deze show heeft nog geen afleveringen"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Als u denkt dat dit een fout is, overweeg dan een foutmelding in te dienen."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Haal enkele shows op"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Nieuwe shows toevoegen via feed-URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Shows importeren van een ander apparaat"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "U heeft deze aflevering reeds beluisterd."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Grootte van aflevering berekenen…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Deze aflevering afspelen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Downloadproces annuleren"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Deze aflevering downloaden"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Controleren op nieuwe afleveringen"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Shows _importeren"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "Shows _exporteren"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Sneltoetsen"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Over Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Nieuwe feed toevoegen"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Voer het toe te voegen feedadres in"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Toevoegen"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Titel tonen"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Terug"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Algemeen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Controleren op nieuwe afleveringen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "De toepassing afsluiten"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Vandaag"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Gisteren"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Deze week"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Deze maand"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Ouder"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Een in-app-actiemelding"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Ongedaan maken"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "U luistert naar"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "De afspeelsnelheid wijzigen"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1,5 snelheid"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1,25 snelheid"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Normale snelheid"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "10 seconden terugspoelen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Afspelen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pauzeren"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "10 seconden doorspoelen"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Alle afleveringen _markeren als afgespeeld"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Website"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Opzeggen"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Website openen"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Alles markeren als afgespeeld"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Opzeggen"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lees meer"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Nieuwe afleveringen worden opgehaald"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nieuw"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Shows"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Selecteer het bestand waaruit u shows wilt importeren."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importeren"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML-bestand"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Verwerken van geïmporteerd bestand mislukt"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Kon geen toegang verkrijgen tot geselecteerd bestand."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Shows exporteren naar…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Exporteren"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Annuleren"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Gnome Podcasts-abonnementen"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Exporteren van podcasts mislukt"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Podcastcliënt voor het Gnome-bureaublad."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Kom meer te weten over Gnome Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Nathan Follens <nthn@unseen.is>\n"
"\n"
"Meer info over Gnome-NL http://nl.gnome.org/"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "De mediaspeler kon een handeling niet uitvoeren."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Alle afleveringen markeren als beluisterd"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Abonnement op {} opgezegd"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Voorkeuren"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "U bent reeds geabonneerd op die feed!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Voorkeuren"
#~ msgid "Preferences"
#~ msgstr "Voorkeuren"
#~ msgid "Appearance"
#~ msgstr "Uiterlijk"
#~ msgid "Dark Theme"
#~ msgstr "Donker thema"
#~ msgid "Delete played episodes"
#~ msgstr "Afgespeelde afleveringen verwijderen"
#~ msgid "After"
#~ msgstr "Na"
#~ msgid "Invalid URL"
#~ msgstr "Ongeldige URL"
#~ msgid "Seconds"
#~ msgstr "Seconden"
#~ msgid "Minutes"
#~ msgstr "Minuten"
#~ msgid "Hours"
#~ msgstr "Uur"
#~ msgid "Days"
#~ msgstr "Dagen"
#~ msgid "Weeks"
#~ msgstr "Weken"

View File

@ -1,377 +0,0 @@
# Polish translation for podcasts.
# Copyright © 2018-2020 the podcasts authors.
# This file is distributed under the same license as the podcasts package.
# Piotr Drąg <piotrdrag@gmail.com>, 2018-2020.
# Aviary.pl <community-poland@mozilla.org>, 2018-2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-09 12:19+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Górne położenie ostatnio otwartego głównego okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Lewe położenie ostatnio otwartego głównego okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Wysokość ostatnio otwartego głównego okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Szerokość ostatnio otwartego głównego okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Zmaksymalizowany stan ostatnio otwartego głównego okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Ciemny motyw"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Czy okresowo odświeżać treści"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Ile okresów czekać między automatycznym odświeżeniem"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Jaki okres czekać między automatycznym odświeżeniem"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Czy odświeżać treści po uruchomieniu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Ile okresów czekać między automatycznym czyszczeniem"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Jaki okres czekać między automatycznym czyszczeniem"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcasty"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Słuchanie ulubionych podcastów prosto z komputera."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;Podkasty;RSS;Atom;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplikacja do słuchania podcastów w GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Ten program nie ma jeszcze odcinków"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Jeśli to błąd, to prosimy go zgłosić."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Pobierz programy"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Dodaj nowe programy za pomocą adresu kanału"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Zaimportuj programy z innego urządzenia"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Ten odcinek został już odsłuchany"
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Obliczanie rozmiaru odcinka…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Odtwarza ten odcinek"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Anuluje pobieranie"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Pobiera ten odcinek"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Wyszukaj nowe odcinki"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "Zai_mportuj programy"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "Wy_eksportuj programy"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Skróty klawiszowe"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_O programie"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Dodaje nowy kanał"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Adres kanału do dodania"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Dodaj"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Tytuł programu"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Wstecz"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Ogólne"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Wyszukanie nowych odcinków"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Zakończenie działania programu"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Dzisiaj"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Wczoraj"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Ten tydzień"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Ten miesiąc"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Starsze"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Powiadomienie z działaniem w programie"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Cofnij"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Odtwarzanie"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Zmienia prędkość odtwarzania"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Prędkość 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Prędkość 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Zwykła prędkość"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Przewija wstecz o 10 sekund"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Odtwarza"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Wstrzymuje"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Przewija wprzód o 10 sekund"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Oznacz wszystkie odcinki jako odtworzone"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "Strona _WWW"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Zrezygnuj z subskrypcji"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Otwórz stronę WWW"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Oznacz wszystkie jako odtworzone"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Zrezygnuj z subskrypcji"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Czytaj dalej"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Pobieranie nowych odcinków"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nowe"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Programy"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Proszę wybrać plik, z którego zaimportować programy."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "Zai_mportuj"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "Plik OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Przetworzenie zaimportowanego pliku się nie powiodło"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Nie można uzyskać dostępu do wybranego pliku."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Eksport programów do…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "Wy_eksportuj"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Anuluj"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Subskrypcje Podcastów GNOME"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Wyeksportowanie podcastów się nie powiodło"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Klient podcastów dla środowiska GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Więcej informacji o Podcastach GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Piotr Drąg <piotrdrag@gmail.com>, 2018-2020\n"
"Aviary.pl <community-poland@mozilla.org>, 2018-2020"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{}min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Odtwarzacz multimediów nie może wykonać działania."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Oznaczono wszystkie odcinki jako odsłuchane"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Zrezygnowano z subskrypcji „{}”"

View File

@ -1,432 +0,0 @@
# Brazilian Portuguese translation for podcasts.
# Copyright (C) 2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>, 2018, 2020.
# Rafael Fontenelle <rafaelff@gnome.org>, 2018-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 19:22+0000\n"
"PO-Revision-Date: 2020-02-07 15:18-0300\n"
"Last-Translator: Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Posição acima da janela da última principal aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Posição à esquerda da última janela principal aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Altura da última janela principal aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Largura da última janela principal aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Estado maximizado da última janela principal aberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Habilitar ou desabilitar o tema escuro"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Se deve atualizar periodicamente o conteúdo"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
"Quantos períodos de tempo deve esperar entre as atualizações automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Qual período de tempo deve esperar entre as atualizações automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Se deve atualizar o conteúdo após a inicialização"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Quantos períodos de tempo deve esperar entre limpezas automáticas"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Qual período de tempo deve esperar entre limpezas automáticas"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:329
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcasts"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Ouça seus podcasts favoritos diretamente da sua área de trabalho."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplicativo de podcast para o GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Este podcast ainda não tem episódios"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Se você acredita que isso é um erro, por favor considere preencher um "
"relatório de erro."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Obter alguns podcasts"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Adicionar novos podcasts via URL do feed"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importar podcasts de outro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Você já ouviu este episódio."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Calculando o tamanho do episódio…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Inicia este episódio"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Cancela o processo de download"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Faz download deste episódio"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Procurar novos episódios"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importar podcasts"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Exportar podcasts"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "Atal_hos de teclado"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Sobre Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Adiciona um novo feed"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Insira o endereço do feed para adicioná-lo"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Adicionar"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Mostrar título"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Voltar"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Geral"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Procura por novos episódios"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Sai do aplicativo"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Hoje"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Ontem"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Essa semana"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Esse mês"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Antigos"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Uma notificação de ação no aplicativo"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Desfazer"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Reproduzindo agora"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Altera a velocidade de reprodução"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Taxa de velocidade de 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Taxa de velocidade de 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Velocidade normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Retroceder 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproduz"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Adianta 10 segundos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Marcar todos os episódios como reproduzidos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Site"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "Se _desinscrever"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Abrir o site"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Marcar todos como reproduzidos"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Desinscrever"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leia mais"
#: podcasts-gtk/src/app.rs:264
msgid "Fetching new episodes"
msgstr "Buscando novos episódios"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Novo"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Podcasts"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Selecione o arquivo a partir do qual você deseja importar podcasts."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importar"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:455
msgid "OPML file"
msgstr "Arquivo OPML"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Falha ao analisar o arquivo importado"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:473
msgid "Selected file could not be accessed."
msgstr "O arquivo selecionado não pôde ser acessado."
#: podcasts-gtk/src/utils.rs:443
msgid "Export shows to…"
msgstr "Exportar podcasts para…"
#: podcasts-gtk/src/utils.rs:446
msgid "_Export"
msgstr "_Exportar"
#: podcasts-gtk/src/utils.rs:447
msgid "_Cancel"
msgstr "_Cancelar"
#: podcasts-gtk/src/utils.rs:467
msgid "GNOME Podcasts Subscriptions"
msgstr "Inscrições do GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:468
msgid "Failed to export podcasts"
msgstr "Falha ao exportar podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Cliente de podcast para o ambiente GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Aprenda mais sobre o GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Rafael Fontenelle <rafaelff@gnome.org>\n"
"Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:822
msgid "The media player was unable to execute an action."
msgstr "O reprodutor de mídia não conseguiu executar uma ação."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Marcados todos os episódios como ouvidos"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Desinscrito de {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Você já está inscrito neste podcast"
#~ msgid "Invalid URL"
#~ msgstr "URL inválida"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Preferências"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Você já está inscrito naquele feed!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Preferências"
#~ msgid "Preferences"
#~ msgstr "Preferências"
#~ msgid "Appearance"
#~ msgstr "Aparência"
#~ msgid "Dark Theme"
#~ msgstr "Tema escuro"
#~ msgid "Delete played episodes"
#~ msgstr "Excluir episódios já reproduzidos"
#~ msgid "After"
#~ msgstr "Após"
#~ msgid "Seconds"
#~ msgstr "Segundos"
#~ msgid "Minutes"
#~ msgstr "Minutos"
#~ msgid "Hours"
#~ msgstr "Horas"
#~ msgid "Days"
#~ msgstr "Dias"
#~ msgid "Weeks"
#~ msgstr "Semanas"
#~ msgid "_About"
#~ msgstr "_Sobre"

View File

@ -1,417 +0,0 @@
# Slovak translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Dušan Kazik <prescott66@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-10-28 15:31+0000\n"
"PO-Revision-Date: 2018-10-28 22:00+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
"X-Generator: Poedit 2.2\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Horná pozícia naposledy otvoreného hlavného okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Pozícia vľavo naposledy otvoreného hlavného okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Výška naposledy otvoreného hlavného okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Šírka naposledy otvoreného hlavného okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Maximalizovaný stav naposledy otvoreného hlavného okna"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Povoliť alebo zakázať tmavú tému"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Určuje, či sa má pravidelne obnovovať obsah"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Ako dlho sa má čakať medzi automatickými obnoveniami"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Aká je doba čakania medzi automatickými obnoveniami"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Určuje, či sa má obnoviť obsah po spustení"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Ako dlho sa má čakať medzi automatickými čisteniami"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Aká je doba čakania medzi automatickými čisteniami"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:92 podcasts-gtk/src/app.rs:416
#: podcasts-gtk/src/widgets/aboutdialog.rs:37
msgid "Podcasts"
msgstr "Podcasty"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Počúvajte vaše obľúbené podcasty priamo z vášho pracovného prostredia."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Aplikácia na správu podcastov pre prostredie GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:68
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Táto relácia zatiaľ nemá žiadne epizódy"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Ak si myslíte, že je to chyba, prosím, zvážte nahlásenie chyby."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Zaobstarajte si nejaké relácie"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Pridajte nové relácie prostredníctvom URL kanálu"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importujte relácie z iného zariadenia"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180
msgid "Calculating episode size…"
msgstr "Vypočítava sa veľkosť epizódy…"
# tooltip
#: podcasts-gtk/resources/gtk/episode_widget.ui:220
msgid "Play this episode"
msgstr "Prehrá túto epizódu"
# tooltip
#: podcasts-gtk/resources/gtk/episode_widget.ui:241
msgid "Cancel the download process"
msgstr "Zruší preberanie"
# tooltip
#: podcasts-gtk/resources/gtk/episode_widget.ui:264
msgid "Download this episode"
msgstr "Preberie túto epizódu"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Skontrolovať nové epizódy"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importovať relácie"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Nastavenia"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts"
msgstr "_Klávesové skratky"
#: podcasts-gtk/resources/gtk/hamburger.ui:35
msgid "_About Podcasts"
msgstr "_O aplikácii Podcasty"
# tooltip
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "Pridá nový kanál"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Zadajte adresu kanálu, ktorý sa má pridať"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Pridať"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "Už ste prihlásený na odber tohoto kanálu!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "Zobrazenie názvu"
# tooltip
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "Prejde späť"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Všeobecné"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Kontrola nových epizód"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "Nastavenia"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Ukončenie aplikácie"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Dnes"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Včera"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Tento týždeň"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Tento mesiac"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Staršie"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Oznámenie o činnosti v aplikácii"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Vrátiť späť"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "Previnie o 10 sekúnd dozadu"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "Prehrá"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pozastaví"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Previnie o 10 sekúnd dopredu"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "Zmení rýchlosť prehrávania"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1,50×"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1,5 násobná rýchlosť"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1,25 násobná rýchlosť"
# tooltip
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "Normálna rýchlosť"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Nastavenia"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Vzhľad"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Tmavá téma"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Odstránenie prehraných epizód"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Po"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Oz_načiť všetky epizódy ako prehrané"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Webová stránka"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "O_dhlásiť sa z odberu"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Otvoriť webovú stránku"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Označiť všetko ako prehrané"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Odhlásiť sa z odberu"
#: podcasts-gtk/src/app.rs:333
msgid "Fetching new episodes"
msgstr "Získavajú sa nové epizódy"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "Už ste prihlásený na odber tejto relácie"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "Neplatná URL"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Sekundách"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minútach"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Hodinách"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Dňoch"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Týždňoch"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "Nové"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "Relácie"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "Vyberte súbor, z ktorého chcete importovať relácie."
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "_Importovať"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "Súbor OPML"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "Zlyhala analýza importovaného súboru"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "Nedá sa získať prístup k vybranému súboru."
#: podcasts-gtk/src/widgets/aboutdialog.rs:32
msgid "Podcast Client for the GNOME Desktop."
msgstr "Klient pre podcasty prostredia GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:39
msgid "Learn more about GNOME Podcasts"
msgstr "Zistite viac o aplikácii Podcasty prostredia GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:44
msgid "translator-credits"
msgstr "Dušan Kazik <prescott66@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:130
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:365
msgid "The media player was unable to execute an action."
msgstr "Prehrávač médií nedokázal vykonať akciu."
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "Všetky epizódy boli označené ako vypočuté"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "Bol odhlásený odber z kanálu {}"

View File

@ -1,430 +0,0 @@
# Swedish translation for podcasts.
# Copyright © 2018-2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2018, 2019, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-13 22:38+0100\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.4\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Topposition för det senast öppna huvudfönstret"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Vänsterposition för det senast öppna huvudfönstret"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Höjden för det senast öppna huvudfönstret"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Bredden för det senast öppna huvudfönstret"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Maximeringstillstånd för det senast öppna huvudfönstret"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Aktivera eller inaktivera mörkt tema"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Huruvida innehåll ska uppdateras periodiskt"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Hur många tidsperioder att vänta mellan automatiska uppdateringar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Vilken sorts tidsperiod att vänta mellan automatiska uppdateringar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Huruvida innehåll ska uppdateras efter uppstart"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Hur många tidsperioder att vänta mellan automatiska upprensningar"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Vilken sorts tidsperiod att vänta mellan automatiska upprensningar"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Poddsändningar"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Lyssna på dina favoritpoddsändningar, direkt från ditt skrivbord."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Poddsändning;Podcast;RSS;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Poddsändningsprogram för GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Denna show har inga avsnitt ännu"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Överväg att skriva en felrapport om du tror att detta är ett fel."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Få tag på några shower"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Lägg till nya shower via flödes-URL"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Importera shower från en annan enhet"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Du har redan lyssnat på detta avsnitt."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Beräknar avsnittsstorlek…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Spela detta avsnitt"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Avbryt hämtningsprocessen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Hämta detta avsnitt"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Sö_k efter nya avsnitt"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Importera shower"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Exportera shower"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Tangentbordsgenvägar"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Om Poddsändningar"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Lägg till ett nytt flöde"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Ange flödesadress att lägga till"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Lägg till"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Visa titel"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Bakåt"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Allmänt"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Sök efter nya avsnitt"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Avsluta programmet"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Idag"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Igår"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Denna vecka"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Denna månad"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Äldre"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "En åtgärdsavisering i programmet"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Ångra"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Spelar nu"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Ändra uppspelningshastigheten"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Hastighetsfaktor 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Hastighetsfaktor 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Normal hastighet"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Spola tillbaka 10 sekunder"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Spela"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Spola framåt 10 sekunder"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "_Markera alla avsnitt som spelade"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Webbplats"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "Säg _upp prenumeration"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Öppna webbplats"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Markera alla som spelade"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Säg upp prenumeration"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Läs mer"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Hämtar nya avsnitt"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Nytt"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Shower"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Välj filen från vilken du vill importera shower."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_Importera"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML-fil"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "Misslyckades med att tolka den importerade filen"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Den markerade filen kunde inte kommas åt."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Exportera shower till…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Exportera"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "A_vbryt"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Poddsändningar-prenumerationer"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Misslyckades med att exportera poddsändningar"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Poddsändningsklient för GNOME-skrivbordet."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Lär dig mer om GNOME Poddsändningar"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"\n"
"Skicka synpunkter på översättningen till\n"
"<tp-sv@listor.tp-sv.se>."
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Mediaspelaren kunde inte utföra en åtgärd."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Markerade alla avsnitt som lyssnade"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "Sade upp prenumeration från {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Du prenumererar redan på denna show"
#~ msgid "Invalid URL"
#~ msgstr "Ogiltig URL"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "I_nställningar"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Du prenumererar redan på det flödet!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Inställningar"
#~ msgid "Preferences"
#~ msgstr "Inställningar"
#~ msgid "Appearance"
#~ msgstr "Utseende"
#~ msgid "Dark Theme"
#~ msgstr "Mörkt tema"
#~ msgid "Delete played episodes"
#~ msgstr "Ta bort spelade avsnitt"
#~ msgid "After"
#~ msgstr "Efter"
#~ msgid "Seconds"
#~ msgstr "Sekunder"
#~ msgid "Minutes"
#~ msgstr "Minuter"
#~ msgid "Hours"
#~ msgstr "Timmar"
#~ msgid "Days"
#~ msgstr "Dagar"
#~ msgid "Weeks"
#~ msgstr "Veckor"
#~ msgid "_About"
#~ msgstr "_Om"

View File

@ -1,436 +0,0 @@
# Turkish translation for podcasts.
# Copyright (C) 2018-2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
#
# Emin Tufan Çetin <etcetin@gmail.com>, 2018-2020.
# Sabri Ünal <libreajans@gmail.com>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2020-02-19 10:52+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.0.6\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "Son açılan ana pencerenin üst konumu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "Son açılan ana pencerenin sol konumu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Son açılan ana pencerenin yüksekliği"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Son açılan ana pencerenin genişliği"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Son açılan ana pencerenin büyütülme durumu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Karanlık gövdeyi etkinleştir veya devre dışı bırak"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Belirli aralıklarla içeriğin yenilenmesi"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "Kendiliğinden yenilemeler arasında kaç zaman aralığı beklenecek"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "Kendiliğinden yenilemeler arasında beklenecek zaman aralığı"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Başlangıçtan sonra içeriğin yenilenmesi"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "Kendiliğinden temizlemeler arasında kaç zaman aralığı beklenecek"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "Kendiliğinden temizlemeler arasında beklenecek zaman aralığı"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts"
msgstr "Podcastler"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Gözde podcastlerinizi masaüstünüzden dinleyin."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;Pod Yayını;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "GNOME için Podcast uygulaması"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "Bu gösterinin henüz herhangi bir bölümü yok"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "Bunun bir hata olduğunu düşünüyorsanız lütfen hata bildirimi yazın."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Birkaç gösteri edinin"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Besleme URLʼsi ile yeni gösteriler ekle"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Gösterileri başka aygıttan içe aktar"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Bu bölümü zaten dinlediniz."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Bölüm boyutu hesaplanıyor…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Bu bölümü oynat"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "İndirme sürecini iptal et"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Bu bölümü indir"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "Yeni Bölümleri _Denetle"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Gösterileri İçe Aktar"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Gösterileri Dışa Aktar"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Klavye Kısayolları"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "Podcastler _Hakkında"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Yeni besleme ekle"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Eklenecek besleme adresini gir"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Ekle"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Gösteri Başlığı"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Geri"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Genel"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Yeni bölümleri denetle"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Uygulamadan çık"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Bugün"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Dün"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Bu Hafta"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Bu Ay"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Daha Eski"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Uygulama içi eylem bildirimi"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Geri al"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Şimdi Oynatılıyor"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Kayıttan yürütme hızını değiştir"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "1.5 hız oranı"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "1.25 hız oranı"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Olağan hız"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "10 saniye geri sar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Oynat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Duraklat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "10 saniye ileri sar"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "Tüm Bölümleri Oynatıldı Olarak _İmle"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Web Sitesi"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Abonelikten Çık"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Web Sitesini Aç"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Tümünü Oynatıldı Olarak İmle"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Abonelikten Çık"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Daha Çoğunu Oku"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes"
msgstr "Yeni bölümler alınıyor"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Yeni"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Gösteriler"
#: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows."
msgstr "Gösterileri içe aktarmak istediğiniz dosyayı seçin."
#: podcasts-gtk/src/utils.rs:399
msgid "_Import"
msgstr "_İçe Aktar"
#: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file"
msgstr "OPML dosyası"
#: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file"
msgstr "İçe aktarılan dosya ayrıştırılamadı"
#: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed."
msgstr "Seçilen dosyaya erişilemedi."
#: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "Gösterileri dışa aktar…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Dışa Aktar"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_İptal"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcastler Abonelikleri"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "Podcastler dışa aktarılamadı"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "GNOME Masaüstü için Podcast İstemcisi."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "GNOME Podcastler hakkında daha çoğunu öğrenin"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr ""
"Emin Tufan Çetin <etcetin@gmail.com>\n"
"Sabri Ünal <libreajans@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min"
msgstr "{} dak"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action."
msgstr "Ortam oynatıcı eylemi yürütemiyor."
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened"
msgstr "Tüm bölümler dinlendi olarak imlendi"
#: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}"
msgstr "{} aboneliğinden çıkıldı"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Bu gösteriye zaten abonesiniz"
#~ msgid "Invalid URL"
#~ msgstr "Geçersiz URL"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Tercihler"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Bu beslemeye zaten abonesiniz!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Tercihler"
#~ msgid "Preferences"
#~ msgstr "Tercihler"
#~ msgid "Appearance"
#~ msgstr "Görünüm"
#~ msgid "Dark Theme"
#~ msgstr "Karanlık Gövde"
#~ msgid "Delete played episodes"
#~ msgstr "Oynatılan bölümleri sil"
#~ msgid "After"
#~ msgstr "Şundan Sonra"
#~ msgid "Seconds"
#~ msgstr "Saniye"
#~ msgid "Minutes"
#~ msgstr "Dakika"
#~ msgid "Hours"
#~ msgstr "Saat"
#~ msgid "Days"
#~ msgstr "Gün"
#~ msgid "Weeks"
#~ msgstr "Hafta"
#~ msgid "_About"
#~ msgstr "_Hakkında"
#~ msgid "org.gnome.Podcasts"
#~ msgstr "org.gnome.Podcasts"
#~ msgid "Episode Title"
#~ msgstr "Bölüm Başlığı"

View File

@ -1,386 +0,0 @@
# Ukrainian translation for podcasts.
# Copyright (C) 2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
#
# Yuri Chornoivan <yurchor@ukr.net>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-03-21 20:34+0000\n"
"PO-Revision-Date: 2020-04-06 19:49+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 20.07.70\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr ""
"Розташування останнього відкритого головного вікна за вертикаллю (згори)"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr ""
"Розташування останнього відкритого головного вікна за горизонталлю (ліворуч)"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Висота останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Ширина останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Стан максимізації останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Увімкнути або вимкнути темну тему"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Чи слід періодично оновлювати дані"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
"Скільки періодів часу слід очікувати між двома послідовними автоматичними"
" оновленнями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr ""
"Який період часу слід використовувати для очікування між двома послідовними"
" автоматичними оновленнями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Чи слід оновлювати дані після запуску"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr ""
"Скільки періодів часу слід очікувати між двома послідовними автоматичними"
" очищеннями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr ""
"Який період часу слід використовувати для очікування між двома послідовними"
" автоматичними очищеннями"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts"
msgstr "Подкасти"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Слухайте ваші улюблені подкасти безпосередньо з вашої стільниці."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;подкаст;рсс;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Програма для прослуховування подкастів у GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "У цьому шоу ще немає серій"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Якщо ви вважаєте це помилкою, будь ласка, повідомте про неї розробникам."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Отримати шоу"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Додайте нові шоу за допомогою адреси стрічки"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Імпортувати шоу з іншого пристрою"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Ви вже прослуховували цю серію."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Обчислюємо розмір серії…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Відтворити цю серію"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Скасувати процедуру отримання"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Отримати цю серію"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Шукати нові серії"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Імпортувати шоу"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Експортувати шоу"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Клавіатурні скорочення"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Про «Подкасти»"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Додати нову подачу"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Введіть адресу подачі для додавання"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Додати"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Показувати заголовок"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Назад"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Загальне"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Шукати нові серії"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Вийти з програми"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Сьогодні"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Вчора"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Цього тижня"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Цього місяця"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Старіше"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Сповіщення про дію у програмі"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Скасувати"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Зараз відтворюється"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Змінити швидкість відтворення"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Швидкість відтворення 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Швидкість відтворення 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Звичайна швидкість"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "На 10 назад"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Відтворити"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Пауза"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "На 10 секунд вперед"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "П_означити усі серії як відтворені"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Сайт"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Відписатись"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Відкрити сайт"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Позначити усе як відтворене"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Відписатися"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Дізнатися більше"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes"
msgstr "Отримання нових серій"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Створити"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Шоу"
#: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows."
msgstr "Виберіть файл, з якого ви хочете імпортувати шоу."
#: podcasts-gtk/src/utils.rs:401
msgid "_Import"
msgstr "_Імпортувати"
#: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file"
msgstr "файл OPML"
#: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file"
msgstr "Не вдалося обробити імпортований файл"
#: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed."
msgstr "Не вдалося отримати доступ до вибраного файла."
#: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Експортувати шоу до…"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "_Експортувати"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "_Скасувати"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "Підписки на подкасти GNOME"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Не вдалося експортувати подкасти"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Клієнт подкастів для стільниці GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Дізнатися більше про «Подкасти» GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Юрій Чорноіван <yurchor@ukr.net>"
#: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min"
msgstr "{} хв."
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action."
msgstr "Програвачеві мультимедійних даних не вдалося виконати цю дію."
#: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened"
msgstr "Усі серії позначено як прослухані"
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}"
msgstr "Скасовано підписку на {}"

View File

@ -1,405 +0,0 @@
# Chinese (China) translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Dingzhong Chen <wsxy162@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-09-06 18:29+0000\n"
"PO-Revision-Date: 2018-09-07 12:07+0800\n"
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
"X-Generator: Gtranslator 2.91.7\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "最后打开的主窗口顶部位置"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "最后打开的主窗口左侧位置"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "最后打开的主窗口高度"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "最后打开的主窗口宽度"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "最后打开的主窗口最大化状态"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "启用或禁用暗色主题"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "是否定期刷新内容"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "自动刷新之间要等待多久的时间"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "自动刷新之间要等待的时间段"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "启动后是否刷新内容"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "自动清理之间要等待多久的时间"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "自动清理之间要等待的时间段"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "播客"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "直接在您的桌面上收听喜欢的播客。"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;播客;订阅;聚合;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "GNOME 的播客应用"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "这个节目还没有剧集"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "如果您认为这是个错误,请考虑编写个缺陷报告。"
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "获取节目"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "通过订阅源 URL 添加新节目"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "从另一设备导入节目"
#: podcasts-gtk/resources/gtk/episode_widget.ui:178
msgid "Calculating episode size…"
msgstr "正在计算剧集大小……"
#: podcasts-gtk/resources/gtk/episode_widget.ui:214
msgid "Cancel"
msgstr "取消"
#: podcasts-gtk/resources/gtk/episode_widget.ui:232
msgid "Download this episode"
msgstr "下载此剧集"
#: podcasts-gtk/resources/gtk/episode_widget.ui:256
msgid "Play this episode"
msgstr "播放此剧集"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "检查新剧集(_C)"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "导入节目(_I)"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "首选项(_P)"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "键盘快捷键(_K)"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "关于(_A)"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "添加新订阅源"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "输入要添加的订阅源地址"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "添加"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "您已经订阅了那条订阅源!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "显示标题"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "后退"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "常规"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "检查新剧集"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "首选项"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "退出程序"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "今天"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "昨天"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "本周"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "本月"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "更早"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "应用内操作通知"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "撤消"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "后退 10 秒"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "播放"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "暂停"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "快进 10 秒"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "更改播放速度"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1.5 倍速率"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1.25 倍速率"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "正常速度"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "首选项"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "外观"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "暗色主题"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "删除播放过的剧集"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "经过"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "标记所有剧集为已播放(_M)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "网站(_W)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "退订(_U)"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "打开网站"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "全部标记为已播放"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "退订"
#: podcasts-gtk/src/app.rs:332
msgid "Fetching new episodes"
msgstr "正在提取新剧集"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "您已经订阅了此节目"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "无效的 URL"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "秒"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "分"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "小时"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "天"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "周"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "更新"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "节目"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "选择您想要从中导入节目的文件。"
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "导入(_I)"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "OPML 文件"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "解析导入文件失败"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "所选文件无法访问。"
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "GNOME 桌面的播客客户端。"
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "了解关于 GNOME 播客的更多信息"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "Dingzhong Chen <wsxy162@gmail.com>, 2018."
#: podcasts-gtk/src/widgets/episode.rs:129
msgid "{} min"
msgstr "{} 分钟"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "媒体播放器无法执行此操作。"
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "标记所有剧集为已听过"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "已退订 {}"

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkBox" id="empty_show">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixel_size">128</property>
<property name="icon_name">application-rss+xml-symbolic</property>
<property name="use_fallback">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">This show does not have any episodes</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.4399999999999999"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">If you think this is an Error, Plese consider opening a bug report.</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</interface>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,53 +24,12 @@ Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<object class="GtkBox" id="empty_show">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">This show does not have episodes yet</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.4399999999999999"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">If you think this is an error, please consider writing a bug report.</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<object class="GtkBox" id="empty_view">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -81,12 +40,13 @@ Tobias Bernard
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="image">
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="pixel_size">256</property>
<property name="icon_name">org.gnome.Podcasts-symbolic</property>
<style>
<class name="dim-label"/>
</style>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,9 +24,9 @@ Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
@ -35,8 +35,8 @@ Tobias Bernard
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="margin_start">6</property>
<property name="margin_end">6</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
@ -44,54 +44,25 @@ Tobias Bernard
<property name="can_focus">False</property>
<child>
<object class="GtkBox" id="info_container">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkBox">
<object class="GtkLabel" id="title_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="title_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label">Episode Title</property>
<property name="ellipsize">end</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<property name="lines">1</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage" id="played_checkmark">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Youve already listened to this episode.</property>
<property name="icon_name">object-select-symbolic</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<property name="label" translatable="yes">Episode Title</property>
<property name="ellipsize">end</property>
<property name="width_chars">55</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<property name="lines">1</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -104,15 +75,12 @@ Tobias Bernard
<object class="GtkLabel" id="date_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label">3 Jan</property>
<property name="label" translatable="yes">3 Jan</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
</style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
@ -124,7 +92,7 @@ Tobias Bernard
<object class="GtkLabel" id="separator1">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label">·</property>
<property name="label" translatable="yes">·</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
@ -140,15 +108,12 @@ Tobias Bernard
<object class="GtkLabel" id="duration_label">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label">42 min</property>
<property name="label" translatable="yes">42 min</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
</style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
@ -160,7 +125,7 @@ Tobias Bernard
<object class="GtkLabel" id="separator2">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label">·</property>
<property name="label" translatable="yes">·</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
@ -176,16 +141,12 @@ Tobias Bernard
<object class="GtkLabel" id="local_size">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label">0 MB</property>
<property name="ellipsize">end</property>
<property name="label" translatable="yes">0 MB</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
</style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
@ -197,7 +158,7 @@ Tobias Bernard
<object class="GtkLabel" id="prog_separator">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label">/</property>
<property name="label" translatable="yes">/</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<style>
@ -214,16 +175,12 @@ Tobias Bernard
<object class="GtkLabel" id="total_size">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Calculating episode size…</property>
<property name="ellipsize">end</property>
<property name="label" translatable="yes">Calculating episode size...</property>
<property name="single_line_mode">True</property>
<property name="track_visited_links">False</property>
<style>
<class name="dim-label"/>
</style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
@ -247,53 +204,23 @@ Tobias Bernard
</packing>
</child>
<child>
<object class="GtkBox" id="button_box">
<object class="GtkButtonBox" id="button_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="spacing">6</property>
<child>
<object class="GtkButton" id="play_button">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
<property name="tooltip_text" translatable="yes">Play this episode</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<property name="layout_style">center</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">Cancel</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Cancel the download process</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-stop-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
<property name="position">0</property>
</packing>
</child>
<child>
@ -313,10 +240,34 @@ Tobias Bernard
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="non_homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
<property name="tooltip_text" translatable="yes">Play this episode</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="non_homogeneous">True</property>
</packing>
</child>
</object>
@ -338,8 +289,8 @@ Tobias Bernard
<object class="GtkProgressBar" id="progress_bar">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="margin_start">6</property>
<property name="margin_end">6</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="hexpand">True</property>
<property name="pulse_step">0</property>
</object>

View File

@ -4,7 +4,7 @@
<menu id="menu">
<section>
<item>
<attribute name="label" translatable="yes">_Check for New Episodes</attribute>
<attribute name="label" translatable="yes">_Check for new episodes</attribute>
<attribute name="action">win.refresh</attribute>
<attribute name="accel">&lt;primary&gt;r</attribute>
</item>
@ -12,9 +12,16 @@
<attribute name="label" translatable="yes">_Import Shows</attribute>
<attribute name="action">win.import</attribute>
</item>
<!-- <item> -->
<!-- <attribute name="label" translatable="yes">_Export Shows</attribute> -->
<!-- <attribute name="action">win.export</attribute> -->
<!-- </item> -->
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Export Shows</attribute>
<attribute name="action">win.export</attribute>
<attribute name="label" translatable="yes">_Preferences</attribute>
<attribute name="action">win.preferences</attribute>
<attribute name="accel">&lt;primary&gt;e</attribute>
</item>
</section>
<section>
@ -27,10 +34,9 @@
<!-- <attribute name="action">win.help</attribute> -->
<!-- </item> -->
<item>
<attribute name="label" translatable="yes">_About Podcasts</attribute>
<attribute name="label" translatable="yes">_About</attribute>
<attribute name="action">win.about</attribute>
</item>
</section>
</menu>
</interface>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,9 +24,9 @@ Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
@ -41,7 +41,10 @@ Tobias Bernard
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="border_width">6</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
@ -70,7 +73,7 @@ Tobias Bernard
<object class="GtkEntry" id="new_url">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_chars">26</property>
<property name="width_chars">30</property>
<property name="input_purpose">url</property>
</object>
<packing>
@ -126,58 +129,24 @@ Tobias Bernard
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="result_label">
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">You are already subscribed to that feed!</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="HdyHeaderBar" id="headerbar">
<object class="GtkHeaderBar" id="headerbar">
<property name="can_focus">False</property>
<property name="show_close_button">True</property>
<property name="centering-policy">strict</property>
<child type="title">
<object class="GtkStack" id="title_stack">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="transition_type">crossfade</property>
<child>
<object class="HdySqueezer" id="switch_squeezer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="transition_type">crossfade</property>
<child>
<object class="HdyViewSwitcher" id="switch">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="policy">wide</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Podcasts</property>
<style>
<class name="title"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel" id="show_title">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Show Title</property>
<property name="ellipsize">end</property>
<property name="track_visited_links">False</property>
<style>
<class name="title" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuButton" id="add_toggle">
<property name="visible">True</property>
@ -222,6 +191,72 @@ Tobias Bernard
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="update_notification">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<child>
<object class="GtkSpinner" id="update_spinner">
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="update_label">
<property name="can_focus">False</property>
<property name="label" translatable="yes">Fetching new episodes</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
<child type="title">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkStackSwitcher" id="switch">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="show_title">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Show Title</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkMenuButton" id="hamburger">
<property name="visible">True</property>

View File

@ -18,6 +18,13 @@
<property name="title" translatable="yes" context="shortcut window">Check for new episodes</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="accelerator">&lt;primary&gt;e</property>
<property name="title" translatable="yes" context="shortcut window">Preferences</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,9 +24,9 @@ Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
@ -40,7 +40,7 @@ Tobias Bernard
<object class="GtkImage" id="cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_start">8</property>
<property name="margin_left">8</property>
<property name="pixel_size">64</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,304 +24,376 @@ Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<object class="GtkBox" id="frame_parent">
<object class="GtkBox" id="container">
<property name="name">container</property>
<property name="width_request">290</property>
<property name="height_request">420</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_start">6</property>
<property name="margin_end">6</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">24</property>
<child>
<object class="GtkBox" id="today_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<object class="GtkScrolledWindow" id="scrolled_window">
<property name="name">scrolled_window</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<child>
<object class="GtkLabel">
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Today</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="today_list">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="frame_parent">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">32</property>
<property name="margin_right">32</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">24</property>
<child>
<object class="GtkBox" id="today_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Today</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="today_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="yday_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Yesterday</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="yday_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="week_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">This Week</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="week_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="month_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">This Month</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="month_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkBox" id="rest_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Older</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="rest_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="yday_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Yesterday</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="yday_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="week_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">This Week</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="week_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="month_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">This Month</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="month_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkBox" id="rest_box">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Older</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="rest_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
</object>
</interface>

View File

@ -1,35 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of GNOME Podcast.
GNOME Podcast 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.
GNOME Podcast 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 GNOME Podcast. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<!-- Generated with glade 3.21.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcast -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<requires lib="gtk+" version="3.20"/>
<object class="GtkRevealer" id="revealer">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -49,16 +21,22 @@ Tobias Bernard
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_start">3</property>
<property name="margin_end">3</property>
<property name="margin_left">3</property>
<property name="margin_right">3</property>
<property name="spacing">6</property>
<child>
<object class="GtkSpinner" id="spinner">
<object class="GtkLabel" id="text">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_left">12</property>
<property name="margin_right">12</property>
<property name="label" translatable="yes">An in-app action notification</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
@ -89,27 +67,10 @@ Tobias Bernard
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="text">
<property name="width_request">150</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_start">12</property>
<property name="margin_end">12</property>
<property name="label" translatable="yes">An in-app action notification</property>
<property name="ellipsize">start</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="undo">
<property name="label" translatable="yes">Undo</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
@ -122,7 +83,7 @@ Tobias Bernard
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">3</property>
<property name="position">2</property>
</packing>
</child>
</object>

View File

@ -1,306 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libhandy" version="0.0"/>
<object class="HdyDialog" id="dialog">
<property name="can_focus">False</property>
<property name="type_hint">dialog</property>
<property name="modal">True</property>
<child type="titlebar">
<object class="HdyHeaderBar" id="headerbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Now Playing</property>
<child>
<object class="GtkButton" id="close">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">go-previous-symbolic</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkImage" id="cover">
<property name="width_request">256</property>
<property name="height_request">256</property>
<property name="margin">18</property>
<property name="margin-top">36</property>
<property name="margin-bottom">6</property>
<property name="valign">center</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="orientation">vertical</property>
<property name="margin-start">6</property>
<property name="margin-end">6</property>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="label">Episode Title</property>
<property name="wrap">True</property>
<property name="justify">center</property>
<style>
<class name="bold-label" />
</style>
</object>
</child>
<child>
<object class="GtkLabel" id="show_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="label">Show Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<child>
<object class="GtkLabel" id="progressed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
<style>
<class name="dim-label"/>
<class name="small-label"/>
</style>
</object>
</child>
<child>
<object class="GtkScale" id="slider">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="draw_value">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="duration">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="width_chars">5</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
<style>
<class name="dim-label"/>
<class name="small-label"/>
</style>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="spacing">12</property>
<child>
<object class="GtkButton" id="rewind">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_request">60</property>
<property name="height_request">60</property>
<property name="valign">center</property>
<property name="margin-end">12</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">skip-back-large-symbolic</property>
<property name="icon_size">5</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkStack" id="play_pause">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="play">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="width_request">80</property>
<property name="height_request">80</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-start-symbolic</property>
<property name="icon_size">6</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
</child>
<child>
<object class="GtkButton" id="pause">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_request">80</property>
<property name="height_request">80</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-pause-symbolic</property>
<property name="icon_size">6</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="forward">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="width_request">60</property>
<property name="height_request">60</property>
<property name="valign">center</property>
<property name="margin-start">12</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">skip-forward-large-symbolic</property>
<property name="icon_size">5</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox" id="bottom">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,269 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of GNOME Podcast.
GNOME Podcast 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.
GNOME Podcast 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 GNOME Podcast. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkMenuButton" id="rate_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Change the playback speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_start">6</property>
<property name="direction">up</property>
<property name="popover">rate_popover</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="rate_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">1.00×</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">pan-down-symbolic</property>
<property name="icon_size">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkPopover" id="rate_popover">
<property name="can_focus">False</property>
<property name="relative_to">rate_button</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton" id="rate_4_00">
<property name="text">&lt;span font-features="tnum=1"&gt;4.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">4.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_75">
<property name="text">&lt;span font-features="tnum=1"&gt;3.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_50">
<property name="text">&lt;span font-features="tnum=1"&gt;3.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_25">
<property name="text">&lt;span font-features="tnum=1"&gt;3.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_00">
<property name="text">&lt;span font-features="tnum=1"&gt;3.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_75">
<property name="text">&lt;span font-features="tnum=1"&gt;2.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_50">
<property name="text">&lt;span font-features="tnum=1"&gt;2.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_25">
<property name="text">&lt;span font-features="tnum=1"&gt;2.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_00">
<property name="text">&lt;span font-features="tnum=1"&gt;2.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">8</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_75">
<property name="text">&lt;span font-features="tnum=1"&gt;1.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">9</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_50">
<property name="text">&lt;span font-features="tnum=1"&gt;1.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">10</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_25">
<property name="text">&lt;span font-features="tnum=1"&gt;1.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">11</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="normal_rate">
<property name="text">&lt;span font-features="tnum=1"&gt;1.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">Normal speed</property>
<property name="active">True</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">12</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,35 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of GNOME Podcast.
GNOME Podcast 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.
GNOME Podcast 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 GNOME Podcast. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcast -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<requires lib="gtk+" version="3.20"/>
<object class="GtkImage" id="fast_forward">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -54,371 +26,344 @@ Tobias Bernard
<property name="can_focus">False</property>
<property name="icon_name">skip-back-symbolic</property>
</object>
<object class="GtkBox" id="container">
<property name="visible">True</property>
<object class="GtkActionBar" id="action_bar">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">0</property>
<property name="no_show_all">True</property>
<property name="valign">center</property>
<child>
<object class="GtkProgressBar" id="progress_bar">
<property name="no_show_all">True</property>
<object class="GtkBox" id="buttons">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="rewind_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Rewind 10 seconds</property>
<property name="image">rewind</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="width_request">60</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Play</property>
<property name="image">play_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="pause_button">
<property name="width_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Pause</property>
<property name="image">pause_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ff_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Fast Forward 10 seconds</property>
<property name="image">fast_forward</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<style>
<class name="playback-progress"/>
<class name="linked"/>
</style>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEventBox" id="evbox">
<object class="GtkBox" id="info">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkActionBar" id="action_bar">
<object class="GtkImage" id="show_cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="valign">center</property>
<child>
<object class="HdySqueezer" id="squeezer">
<property name="visible">True</property>
<property name="transition_type">crossfade</property>
<child>
<object class="GtkBox" id="full">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
<object class="GtkBox" id="buttons">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="rewind_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Rewind 10 seconds</property>
<property name="image">rewind</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="width_request">60</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Play</property>
<property name="image">play_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="pause_button">
<property name="width_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Pause</property>
<property name="image">pause_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ff_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Fast forward 10 seconds</property>
<property name="image">fast_forward</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<style>
<class name="linked"/>
</style>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="info">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="width_request">150</property>
<child>
<object class="GtkImage" id="show_cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="show_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Show Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<property name="xalign">0</property>
<style>
<class name="player-show-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Episode Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<property name="xalign">0</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkScale" id="seek">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="round_digits">1</property>
<property name="draw_value">False</property>
<property name="width_request">150</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="timer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="progress_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">/</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="total_duration_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="show_cover_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="show_label_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Show Title</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<style>
<class name="player-show-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Episode Title</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkStack" id="play_pause_small">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="play_button_small">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton" id="pause_button_small">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">media-playback-pause-symbolic</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<style>
<class name="player-actionbar"/>
</style>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="show_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Show Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<style>
<class name="player-show-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Episode Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScale" id="seek">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="round_digits">1</property>
<property name="draw_value">False</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="timer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="progress_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">/</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="total_duration_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="rate_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Change the Playback speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_left">6</property>
<property name="direction">up</property>
<property name="popover">rate_popover</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="rate_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">1.00x</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">go-down-symbolic</property>
<property name="icon_size">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="position">4</property>
</packing>
</child>
</object>
<object class="GtkPopover" id="rate_popover">
<property name="can_focus">False</property>
<property name="relative_to">rate_button</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<property name="spacing">3</property>
<child>
<object class="GtkRadioButton" id="rate_1_50">
<property name="label" translatable="yes">1.50x</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">1.5 speed rate</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">normal_rate</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="rate_1_25">
<property name="label" translatable="yes">1.25x</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">1.25 speed rate</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">normal_rate</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="normal_rate">
<property name="label" translatable="yes">1.00x</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Normal speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>

View File

@ -0,0 +1,282 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkAdjustment" id="cleanup_value_adj">
<property name="lower">1</property>
<property name="upper">100</property>
<property name="value">1</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkWindow" id="prefs">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Preferences</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="min_content_width">480</property>
<property name="min_content_height">200</property>
<property name="propagate_natural_width">True</property>
<property name="propagate_natural_height">True</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="margin_top">10</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Appearance</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="width_request">450</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
<child>
<object class="GtkListBoxRow">
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">False</property>
<property name="selectable">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Dark Theme</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="dark_toggle">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="valign">center</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="margin_top">20</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Delete played episodes</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="width_request">300</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
<child>
<object class="GtkListBoxRow">
<property name="width_request">100</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">False</property>
<property name="selectable">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">After</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSpinButton" id="cleanup_value">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="input_purpose">digits</property>
<property name="adjustment">cleanup_value_adj</property>
<property name="climb_rate">1</property>
<property name="value">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="cleanup_type">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<style>
<class name="linked"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title">Preferences</property>
<property name="show_close_button">True</property>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="refresh_value_adj">
<property name="lower">1</property>
<property name="upper">100</property>
<property name="value">1</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
</interface>

View File

@ -4,7 +4,7 @@
<menu id="menu">
<section>
<item>
<attribute name="label" translatable="yes">_Mark All Episodes as Played</attribute>
<attribute name="label" translatable="yes">_Mark all episodes as played</attribute>
<!-- <attribute name="action">win.refresh</attribute> -->
</item>
<item>

View File

@ -1,35 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
GNOME Podcasts 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.
GNOME Podcasts 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<requires lib="gtk+" version="3.20"/>
<object class="GtkPopoverMenu" id="menu">
<property name="can_focus">False</property>
<property name="halign">center</property>
@ -61,7 +33,7 @@ Tobias Bernard
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="text" translatable="yes">Mark All as Played</property>
<property name="text" translatable="yes">Mark all as played</property>
</object>
<packing>
<property name="expand">False</property>

View File

@ -3,20 +3,20 @@
Copyright (C) 2017 - 2018
This file is part of GNOME Podcasts.
This file is part of Hammond.
GNOME Podcasts is free software: you can redistribute it and/or modify
Hammond 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.
GNOME Podcasts is distributed in the hope that it will be useful,
Hammond 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 GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
@ -24,109 +24,170 @@ Tobias Bernard
-->
<interface domain="">
<requires lib="gtk+" version="3.22"/>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name GNOME Podcasts -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<object class="GtkBox" id="sub_container">
<object class="GtkBox" id="container">
<property name="width_request">290</property>
<property name="height_request">420</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkBox">
<object class="GtkScrolledWindow" id="scrolled_window">
<property name="name">scrolled_window</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<property name="hscrollbar_policy">never</property>
<child>
<object class="GtkImage" id="cover">
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixel_size">256</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="HdyColumn">
<property name="visible">True</property>
<property name="maximum_width">600</property>
<child>
<object class="GtkStack" id="description_stack">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vhomogeneous">False</property>
<property name="transition_type">none</property>
<property name="interpolate_size">True</property>
<property name="margin">12</property>
<property name="can_focus">False</property>
<property name="can_default">True</property>
<property name="hexpand">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">fill</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="description_short">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="use_markup">True</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<property name="wrap_mode">word-char</property>
<property name="ellipsize">end</property>
<property name="lines">4</property>
</object>
</child>
<child>
<object class="GtkRevealer" id="description_button_revealer">
<property name="visible">True</property>
<property name="reveal_child">False</property>
<property name="transition_duration">1</property>
<child>
<object class="GtkButton" id="description_button">
<property name="label" translatable="yes">Read More</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="halign">center</property>
<property name="margin_top">12</property>
</object>
</child>
</object>
<placeholder/>
</child>
</object>
<packing>
<property name="name">short</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="description">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="use_markup">True</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<property name="wrap_mode">word-char</property>
<property name="margin_left">32</property>
<property name="margin_right">32</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixel_size">256</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="min_content_height">80</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkLabel" id="description">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="label">This is embarrasing!
Sorry, we could not find a description for this Show.</property>
<property name="use_markup">True</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<property name="max_width_chars">70</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="episodes">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="selection_mode">none</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="name">full</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
@ -134,45 +195,38 @@ Tobias Bernard
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<object class="GtkPopover" id="show_menu">
<property name="can_focus">False</property>
<property name="position">bottom</property>
<child>
<object class="GtkFrame">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="margin_start">6</property>
<property name="margin_end">6</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkAlignment">
<object class="GtkModelButton" id="mark_all_watched">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<child>
<object class="GtkListBox" id="episodes">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
</object>
</child>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="text" translatable="yes">Mark all episodes as listened</property>
<property name="centered">True</property>
</object>
</child>
<child type="label_item">
<placeholder/>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of Hammond.
Hammond 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.
Hammond 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 Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<object class="GtkBox" id="fb_child">
<property name="width_request">256</property>
<property name="height_request">256</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkImage" id="pd_cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="pixel_size">256</property>
<property name="icon_name">image-x-generic-symbolic</property>
<property name="icon_size">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</interface>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of Hammond.
Hammond 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.
Hammond 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 Hammond. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.20"/>
<!-- interface-license-type gplv3 -->
<!-- interface-name Hammond -->
<!-- interface-description A podcast client for the GNOME Desktop -->
<!-- interface-copyright 2017 - 2018 -->
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
<object class="GtkBox" id="fb_parent">
<property name="name">fb_parent</property>
<property name="width_request">290</property>
<property name="height_request">420</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkScrolledWindow" id="scrolled_window">
<property name="name">scrolled_window</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkFlowBox" id="flowbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">start</property>
<property name="margin_top">24</property>
<property name="margin_bottom">24</property>
<property name="homogeneous">True</property>
<property name="column_spacing">12</property>
<property name="row_spacing">12</property>
<property name="max_children_per_line">20</property>
<property name="selection_mode">none</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</interface>

View File

@ -18,24 +18,3 @@ list, border {
.player-show-label {
font-size: smaller;
}
.small-label {
font-size: smaller;
}
.bold-label {
font-weight: bold;
}
progressbar.playback-progress trough {
border-radius: 0;
}
progressbar.playback-progress trough progress {
border-radius: 0;
border-right: none;
border-left: none;
}
actionbar.player-small revealer box {
border-top: none
}

View File

@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128px" height="128px" viewBox="0 0 128 128" version="1.1">
<defs>
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="8" y1="264" x2="120" y2="264" gradientTransform="matrix(1,0,0,1,0,-160.000006)">
<stop offset="0" style="stop-color:rgb(64.705884%,11.372549%,17.647059%);stop-opacity:1;"/>
<stop offset="0.0343218" style="stop-color:rgb(92.941177%,20%,23.137255%);stop-opacity:1;"/>
<stop offset="0.0706241" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
<stop offset="0.927675" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
<stop offset="0.964286" style="stop-color:rgb(92.941177%,20%,23.137255%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
</linearGradient>
<clipPath id="clip1">
<path d="M 52 62 L 76 62 L 76 74 L 52 74 Z M 52 62 "/>
</clipPath>
<filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
<feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
</filter>
<mask id="mask0">
<g filter="url(#alpha)">
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.5;stroke:none;"/>
</g>
</mask>
<clipPath id="clip2">
<rect x="0" y="0" width="192" height="152"/>
</clipPath>
<g id="surface29618" clip-path="url(#clip2)">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 76 84 C 76 99.464844 63.464844 112 48 112 C 32.535156 112 20 99.464844 20 84 C 20 68.535156 32.535156 56 48 56 C 63.464844 56 76 68.535156 76 84 Z M 76 84 "/>
</g>
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="8" y1="264" x2="120" y2="264" gradientTransform="matrix(1,0,0,1,0,-160.000006)">
<stop offset="0" style="stop-color:rgb(64.705884%,11.372549%,17.647059%);stop-opacity:1;"/>
<stop offset="0.0343218" style="stop-color:rgb(92.941177%,20%,23.137255%);stop-opacity:1;"/>
<stop offset="0.0706241" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
<stop offset="0.927675" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
<stop offset="0.964286" style="stop-color:rgb(92.941177%,20%,23.137255%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(75.294119%,10.980392%,15.686275%);stop-opacity:1;"/>
</linearGradient>
<clipPath id="clip5">
<path d="M 52 62 L 76 62 L 76 74 L 52 74 Z M 52 62 "/>
</clipPath>
<mask id="mask2">
<g filter="url(#alpha)">
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.5;stroke:none;"/>
</g>
</mask>
<clipPath id="clip6">
<rect x="0" y="0" width="192" height="152"/>
</clipPath>
<g id="surface29618" clip-path="url(#clip6)">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 76 84 C 76 99.464844 63.464844 112 48 112 C 32.535156 112 20 99.464844 20 84 C 20 68.535156 32.535156 56 48 56 C 63.464844 56 76 68.535156 76 84 Z M 76 84 "/>
</g>
<clipPath id="clip4">
<rect x="0" y="0" width="128" height="128"/>
</clipPath>
<g id="surface29630" clip-path="url(#clip4)">
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear1);" d="M 16 92 L 112 92 C 116.417969 92 120 95.582031 120 100 L 120 108 C 120 112.417969 116.417969 116 112 116 L 16 116 C 11.582031 116 8 112.417969 8 108 L 8 100 C 8 95.582031 11.582031 92 16 92 Z M 16 92 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(92.941177%,20%,23.137255%);fill-opacity:1;" d="M 16 28 L 112 28 C 116.417969 28 120 31.957031 120 36.84375 L 120 103.15625 C 120 108.042969 116.417969 112 112 112 L 16 112 C 11.582031 112 8 108.042969 8 103.15625 L 8 36.84375 C 8 31.957031 11.582031 28 16 28 Z M 16 28 "/>
<path style="fill-rule:nonzero;fill:rgb(36.862746%,36.078432%,39.215687%);fill-opacity:1;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(36.862746%,36.078432%,39.215687%);stroke-opacity:1;stroke-miterlimit:4;" d="M 36 281.999994 L 92 281.999994 L 88 271.999994 L 40 271.999994 Z M 36 281.999994 " transform="matrix(1,0,0,1,0,-171.999994)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 32 110 L 96 110 L 96 116 L 32 116 Z M 32 110 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 24 36 L 104 36 L 112 44 L 112 96 L 16 96 L 16 44 Z M 24 36 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 16 52 L 112 52 L 112 84 L 16 84 Z M 16 52 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 46 68 C 46 71.3125 43.3125 74 40 74 C 36.6875 74 34 71.3125 34 68 C 34 64.6875 36.6875 62 40 62 C 43.3125 62 46 64.6875 46 68 Z M 46 68 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 94 68 C 94 71.3125 91.3125 74 88 74 C 84.6875 74 82 71.3125 82 68 C 82 64.6875 84.6875 62 88 62 C 91.3125 62 94 64.6875 94 68 Z M 94 68 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(58.039218%,57.647061%,56.470591%);fill-opacity:1;" d="M 52 62 L 76 62 L 76 74 L 52 74 Z M 52 62 "/>
<g clip-path="url(#clip5)" clip-rule="nonzero">
<use xlink:href="#surface29618" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask2)"/>
</g>
</g>
<clipPath id="clip3">
<rect x="0" y="0" width="128" height="128"/>
</clipPath>
<g id="surface29633" clip-path="url(#clip3)" filter="url(#alpha)">
<use xlink:href="#surface29630"/>
</g>
<mask id="mask1">
<use xlink:href="#surface29633"/>
</mask>
<mask id="mask3">
<g filter="url(#alpha)">
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.8;stroke:none;"/>
</g>
</mask>
<linearGradient id="linear2" gradientUnits="userSpaceOnUse" x1="300" y1="235" x2="428" y2="235" gradientTransform="matrix(0.000000000000000023,0.37,-0.98462,0.00000000000000006,295.38501,-30.360001)">
<stop offset="0" style="stop-color:rgb(97.647059%,94.117647%,41.960785%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(96.078432%,76.078433%,6.666667%);stop-opacity:1;"/>
</linearGradient>
<clipPath id="clip8">
<rect x="0" y="0" width="128" height="128"/>
</clipPath>
<g id="surface29627" clip-path="url(#clip8)">
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear2);" d="M 128 80.640625 L 128 128 L 0 128 L 0 80.640625 Z M 128 80.640625 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 13.308594 80.640625 L 60.664062 128 L 81.878906 128 L 34.519531 80.640625 Z M 55.730469 80.640625 L 103.09375 128 L 124.308594 128 L 76.945312 80.640625 Z M 98.160156 80.640625 L 128 110.480469 L 128 89.269531 L 119.371094 80.640625 Z M 0 88.546875 L 0 109.761719 L 18.238281 128 L 39.453125 128 Z M 0 88.546875 "/>
</g>
<clipPath id="clip7">
<rect x="0" y="0" width="128" height="128"/>
</clipPath>
<g id="surface29632" clip-path="url(#clip7)">
<use xlink:href="#surface29627" mask="url(#mask3)"/>
</g>
</defs>
<g id="surface29613">
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear0);" d="M 16 92 L 112 92 C 116.417969 92 120 95.582031 120 100 L 120 108 C 120 112.417969 116.417969 116 112 116 L 16 116 C 11.582031 116 8 112.417969 8 108 L 8 100 C 8 95.582031 11.582031 92 16 92 Z M 16 92 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(92.941177%,20%,23.137255%);fill-opacity:1;" d="M 16 28 L 112 28 C 116.417969 28 120 31.957031 120 36.84375 L 120 103.15625 C 120 108.042969 116.417969 112 112 112 L 16 112 C 11.582031 112 8 108.042969 8 103.15625 L 8 36.84375 C 8 31.957031 11.582031 28 16 28 Z M 16 28 "/>
<path style="fill-rule:nonzero;fill:rgb(36.862746%,36.078432%,39.215687%);fill-opacity:1;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(36.862746%,36.078432%,39.215687%);stroke-opacity:1;stroke-miterlimit:4;" d="M 36 281.999994 L 92 281.999994 L 88 271.999994 L 40 271.999994 Z M 36 281.999994 " transform="matrix(1,0,0,1,0,-171.999994)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 32 110 L 96 110 L 96 116 L 32 116 Z M 32 110 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 24 36 L 104 36 L 112 44 L 112 96 L 16 96 L 16 44 Z M 24 36 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(25.882354%,25.098041%,28.235295%);fill-opacity:1;" d="M 16 52 L 112 52 L 112 84 L 16 84 Z M 16 52 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 46 68 C 46 71.3125 43.3125 74 40 74 C 36.6875 74 34 71.3125 34 68 C 34 64.6875 36.6875 62 40 62 C 43.3125 62 46 64.6875 46 68 Z M 46 68 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 94 68 C 94 71.3125 91.3125 74 88 74 C 84.6875 74 82 71.3125 82 68 C 82 64.6875 84.6875 62 88 62 C 91.3125 62 94 64.6875 94 68 Z M 94 68 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(58.039218%,57.647061%,56.470591%);fill-opacity:1;" d="M 52 62 L 76 62 L 76 74 L 52 74 Z M 52 62 "/>
<g clip-path="url(#clip1)" clip-rule="nonzero">
<use xlink:href="#surface29618" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask0)"/>
</g>
<use xlink:href="#surface29632" mask="url(#mask1)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -18,7 +18,7 @@
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="org.gnome.Podcasts_clean.svg"
sodipodi:docname="org.gnome.Podcasts.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
style="display:inline;enable-background:new"
@ -28,70 +28,33 @@
<defs
id="defs3">
<linearGradient
y2="236"
x2="96"
y1="236"
x1="32"
gradientTransform="translate(604.81684,170.58641)"
gradientUnits="userSpaceOnUse"
id="linearGradient1099"
xlink:href="#linearGradient1036" />
<linearGradient
id="linearGradient1036">
inkscape:collect="always"
id="linearGradient1654">
<stop
id="stop1032"
style="stop-color:#c65f00;stop-opacity:1"
offset="0"
style="stop-color:#d5d3cf;stop-opacity:1;" />
id="stop1642" />
<stop
id="stop1034"
id="stop1644"
offset="0.03432177"
style="stop-color:#ff7b00;stop-opacity:1" />
<stop
style="stop-color:#c65f00;stop-opacity:1"
offset="0.07062413"
id="stop1646" />
<stop
id="stop1648"
offset="0.92767543"
style="stop-color:#c65f00;stop-opacity:1" />
<stop
style="stop-color:#ff7b00;stop-opacity:1"
offset="0.96428573"
id="stop1650" />
<stop
style="stop-color:#c65f00;stop-opacity:1"
offset="1"
style="stop-color:#f6f5f4;stop-opacity:1" />
id="stop1652" />
</linearGradient>
<radialGradient
r="32"
fy="-76"
fx="-244"
cy="-76"
cx="-244"
gradientTransform="matrix(0.88333331,0,0,0.88333331,-460.35018,463.11973)"
gradientUnits="userSpaceOnUse"
id="radialGradient1103"
xlink:href="#linearGradient1069" />
<linearGradient
id="linearGradient1069">
<stop
id="stop1065"
offset="0"
style="stop-color:#d5d3cf;stop-opacity:1" />
<stop
id="stop1067-1"
offset="1"
style="stop-color:#949390;stop-opacity:1" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="232"
x2="64"
y1="262.5"
x1="64"
id="linearGradient1027"
xlink:href="#linearGradient1025"
gradientTransform="translate(-470.5864,432.81685)" />
<linearGradient
id="linearGradient1025">
<stop
id="stop1021"
offset="0"
style="stop-color:#9a9996;stop-opacity:1" />
<stop
id="stop1023"
offset="1"
style="stop-color:#77767b;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect35304-9"
is_visible="true" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1017">
@ -120,7 +83,7 @@
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1043">
id="clipPath945">
<rect
ry="31.999998"
rx="32"
@ -128,47 +91,9 @@
x="32.5"
height="320"
width="447"
id="rect1041"
id="rect943"
style="opacity:1;fill:#fb8c14;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.9999998, 1.9999999;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<linearGradient
gradientTransform="translate(0,11.999989)"
inkscape:collect="always"
xlink:href="#linearGradient1654"
id="linearGradient1640"
x1="8"
y1="264"
x2="120"
y2="264"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient1654">
<stop
style="stop-color:#a51d2d;stop-opacity:1"
offset="0"
id="stop1642" />
<stop
id="stop1644"
offset="0.03432177"
style="stop-color:#ed333b;stop-opacity:1" />
<stop
style="stop-color:#c01c28;stop-opacity:1"
offset="0.07062413"
id="stop1646" />
<stop
id="stop1648"
offset="0.92767543"
style="stop-color:#c01c28;stop-opacity:1" />
<stop
style="stop-color:#ed333b;stop-opacity:1"
offset="0.96428573"
id="stop1650" />
<stop
style="stop-color:#c01c28;stop-opacity:1"
offset="1"
id="stop1652" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath904">
@ -180,50 +105,82 @@
id="rect906"
style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1" />
</clipPath>
<linearGradient
id="linearGradient1093"
inkscape:collect="always">
<stop
id="stop1089"
offset="0"
style="stop-color:#4fd2fd;stop-opacity:1" />
<stop
id="stop1091"
offset="1"
style="stop-color:#0aa8dc;stop-opacity:1" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1057">
<rect
y="4"
x="208"
height="48"
width="96"
id="rect1055"
style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1" />
id="clipPath1567"
clipPathUnits="userSpaceOnUse">
<circle
transform="rotate(-135)"
r="24"
cy="-134.35028"
cx="-196.57568"
id="circle1569"
style="display:inline;opacity:1;vector-effect:none;fill:url(#radialGradient1571);fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
</clipPath>
<radialGradient
r="24"
fy="222.27728"
fx="40.287689"
cy="222.27728"
cx="40.287689"
gradientTransform="matrix(1.3314563,0,0,1.3314563,-253.92929,-440.0255)"
gradientUnits="userSpaceOnUse"
id="radialGradient1571"
xlink:href="#linearGradient1093"
inkscape:collect="always" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1061">
<rect
y="4"
x="208"
height="48"
width="96"
id="rect1059"
style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1" />
id="clipPath1584"
clipPathUnits="userSpaceOnUse">
<circle
transform="rotate(-45)"
r="24"
cy="195.16147"
cx="-132.93608"
id="circle1586"
style="display:inline;opacity:1;vector-effect:none;fill:url(#radialGradient1588);fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
</clipPath>
<radialGradient
r="24"
fy="222.27728"
fx="40.287689"
cy="222.27728"
cx="40.287689"
gradientTransform="matrix(1.3314563,0,0,1.3314563,-190.28968,-110.51374)"
gradientUnits="userSpaceOnUse"
id="radialGradient1588"
xlink:href="#linearGradient1093"
inkscape:collect="always" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath904-3">
<rect
y="4"
x="208"
height="48"
width="96"
id="rect906-6"
style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1091">
<rect
y="4"
x="208"
height="48"
width="96"
id="rect1088"
style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1" />
id="clipPath1757"
clipPathUnits="userSpaceOnUse">
<circle
r="120.00001"
cy="-200"
cx="36"
id="circle1759"
style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.99999981, 1.99999992;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
transform="rotate(90)" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1654"
id="linearGradient1640"
x1="8"
y1="264"
x2="120"
y2="264"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#ef2929"
@ -234,9 +191,9 @@
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.99999999"
inkscape:cx="-59.599388"
inkscape:cy="168.31056"
inkscape:zoom="0.70710678"
inkscape:cx="-263.96829"
inkscape:cy="8.5799908"
inkscape:current-layer="layer9"
showgrid="false"
inkscape:grid-bbox="true"
@ -244,12 +201,12 @@
inkscape:showpageshadow="false"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="1600"
inkscape:window-x="1920"
inkscape:window-y="27"
width="400px"
height="300px"
inkscape:snap-nodes="true"
inkscape:snap-bbox="true"
inkscape:snap-bbox="false"
objecttolerance="7"
gridtolerance="12"
guidetolerance="13"
@ -271,8 +228,7 @@
inkscape:snap-center="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-text-baseline="true">
inkscape:snap-smooth-nodes="true">
<inkscape:grid
type="xygrid"
id="grid5883"
@ -291,14 +247,14 @@
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="12,64"
position="12,39"
orientation="1,0"
id="guide1075"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="64,104"
position="72,104"
orientation="0,1"
id="guide1099"
inkscape:locked="false"
@ -319,21 +275,21 @@
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="9.2651362e-08,64"
position="0,72"
orientation="1,0"
id="guide867"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="120,64"
position="120,58"
orientation="1,0"
id="guide869"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="64,116"
position="84.25,116"
orientation="0,1"
id="guide871"
inkscape:locked="false"
@ -351,14 +307,14 @@
empopacity="0.08627451"
dotted="true" />
<sodipodi:guide
position="24,64"
position="24,37"
orientation="1,0"
id="guide877"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="116,64"
position="116,58"
orientation="1,0"
id="guide879"
inkscape:locked="false"
@ -372,21 +328,21 @@
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="64,12"
position="59.75,12"
orientation="0,1"
id="guide883"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,64"
position="8,39"
orientation="1,0"
id="guide885"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="128,64"
position="128,56"
orientation="1,0"
id="guide887"
inkscape:locked="false"
@ -400,7 +356,7 @@
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="64,24"
position="56,24"
orientation="0,1"
id="guide899"
inkscape:locked="false"
@ -482,94 +438,179 @@
</metadata>
<g
id="layer1"
inkscape:label="App Icon"
inkscape:label="Icon"
inkscape:groupmode="layer"
style="display:inline"
transform="translate(0,-172)">
<g
inkscape:groupmode="layer"
id="layer9"
inkscape:label="icons"
style="display:inline">
id="layer2"
inkscape:label="baseplate"
style="display:none"
sodipodi:insensitive="true">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.08791494px;line-height:125%;font-family:Cantarell;-inkscape-font-specification:'Cantarell, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.33264872;enable-background:new"
x="7.9499588"
y="148.65199"
id="context"
inkscape:label="context"><tspan
sodipodi:role="line"
id="tspan2716"
x="7.9499588"
y="148.65199"
style="stroke-width:0.33264872">apps</tspan></text>
<text
inkscape:label="icon-name"
id="text3021"
y="157.23398"
x="7.7533054"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.08791494px;line-height:125%;font-family:Cantarell;-inkscape-font-specification:'Cantarell, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.33264872;enable-background:new"
xml:space="preserve"><tspan
y="157.23398"
x="7.7533054"
id="tspan3023"
sodipodi:role="line"
style="stroke-width:0.33264872">org.gnome.Podcasts</tspan></text>
<g
id="g1050">
style="display:inline;fill:#000000;enable-background:new"
transform="matrix(7.9911709,0,0,8.0036407,-167.7909,-4846.0776)"
id="g12027"
inkscape:export-xdpi="12"
inkscape:export-ydpi="12" />
<rect
style="display:inline;overflow:visible;visibility:visible;fill:#f0f0f0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate"
id="rect13805"
width="128"
height="128"
x="9.2651362e-08"
y="172"
inkscape:label="512x512" />
<g
id="g883"
style="fill:none;fill-opacity:0.25098039;stroke:#a579b3;stroke-opacity:1"
transform="translate(-24,24)" />
<g
id="g900"
style="fill:none;fill-opacity:0.25098039;stroke:#a579b3;stroke-opacity:1"
transform="translate(-24,24)" />
<g
id="g1168"
transform="matrix(0.25,0,0,0.25,6.9488522e-8,225)">
<rect
style="display:inline;opacity:1;fill:url(#linearGradient1640);fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999995, 0.49999997;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="rect1025"
width="112"
height="24"
x="8"
y="264"
rx="8"
ry="8" />
ry="32"
rx="32"
y="-180"
x="96"
height="448"
width="319.99979"
id="rect1110"
style="opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
<rect
ry="8.8421059"
rx="8"
y="200"
x="8"
height="83.999992"
width="112"
id="rect927-7"
style="display:inline;opacity:1;fill:#ed333b;fill-opacity:1;stroke:none;stroke-width:0.26282874;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.05131493, 0.52565746;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path1083-9"
d="m 36,281.99999 h 56 l -4,-10 H 40 Z"
style="display:inline;fill:#5e5c64;fill-opacity:1;stroke:#5e5c64;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
clip-path="none" />
ry="32"
rx="32"
y="-164"
x="48"
height="416"
width="416"
id="rect1110-8"
style="display:inline;opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
<rect
y="282"
ry="32"
rx="32"
y="-116"
x="32"
height="6.0000076"
width="64"
id="rect915"
height="320"
width="448"
id="rect1110-8-9"
style="display:inline;opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
<circle
cx="256"
cy="44"
r="240"
id="path1142"
style="opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer9"
inkscape:label="hires"
style="display:inline">
<rect
ry="8"
rx="8"
y="252"
x="8"
height="24"
width="112"
id="rect1025"
style="display:inline;opacity:1;fill:url(#linearGradient1640);fill-opacity:1.0;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999995, 0.49999997000000002;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<rect
style="display:inline;opacity:1;fill:#ff9533;fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999995, 0.49999997000000002;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="rect927-7"
width="112"
height="75.999992"
x="8"
y="196.00002"
rx="8"
ry="8" />
<path
clip-path="none"
style="display:inline;fill:#949390;fill-opacity:1;stroke:#949390;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
d="m 35.999995,270 h 56 l -4,-10 h -48 z"
id="path1083-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
style="display:inline;opacity:1;fill:#6b696c;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="rect915"
width="64"
height="6.0000076"
x="32"
y="270" />
<path
style="display:inline;enable-background:new;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999997;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999998, 0.49999998000000001;stroke-dashoffset:0;stroke-opacity:1"
d="M 23.999999,204 H 104 l 8,8 v 44.00001 H 15.999999 V 212 Z"
id="path1203-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<g
id="g1565">
<rect
y="218"
x="16"
height="28"
width="96"
id="rect1050"
style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<circle
r="6"
cy="232"
cx="39.999992"
id="path1060-5"
style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999996, 0.49999998;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<circle
style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999996, 0.49999998;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="circle1062-6"
cx="87.999992"
cy="232"
r="6" />
<rect
y="226"
x="51.999992"
height="12"
width="24"
id="rect1271-3"
style="display:inline;opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1;enable-background:new" />
<path
sodipodi:nodetypes="ccccccc"
sodipodi:nodetypes="sssss"
inkscape:connector-curvature="0"
id="path1203-6"
d="m 24,207.99999 h 80 l 8,8 V 268 H 16 v -52.00001 z"
style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999997;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999998, 0.49999998;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<g
id="g1565"
style="display:inline;enable-background:new"
transform="translate(0,7.999989)">
<rect
style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:1.06904471;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="rect1050"
width="96"
height="31.999985"
x="16"
y="216.00002" />
<circle
style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999996, 0.49999998;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
id="path1060-5"
cx="39.999992"
cy="232"
r="6" />
<circle
r="6"
cy="232"
cx="87.999992"
id="circle1062-6"
style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.24999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99999996, 0.49999998;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<rect
style="display:inline;opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.19999981;stroke-opacity:1;enable-background:new"
id="rect1271-3"
width="24"
height="12"
x="51.999992"
y="226" />
<path
transform="matrix(0.25,0,0,0.25,-4.5e-6,225.00001)"
style="display:inline;opacity:0.5;fill:#424048;fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.99999983, 1.99999994;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
clip-path="url(#clipPath904)"
d="M 272,28 C 272,89.855892 221.85589,140 160,140 98.144108,140 48,89.855892 48,28 48,-33.855892 98.144108,-84 160,-84 c 61.85589,0 112,50.144108 112,112 z"
id="ellipse900"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssss" />
</g>
id="ellipse900"
d="M 272,28 C 272,89.855892 221.85589,140 160,140 98.144108,140 48,89.855892 48,28 48,-33.855892 98.144108,-84 160,-84 c 61.85589,0 112,50.144108 112,112 z"
clip-path="url(#clipPath904)"
style="display:inline;opacity:0.5;fill:#424048;fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.99999983, 1.99999994;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
transform="matrix(0.25,0,0,0.25,-4.5e-6,225.00001)" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,19 +1 @@
scalable_dir = join_paths('hicolor', 'scalable', 'apps')
install_data(
join_paths(scalable_dir, 'org.gnome.Podcasts.svg'),
install_dir: join_paths(datadir, 'icons', scalable_dir),
)
install_data(
join_paths(scalable_dir, 'org.gnome.Podcasts.Devel.svg'),
install_dir: join_paths(datadir, 'icons', scalable_dir),
)
symbolic_dir = join_paths('hicolor', 'symbolic', 'apps')
install_data(
join_paths(symbolic_dir, 'org.gnome.Podcasts-symbolic.svg'),
install_dir: join_paths(datadir, 'icons', symbolic_dir),
rename: '@0@-symbolic.svg'.format(application_id)
)
install_subdir('hicolor', install_dir: icondir)

View File

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg2916"
sodipodi:docname="skip-back-large-symbolic.svg"
inkscape:version="0.92.4 (unknown)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview11"
showgrid="false"
inkscape:zoom="7.375"
inkscape:cx="16"
inkscape:cy="16"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2916" />
<defs
id="defs2910" />
<metadata
id="metadata2913">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 4.2324219,1.3222656 a 0.26464845,0.26464845 0 1 0 0,0.5292969 C 5.3033196,1.8515612 6.2679165,2.4969489 6.6777344,3.4863281 7.0875525,4.4757119 6.8607584,5.6118992 6.1035156,6.3691406 5.3462755,7.1263812 4.2100855,7.3531746 3.2207031,6.9433594 2.2313192,6.5335432 1.5878886,5.5689483 1.5878906,4.4980469 a 0.2646484,0.2646484 0 1 0 -0.5292968,0 c -2.5e-6,1.28341 0.7732681,2.442454 1.9589843,2.9335937 1.1857144,0.4911386 2.5534315,0.2200067 3.4609375,-0.6875 C 7.3860249,5.836633 7.6571577,4.4689192 7.1660156,3.2832031 6.6748739,2.0974925 5.5158274,1.3222641 4.2324219,1.3222656 Z"
id="path7994"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path7996"
d="M 4.2332975,0.794 V 1.05858 2.11691 2.3815 H 3.9687142 C 3.9164802,2.38149 3.8654129,2.366 3.8219524,2.3371 l -0.79375,-0.52916 c -0.157054,-0.10475 -0.157054,-0.33554 0,-0.44028 l 0.79375,-0.52917 c 0.043461,-0.029 0.094528,-0.0444 0.1467618,-0.0444 h 0.0031 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
d="m 2.6458333,5.8208334 h 1.400175 v -0.4699 h -0.42545 V 3.6173835 h -0.327025 l -0.758825,0.4381499 0.206375,0.3937 0.3302,-0.17145 v 1.07315 h -0.42545 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5132" />
<path
inkscape:connector-curvature="0"
d="m 5.0778791,5.8525834 c 0.5588,0 0.936625,-0.4572 0.936625,-1.146175 0,-0.6731 -0.371475,-1.1207749 -0.92075,-1.1207749 -0.561975,0 -0.9398,0.4571999 -0.9398,1.1429999 0,0.6731 0.371475,1.12395 0.923925,1.12395 z m 0.0127,-0.4699 c -0.225425,0 -0.371475,-0.269875 -0.371475,-0.6731 0,-0.3937 0.14605,-0.65405 0.36195,-0.65405 0.219075,0 0.3683,0.269875 0.3683,0.676275 0,0.390525 -0.14605,0.650875 -0.358775,0.650875 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5134" />
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg2916"
sodipodi:docname="skip-forward-large-symbolic.svg"
inkscape:version="0.92.4 (unknown)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview11"
showgrid="false"
inkscape:zoom="7.375"
inkscape:cx="16"
inkscape:cy="16"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2916" />
<defs
id="defs2910" />
<metadata
id="metadata2913">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<path
inkscape:connector-curvature="0"
d="m 2.6458333,5.8208334 h 1.400175 v -0.4699 h -0.42545 V 3.6173835 h -0.327025 l -0.758825,0.4381499 0.206375,0.3937 0.3302,-0.17145 v 1.07315 h -0.42545 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5132" />
<path
inkscape:connector-curvature="0"
d="m 5.0778791,5.8525834 c 0.5588,0 0.936625,-0.4572 0.936625,-1.146175 0,-0.6731 -0.371475,-1.1207749 -0.92075,-1.1207749 -0.561975,0 -0.9398,0.4571999 -0.9398,1.1429999 0,0.6731 0.371475,1.12395 0.923925,1.12395 z m 0.0127,-0.4699 c -0.225425,0 -0.371475,-0.269875 -0.371475,-0.6731 0,-0.3937 0.14605,-0.65405 0.36195,-0.65405 0.219075,0 0.3683,0.269875 0.3683,0.676275 0,0.390525 -0.14605,0.650875 -0.358775,0.650875 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5134" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 4.2324219,1.3222656 C 2.9490163,1.3222641 1.7899699,2.0974925 1.2988281,3.2832031 0.80768607,4.4689192 1.080772,5.836633 1.9882812,6.7441406 c 0.9075061,0.9075067 2.2732701,1.1786386 3.4589844,0.6875 1.1857163,-0.4911397 1.96094,-1.6501837 1.9609375,-2.9335937 a 0.26464845,0.26464845 0 1 0 -0.5292969,0 C 6.8789083,5.5689483 6.2354777,6.5335432 5.2460938,6.9433594 4.2567114,7.3531746 3.1185682,7.1263812 2.3613281,6.3691406 1.6040853,5.6118992 1.3792443,4.4757119 1.7890625,3.4863281 2.1988804,2.4969489 3.1615242,1.8515612 4.2324219,1.8515625 a 0.26464845,0.26464845 0 1 0 0,-0.5292969 z"
id="path5156"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 4.2327462,0.794 V 1.05858 2.11691 2.3815 h 0.2645833 c 0.052234,-1e-5 0.1033013,-0.0155 0.1467618,-0.0444 l 0.79375,-0.52916 c 0.157054,-0.10475 0.157054,-0.33554 0,-0.44028 l -0.79375,-0.52917 c -0.043461,-0.029 -0.094528,-0.0444 -0.1467618,-0.0444 h -0.0031 z"
id="path5158" />
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -1,68 +1,13 @@
subdir('icons')
desktop_conf = configuration_data()
desktop_conf.set('icon', application_id)
desktop_file = i18n.merge_file ('desktop-file',
type: 'desktop',
input: configure_file(
input: files('org.gnome.Podcasts.desktop.in.in'),
output: 'org.gnome.Podcasts.desktop.in',
configuration: desktop_conf
),
output: '@0@.desktop'.format(application_id),
po_dir: podir,
install: true,
install_dir: join_paths (datadir, 'applications')
)
desktop_file_validate = find_program('desktop-file-validate', required: false)
if desktop_file_validate.found()
test(
'validate-desktop',
desktop_file_validate,
args: [
desktop_file.full_path()
]
)
endif
appdata_conf = configuration_data()
appdata_conf.set('appid', application_id)
appdata_file = i18n.merge_file ('appdata-file',
input: configure_file(
input: files('org.gnome.Podcasts.appdata.xml.in.in'),
output: 'org.gnome.Podcasts.appdata.xml.in',
configuration: appdata_conf
),
output: '@0@.appdata.xml'.format(application_id),
po_dir: podir,
install: true,
install_dir: join_paths (datadir, 'metainfo')
)
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
test(
'validate-appdata', appstream_util,
args: [
'validate-relax', '--nonet', appdata_file.full_path()
]
)
endif
install_data('org.gnome.Podcasts.desktop', install_dir : datadir + '/applications')
install_data('org.gnome.Podcasts.appdata.xml', install_dir : datadir + '/appdata')
install_data('org.gnome.Podcasts.gschema.xml', install_dir: join_paths(datadir, 'glib-2.0', 'schemas'))
configure_file(
input: 'org.gnome.Podcasts.service.in',
output: '@0@.service'.format(application_id),
configuration: podcasts_conf,
install_dir: join_paths(datadir,'dbus-1', 'services')
)
podcasts_resources = gnome.compile_resources(
'resources',
'resources.xml',
gresource_bundle: true,
source_dir: meson.current_build_dir()
)
configure_file(input: 'org.gnome.Podcasts.service.in',
output: 'org.gnome.Podcasts.service',
configuration: podcasts_conf,
install_dir: join_paths([datadir,'dbus-1/services']))
meson.add_install_script('../../scripts/compile-gschema.py')

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
<id>org.gnome.Podcasts</id>
<name>Podcasts</name>
<project_license>GPL-3.0</project_license>
<metadata_license>CC0-1.0</metadata_license>
<developer_name>Jordan Petridis</developer_name>
<summary>Podcast app for GNOME</summary>
<description xml:lang="en">
<p>
Listen to your favorite podcasts, right from your desktop.
</p>
</description>
<url type="homepage">https://gitlab.gnome.org/World/podcasts</url>
<screenshots>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/home_view.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/shows_view.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/show_widget.png</image>
</screenshot>
</screenshots>
<releases>
<release version="0.4.2" date="2018-07-27"/>
</releases>
<url type="homepage">https://gitlab.gnome.org/World/podcasts</url>
<update_contact>jpetridis@gnome.org</update_contact>
<developer_name>Jordan Petridis and others</developer_name>
</component>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>@appid@</id>
<name>Podcasts</name>
<project_license>GPL-3.0</project_license>
<metadata_license>CC0-1.0</metadata_license>
<content_rating type="oars-1.1" />
<summary>Podcast app for GNOME</summary>
<description>
<p>
Listen to your favorite podcasts, right from your desktop.
</p>
</description>
<url type="homepage">https://gitlab.gnome.org/World/podcasts</url>
<screenshots>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/home_view.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/shows_view.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/World/podcasts/raw/master/screenshots/show_widget.png</image>
</screenshot>
</screenshots>
<releases>
<release version="0.4.7" date="2019-10-23">
<description>
<p>
Small release including OPML export functionality, partial support for premium feeds, a couple of bugfixes and overall life improvements.
</p>
</description>
</release>
<release version="0.4.6" date="2018-10-07">
<description>
<p>
After a month of work, the new version of Podcasts brings Desktop integration with MPRIS,
further UX polish, and a couple bugfixes and improvements.
Additionally existing translations were updated and 9 new were added.
</p>
<ul>
<li>Brazilian Portuguese, Swedish, Italian, Friulian, Hungarian, Croatian, Latvian, Czech and Catalan Translations were added.</li>
<li>The audio player now can integrate with Desktop Environments (MPRIS2)</li>
<li>Further UI and UX polishing and a handful bug fixes</li>
<li>Update to account for the GNOME 3.32 HIG changes</li>
<li>Openssl 1.1 support</li>
<li>Fixed a performance regression when updating RSS Feeds</li>
</ul>
</description>
</release>
<release version="0.4.5" date="2018-08-31">
<description>
<p>
Podcasts 0.4.5 brings a month of bug fixes, performance improvements and initial translations support.
</p>
<ul>
<li>Finish, Polish, Turkish, Spanish, German, Galician, Indonesian and Korean Translations were added.</li>
<li>Views now adapt better to different window sizes, thanks to libhandy HdyColumn</li>
<li>The update indacator was moved to an In-App notification</li>
<li>Performance improvements when loading Show Cover images.</li>
<li>Improved handling of HTTP Redirects</li>
</ul>
</description>
</release>
<release version="0.4.4" date="2018-07-31">
<description>
<p>
This is the first release available from Flathub!
</p>
</description>
</release>
</releases>
<kudos>
<kudo>ModernToolkit</kudo>
<kudo>HiDpiIcon</kudo>
</kudos>
<launchable type="desktop-id">@appid@.desktop</launchable>
<url type="homepage">https://wiki.gnome.org/Apps/Podcasts</url>
<url type="bugtracker">https://gitlab.gnome.org/World/podcasts/issues/</url>
<url type="donation">http://www.gnome.org/friends/</url>
<translation type="gettext">gnome-podcasts</translation>
<project_group>GNOME</project_group>
<update_contact>jpetridis@gnome.org</update_contact>
<developer_name>Jordan Petridis</developer_name>
</component>

View File

@ -0,0 +1,11 @@
[Desktop Entry]
Name=Podcasts
Comment=Listen to your favorite podcasts, right from your desktop.
Icon=org.gnome.Podcasts
Exec=gnome-podcasts
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;AudioVideo;Audio;
Keywords=Podcast;RSS;
DBusActivatable=true

View File

@ -1,13 +0,0 @@
[Desktop Entry]
Name=Podcasts
Comment=Listen to your favorite podcasts, right from your desktop.
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=@icon@
Exec=gnome-podcasts
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;AudioVideo;Audio;
# Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
Keywords=Podcast;RSS;
DBusActivatable=true

Some files were not shown because too many files have changed in this diff Show More